目錄:
linux
關機和重啟機制 一.
sys_reboot
二.apm capi
linux
下的關機和重啟可能由兩種行為引發,一是通過使用者程式設計,另外一種是系統自己產生的資訊。使用者和系統進行互動的方式有兩種,一種是系統呼叫
sys_reboot
,另外乙個則是
apm或者
acpi
的裝置檔案,通過對其操作也可以是系統關機或者重啟。
linux
下關機和重啟命令主要有,
shutdown
,reboot
,halt,poweroff,telinit,
和init
。對於
poweroff
和reboot
是halt
的符號鏈結,不過最終都呼叫
reboot
系統呼叫來完成關機和重啟操作,該部分**在
kernel/sys.c中。
在呼叫sys_reboot
時,應該注意一點,
reboot doesn't sync: do that yourself before calling this.
所以在使用之前應該手動
sync
命令同步磁碟。
該函式流程如下, i)
檢查呼叫者是否有合法呼叫
reboot
的許可權。
ii)通過魔數
magic1
和magic2
,判斷reboot
系統呼叫是不是被偶然呼叫的。
iii)
對不同的呼叫使用情況區分,如
linux_reboot_cmd_restart, //restarting system
linux_reboot_cmd_hatl,// system halted
linux_reboot_cmd_power_off //power down
linux_reboot_cmd_restart2 //
接收命令字元
說明系統該如何關閉
linux_reboot_cmd_cad_on/off //
用於決定是否允許
ctrl+alt+del
組合鍵用於關閉並重啟系統。
如果想禁止這個功能,可以在
/etc/inittab
檔案的下面一行注釋掉
ca:12345:ctrlatldel:/sbin/shutdown –tl –a –r now
當然對於
arm體系來說,用到的可能性較少
a) shutdown
對於restart
而言,首先需要通過
blocking_notifier_call_chain
這一通知機制,將掛在
reboot_notifier_list
上,對於
reboot
操作需要通知的裝置進行訊息通知。
接著通知所有的驅動匯流排(包括
i2c,usb,spi,platform
等bus
),如果匯流排本身有
shutdown
操作,則先呼叫匯流排的
shutdown
操作,否則逐一呼叫匯流排上對應裝置驅動的
shutdown
方法,接著清空
sys檔案系統(根據驅動模型思考
,device_shutdown)
然後與上述描述類似的,進行
shut down all system device,
同樣呼叫的是
shutdown
方法。
最後呼叫
machine_start
,也就是
arm_pm_restart,
即arm_machine_start
進行重啟操作。
b) arm_machine_start
實際上最終呼叫的是
arch_reset
,對於不同的
cpu,呼叫的
arch_reset
不同。
對於x86
而言,開始部分有一段
smp相關的**,主要完成多
cpu時,乙個
cpu完成重啟,而其他
cpu處於等待的狀態。之後根據變數
reboot_thru_bios
的內容判斷重啟方式,這個引數是
reboot_setup
指定的。在通過
bios
重啟的情況下,系統同樣先設定重啟模式,然後切換到實模式,通過
ljmp $0xffff,$0x0
完成重啟。 對於
arm mx25
而言,相對簡單,
arch_reset
最後呼叫
mxc_wd_reset
函式,該函式中,通過使能
wacht dog
時鐘,使能
wdog,
並且設定
watch dog ctrl reg
的srs
位,即software reset signal
,讓wdog
產生乙個
reset signal
,從而實現
reset
操作。(而接下來的就是
arm啟動流程)
power_off
準備操作與
resetart
類似,shutdown
結束後,最後呼叫的
pm_board_off,
該方法可以在板級初始化的時候進行指定。
a) arm 在
machine_power_off
中,如果定義了
pm_board_off
方法則會呼叫該函式關機,根
據體系不同設定,操作一般為拉低口線之類的操作。
b) apm x86
而如果在
apm已經載入的情況下(在
arm中沒有,
x86中實現),實際指向的是
apm_power_off
,在該函式裡系統通過
apm_info
結構裡的值,使用切換到實模式關機,或者使用
apm_bios_call_******
函式呼叫保護模式下的
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
最後呼叫的是關機的流程。
linux關機和重啟
shutdown 選項 時間 c 取消前乙個關機指令 h 關機 r 重啟 shutdown r 05 40 會在指定時間重啟計算機。shutdown r 05 40 加 符表示命令在後台執行,不阻塞當前終端 halt poweroff init 0這三個關機命令都不安全。不會儲存當前服務 reboo...
Linux 關機和重啟
目錄 關機和重啟 sync 資料同步 shutdown 命令 reboot 命令 halt 和 poweroff 命令 init 命令 命令的基本格式如下 root localhost shutdown 選項 時間 警告資訊 root localhost reboot 重啟 root localho...
linux 關機和重啟命令
linux中常用的關機和重新啟動命令有shutdown halt reboot以及init,它們都可以達到關機和重新啟動的目的,但是每個命令的內部工作過程是不同的,下面將逐一進行介紹。1 shutdown shutdown命令用於關閉linux系統。有些使用者會使用直接斷掉電源的方式來關閉linux...