Linux kernel 關機的底層操作

2021-07-14 13:12:56 字數 1264 閱讀 6322

linux關機相關命令如:halt,shutdown,poweroff和reboot

其實它們底層都是呼叫名為reboot的system call,其具體實現是在核心目錄的kernel/sys.c中的

syscall_define4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg)這個函式裡,函式原型如下:

syscall_define4(reboot, int, magic1, int, magic2, unsigned int, cmd,

void __user *, arg)

buffer[sizeof(buffer) - 1] = '\0';

kernel_restart(buffer);

break;

#ifdef config_kexec

case linux_reboot_cmd_kexec:

ret = kernel_kexec();

break;

#endif

#ifdef config_hibernation

case linux_reboot_cmd_sw_suspend:

ret = hibernate();

break;

#endif

default:

ret = -einval;

break;

} mutex_unlock(&reboot_mutex);

return ret;

}

其中針對cmd有多個case,經過我在imx6平台上測試發現:

poweroff,halt和shutdown都是呼叫的 case linux_reboot_cmd_power_off

而reboot則是呼叫case linux_reboot_cmd_restart

這裡以poweroff為例,會依次進行如下呼叫:

-->kernel_power_off()                         //kernel/sys.c

-->kernel_shutdown_prepare   

-->migrate_to_reboot_cpu

-->syscore_shutdown

-->machine_power_off               // 該函式根據具體平台而定,arm平台在arch/arm/kernel/process.c檔案中

詳細可以參考這篇文章

關於linux kernel的死法

最近在除錯linux核心驅動,宕機無數次。關於linux的死法也有些心得。1 嘎嘣兒脆型。特點 啥提示也沒有,說宕就宕,var log messages 裡邊啥提示資訊也沒有。原因 八成是你自己沒玩兒好,在kernel裡邊記憶體越界了。還有兩成是超過了linux核心棧8k的限制。2 半死不活型。特點...

linux kernel 模組時鐘的用法

2012 01 31 14 27 7人閱讀 收藏 舉報 kernel 2.6.13各個模組時鐘的用法 2009 10 15 17 06 分類 驅動入門 逢山開路 遇水架橋,今天想自己寫個adc的驅動,發現不清楚系統各個模組的系統時鐘如何使用。總不能自己想怎麼弄,就怎麼弄吧,還是學學框架吧 使用時鐘的...

linux kernel中timer的使用

在kernel中如果想週期性的幹些什麼事情,或者某個特定時間幹些什麼事情,可以使用timer。例如像周期性地dump某段buffer的資料等等。先來看看使用方法。先定義乙個struct timer list的物件。eg struct timer list dump t 這個物件相當於乙個鬧鐘,其中包...