当前位置:网站首页>Kernel函数解析之kernel_restart
Kernel函数解析之kernel_restart
2022-08-04 22:50:00 【szembed】
该函数实现在kernel/reboot.c中,主要功能为重新启动kernel,比如发现kernel进入到了一个异常场景,此时我想重启kernel,那么该函数就可以调用。
-
void
kernel_restart(
char *cmd)
-
{
-
kernel_restart_prepare(cmd);
-
migrate_to_reboot_cpu();
-
syscore_shutdown();
-
if (!cmd)
-
pr_emerg(
"Restarting system\n");
-
else
-
pr_emerg(
"Restarting system with command '%s'\n", cmd);
-
kmsg_dump(
KMSG_DUMP_SHUTDOWN);
-
machine_restart(cmd);
-
}
那么接下来 我们解析下该函数的实现过程,该函数中,总共调用了5个函数:
- kernel_restart_prepare(cmd)
-
void kernel_restart_prepare( char *cmd)
-
{
-
blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
-
system_state = SYSTEM_RESTART;
-
usermodehelper_disable();
-
device_shutdown();
-
}
主要功能为回调注册到reboot_notifier_list链表中的回调函数,因为有部分模块,需要在重启系统前做一些模块相关的工作,举个简单的例子,比如系统要重启时edma正在搬移数据,那么回调后可以把EDMA停下来,以防止系统挂死。
-
- migrate_to_reboot_cpu();
-
void migrate_to_reboot_cpu( void)
-
{
-
/* The boot cpu is always logical cpu 0 */
-
int cpu = reboot_cpu;
-
-
cpu_hotplug_disable();
-
-
/* Make certain the cpu I'm about to reboot on is online */
-
if (! cpu_online(cpu))
-
cpu = cpumask_first(cpu_online_mask);
-
-
/* Prevent races with other tasks migrating this task */
-
current->flags |= PF_NO_SETAFFINITY;
-
-
/* Make certain I only run on the appropriate processor */
-
set_cpus_allowed_ptr(current, cpumask_of(cpu));
-
}
该函数主要是把当前调用重启接口的任务,绑定到固定的一个CPU上,通常为当前online的序号排第一的CPU。此处不用纠结为什么绑定到第一个online的而不是第二个第三个,主要原因一是为了简单,二是防止在重启时再有什么任务迁移。
-
- syscore_shutdown()
-
/**
-
* syscore_shutdown - Execute all the registered system core shutdown callbacks.
-
*/
-
void syscore_shutdown( void)
-
{
-
struct syscore_ops *ops;
-
-
mutex_lock(&syscore_ops_lock);
-
-
list_for_each_entry_reverse(ops, &syscore_ops_list, node)
-
if (ops->shutdown) {
-
if (initcall_debug)
-
pr_info( "PM: Calling %pS\n", ops->shutdown);
-
ops->shutdown();
-
}
-
-
mutex_unlock(&syscore_ops_lock);
-
}
回调所有注册syscore shutdown回调的回调函数,通常注册syscore的回调有3个:suspend\resume\shutdown,其中suspend和resume在低功耗流程中调用,shutdown则在此处调用。
-
- kmsg_dump(KMSG_DUMP_SHUTDOWN);
回调注册到dump_list中的dump回调,注册的模块可能会保存一些自己关心的数据。
在这里也简单说下传参:
enum kmsg_dump_reason {
KMSG_DUMP_UNDEF,
KMSG_DUMP_PANIC,
KMSG_DUMP_OOPS,
KMSG_DUMP_EMERG,
KMSG_DUMP_SHUTDOWN,
KMSG_DUMP_MAX
};
可以根据重启的不同场景,然后传递对应的重启原因。 - machine_restart(cmd);
-
void machine_restart( char *cmd)
-
{
-
local_irq_disable();
-
smp_send_stop();
-
-
if (arm_pm_restart)
-
arm_pm_restart(reboot_mode, cmd);
-
else
-
do_kernel_restart(cmd);
-
-
/* Give a grace period for failure to restart of 1s */
-
mdelay( 1000);
-
-
/* Whoops - the platform was unable to reboot. Tell the user! */
-
printk( "Reboot failed -- System halted\n");
-
while ( 1);
-
}
函数实现在arch/arm/kernel/reboot.c中,我们首先可以看到,复位cpu会通过smp_send_stop接口把其他cpu停下来,然后调用重启接口重启系统。
-
边栏推荐
- Use ngrok to optimize web pages on raspberry pi (1)
- 测试薪资这么高?刚毕业20K,仅需3.5个月
- 【2020】【论文笔记】超表面:多功能和可编程——
- 使用cpolar优化树莓派上的网页(1)
- The Record of Reminding myself
- Redisson
- I was rejected by the leader for a salary increase, and my anger rose by 9.5K after switching jobs. This is my mental journey
- One trick to cure pycharm DEBUG error UnicodeDecodeError: 'utf-8' codec can't decode
- 论文解读(PPNP)《Predict then Propagate: Graph Neural Networks meet Personalized PageRank》
- Linux系统重启和停止Mysql服务教程
猜你喜欢
赶紧进来!!!教你C语言实现扫雷小游戏(文章最后有源码!!!)
亿流量大考(3):不加机器,如何抗住每天百亿级高并发流量?
postman接口测试
最温馨的家园
Deep Learning RNN Architecture Analysis
Using ngrok to optimize web pages on raspberry pi (2)
Latex快速插入作者ORCID
正则表达式绕过
三个多月、40余场面试浓缩为6000字
地面高度检测/平面提取与检测(Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clu)
随机推荐
【3D建模制作技巧分享】ZBrush模型制作流程:地精
If you can't get your heart, use "distributed lock" to lock your people
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
视频gif如何制作?试试这个视频制作gif神器
Latex fast insert author ORCID
最温馨的家园
【项目实战】仿照Room实现简单管理系统
VC bmp文件总结
Will we still need browsers in the future?(feat. Maple words Maple language)
【游戏建模模型制作全流程】在ZBrush中雕刻恶魔城男性角色模型
【模拟面试-10年工作】项目多一定是优势吗?
老叶的三束玫瑰
【3D建模制作技巧分享】ZBrush如何设置笔刷快捷键
Based on the results of the facts
从“草原牛”到“数字牛”:蒙牛的数字化转型之道
学生管理系统架构设计
3D建模师为了让甲方爸爸过稿,还可以这么做,就是在赚血汗钱啊
【内存操作函数内功修炼】memcpy + memmove + memcmp + memset(四)
enumerate()函数
360市值四年蒸发3900亿,政企安全能救命吗?