您的位置:首页 > 运维架构 > Linux

linux reset 分析

2013-11-27 22:02 453 查看
遇到个系统reset的问题,简单看了下kernel reset的代码,简单记录下:

简单看下log:

[ 25.900749] Restarting system with command 'recovery'.

[ 25.901449] arch_reset: cmd = recovery

[ 25.901981] wdt_arch_reset called@Kernel

//系统调用reboot

//参考:syscalls.h

asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd,

void __user *arg);

//参考:kernel/kernel/sys.c

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

void __user *, arg)

{

char buffer[256];

switch (cmd) {

case LINUX_REBOOT_CMD_RESTART:

kernel_restart(NULL);

break;

// 带参数的reboot ,如:recovery

case LINUX_REBOOT_CMD_RESTART2:

if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {

ret = -EFAULT;

break;

}

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

kernel_restart(buffer);

break;

......

}

// 架构无关的restart

void kernel_restart(char *cmd)

{

kernel_restart_prepare(cmd);

if (!cmd)

printk(KERN_EMERG "Restarting system.\n");

else

printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);

kmsg_dump(KMSG_DUMP_RESTART);

// 架构相关代码,ARM架构

machine_restart(cmd);

}

参考: kernel/arch/arm/kernel/process.c

void machine_restart(char *cmd)

{

machine_shutdown();

printk("Reboot:machine restart...\n");

// 刷新log到控制台,如实际调试中的串口

// 保证调试人员能读到最后的有用信息

arm_machine_flush_console();

arm_pm_restart(reboot_mode, cmd);

// 1秒内没有重启成功,则提示,并进入死循环

mdelay(1000);

printk("Reboot failed -- System halted\n");

while (1);

}

// 主要是导出堆栈信息,函数调用

// 关于dump_stack的实现可以参考:

void machine_shutdown(void)

{

#ifdef CONFIG_SMP

printk("machine_shutdown: start, Proess(%s:%d)\n", current->comm, current->pid);

dump_stack();

preempt_disable();

smp_send_stop();

printk("machine_shutdown: done\n");

#endif

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: