当前位置:网站首页>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停下来,然后调用重启接口重启系统。
-
边栏推荐
- 【游戏建模模型制作全流程】在ZBrush中雕刻恶魔城男性角色模型
- Both synchronized and ReentrantLock are smooth, because they are reentrant locks, and a thread will not deadlock if it takes the lock multiple times. We need reentrant locks
- typeScript-部分应用函数
- 软测人面试 ,HR 会问到哪些问题?学会涨薪3000+
- PAN3020 Sub-1G无线收发芯片
- Will we still need browsers in the future?(feat. Maple words Maple language)
- Shell编程之循环语句与函数的使用
- Since a new byte of 20K came out, I have seen what the ceiling is
- 应用联合、体系化推进。集团型化工企业数字化转型路径
- Go 编程语言(简介)
猜你喜欢
随机推荐
Charles & TCPDump & Fiddler 抓包三兄弟七夕联手,还抓不到你的心?
线性DP(下)
Use ngrok to optimize web pages on raspberry pi (1)
【内存操作函数内功修炼】memcpy + memmove + memcmp + memset(四)
Linear DP (bottom)
JVM内存配置参数GC日志
Go 编程语言(简介)
PHP(3)
Acwing3593. 统计单词
【字符串函数内功修炼】strncpy + strncat + strncmp(二)
祝福一路顺风
MQTT[一]基础知识介绍
一招包治pycharm DEBUG报错 UnicodeDecodeError: ‘utf-8‘ codec can‘t decode
中国的顶级黑客在国际上是一个什么样的水平?
2022七夕程序员必备的表白黑科技(七夕限定款)
go语言的time包介绍
地面高度检测/平面提取与检测(Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clu)
基于内容的图像检索系统设计与实现--颜色信息--纹理信息--形状信息--PHASH--SHFT特征点的综合检测项目,包含简易版与完整版的源码及数据!
good luck
enumerate()函数