Linux 關機重啟流程分析

2021-05-23 06:26:38 字數 2884 閱讀 9747

下的關機和重啟流程對於一般的桌面應用和網路來說並不重要,但是在使用者自己定義的系統核心中就有一定的研究意義,通過了解linux 關機重啟的流程,我們對它可以修改和自定義,甚至以此為基礎開發出全新的功能來。

1.概述

在linux 下的關機和重啟可能由兩種行為引發,一是通過使用者程式設計,一是系統自己產生的訊息。使用者和系統進行互動的方式也有兩個,乙個是系統呼叫:sys_reboot,另乙個就是apm或則acpi的裝置檔案,通過對其操作也可以使系統關機或者重啟。

2.通過系統呼叫sys_reboot的重啟

這個系統呼叫定義了一系列的magic_number,在呼叫的開始部分首先檢查magic_number是否正確,只有正確才繼續向下執行。在重啟的時候轉向分支

case linux_reboot_cmd_restart:

首先使用notifier_call_chain向其它部分發出重啟的訊息,然後呼叫machine_restart函式完成重啟。

machine_restart函式的開始部分有一段smp相關的**,主要完成多cpu時由乙個cpu完成重啟操作,其它cpu處於等待狀態。之後系統根據乙個變數reboot_thru_bios的內容判斷重啟方式,通過閱讀reboot_setup我們可以得知,這個引數的內容是在系統啟動時指定的,決定了是否利用bios,事實上是系統復位後的入口(ffff:0000)位址的程式進行重啟。在不通過bios進行重啟的情況下,系統首先設定了重啟標誌,然後向埠0xfe寫入數字0x64,這種重啟的具體原理我還不大清楚,似乎是模擬了一次reset鍵的按下,希望大家和我討論。在通過bios重啟的情況下,系統同樣先設定了重啟模式,然後切換到了實模式,通過一條ljmp $0xffff,$0x0完成了重啟。

3.通過系統呼叫sys_reboot進行關機

在系統呼叫的處理分支上,我們可以看到,首先同樣是檢查magic_number,然後在

case linux_reboot_cmd_power_off:

的執行流程裡面,又是使用notifier_call_chain發出了關閉計算機電源的訊息,緊接著執行了machine_power_off函式。我們在machine_power_off函式中可以看到,如果pm_power_off這個函式指標不為空,那麼系統就會通過呼叫這個函式進行關機。在apm已經載入的情況下(smp除外),實際上pm_power_off函式實際上指向了apm.c中的apm_power_off,在這個函式裡系統通過apm_info結構裡的值,使用切換到實模式關機,或者使用apm_bios_call_******函式呼叫保護模式下的apm介面關機兩種方法。

4.apm驅動本身的關機過程

apm使用其註冊的裝置的ioctl介面完成apm的操作,在apm.c的do_ioctl函式中可以看見處理的分支。這裡只有suspend和standby的**,所以我們不能通過ioctl這種方法使用apm關機。

當使用者按下power開關的時候,如果有apm模組,那麼關機流程是由apm來處理的。apm驅動在初始化的時候啟動了乙個apm核心執行緒:apm_mainloop,系統會在這裡檢測到poweroff按鍵訊息並且將其命名為apm_sys_suspend,以區別apm -s設定的apm_user_suspend模式。緊接著進入了apm_event_handler函式,又從apm_event_handler函式進入了check_events函式,處理函式對應的case分支上。系統同樣使用了suspend函式進行關機,不過由於其它引數的原因,suspend最後呼叫的是關機的流程。

5.解決問題例項

1)按power鍵時某些主機板宕機

經查只有某些特定的驅動裝載之後才會出現這樣的情況,並且當使用關機系統呼叫sys_reboot的時候沒有這樣的問題。分析apm的處理流程,懷疑是在關機前驅動程式沒有正確處理apm發出的詢問訊息造成的。由於部分驅動程式沒有源**,決定hack掉apm.c的關機部分,讓兩種方式的關機走同樣的流程。於是把apm.c的check_events函式中對apm_sys_suspend部分改寫為如下**:

ret = exec_usermodehelper(poweroff_helper_path, argv, envp);

if (ret)

break;

for fast reboot support

static unsigned char fast_reboot_switch =

; 系統就可以切換到實模式中,然後跳轉到7000h:0位置開始執行。

6.acpi概述

在2.4.20核心中acpi模組被註明為試驗和未完成,裡面有一部分功能也許沒有實現。如果apm和apci兩個模組同時編譯進核心,apm在acpi前被載入,apm起作用使acpi退出。對於系統電量、電源實踐一類的支援(主要是在筆記本上有用),靠的是acpid這個daemon程式。

沒有乙個功能類似apm的應用程式切換狀態,acpi的程式僅僅完成了對acpi狀態的查詢。使用者實現s0-s4的功能可以直接向/proc/acpi/sleep檔案中寫入數字來實現。通過讀出(cat)其中的內容可以知道系統到底支援那些模式。

acpi模組的源**主程式在linux/drivers/acpi/driver.c中,如果向sleep檔案寫東西,就轉到了linux/drivers/acpi/ospm/system/sm_osl.c檔案的sm_osl_proc_write_sleep函式中,這個函式後來呼叫了sm_osl_suspend函式。在這個函式裡完成了各種功能,包括保護各種狀態。最後真正的sleep是通過對acpi_enter_sleep_state的呼叫完成的,這個函式在linux/drivers/acpi/hardware/hwsleep.c檔案中,這裡寫了acpi的暫存器使系統進入sleep狀態。寫暫存器的指令在這個目錄下面的hwregs.c中。

7.總結

本文對acpi的介紹非常簡略,實際上acpi必定會成為將來linux核心中首選的電源管理方式。由於目前官方**中acpi版本較低,所以沒有太詳細的論述,希望將來的核心能有所改變。

Linux 關機重啟流程分析

1.概述 在linux下的關機和重啟可能由兩種行為引發,一是通過使用者程式設計,一是系統自己產生的訊息。使用者和系統進行互動的方式也有兩個,乙個是系統調 用 sys reboot,另乙個就是apm或則acpi的裝置檔案,通過對其操作也可以使系統關機或者重啟。2.通過系統呼叫sys reboot的重啟...

linux下的關機和重啟流程

linux下的關機和重啟流程 1.概述 在linux下的關機和重啟可能由兩種行為引發,一是通過使用者程式設計,一是系統自己產生的訊息。使用者和系統進行互動的方式也有兩個,乙個是系統呼叫 sys reboot,另乙個就是apm或則acpi的裝置檔案,通過對其操作也可以使系統關機或者重啟。2.通過系統呼...

linux重啟,關機命令

重啟命令 root使用者使用 1 reboot 2 shutdown r now 立刻重啟 3 shutdown r 10 過10分鐘自動重啟 4 shutdown r 20 35 在時間為20 35時候重啟 如果是通過shutdown命令設定重啟的話,可以用shutdown c命令取消重啟 關機命...