linux 關機和重啟 機制

2021-05-26 05:51:09 字數 3887 閱讀 3435

目錄:

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...