Linux kernel 关机的底层操作
来源:互联网 发布:罗马尼亚铁卫电影 知乎 编辑:程序博客网 时间:2024/06/08 12:52
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){struct pid_namespace *pid_ns = task_active_pid_ns(current);char buffer[256];int ret = 0;/* We only trust the superuser with rebooting the system. */if (!ns_capable(pid_ns->user_ns, CAP_SYS_BOOT))return -EPERM;/* For safety, we require "magic" arguments. */if (magic1 != LINUX_REBOOT_MAGIC1 || (magic2 != LINUX_REBOOT_MAGIC2 && magic2 != LINUX_REBOOT_MAGIC2A &&magic2 != LINUX_REBOOT_MAGIC2B && magic2 != LINUX_REBOOT_MAGIC2C))return -EINVAL;/* * If pid namespaces are enabled and the current task is in a child * pid_namespace, the command is handled by reboot_pid_ns() which will * call do_exit(). */ret = reboot_pid_ns(pid_ns, cmd);if (ret)return ret;/* Instead of trying to make the power_off code look like * halt when pm_power_off is not set do it the easy way. */if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)cmd = LINUX_REBOOT_CMD_HALT;mutex_lock(&reboot_mutex);switch (cmd) {case LINUX_REBOOT_CMD_RESTART:kernel_restart(NULL);break;case LINUX_REBOOT_CMD_CAD_ON:C_A_D = 1;break;case LINUX_REBOOT_CMD_CAD_OFF:C_A_D = 0;break;case LINUX_REBOOT_CMD_HALT:kernel_halt();do_exit(0);panic("cannot halt");case LINUX_REBOOT_CMD_POWER_OFF:kernel_power_off();do_exit(0);break;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;#ifdef CONFIG_KEXECcase LINUX_REBOOT_CMD_KEXEC:ret = kernel_kexec();break;#endif#ifdef CONFIG_HIBERNATIONcase LINUX_REBOOT_CMD_SW_SUSPEND:ret = hibernate();break;#endifdefault: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文件中
详细可以参考这篇文章http://www.wowotech.net/linux_kenrel/reboot.html
0 0
- Linux kernel 关机的底层操作
- linux 关机操作
- git操作Linux kernel
- 文本操作的底层
- linux文件锁详解(设计文件很底层的操作)
- linux文件锁详解(设计文件很底层的操作)
- linux文件锁详解(设计文件很底层的操作)
- linux文件锁详解(设计文件很底层的操作)
- linux文件锁详解(设计文件很底层的操作)
- Linux的关机流程
- Linux的正常关机
- Linux的关机方法
- Linux Kernel input ev操作
- Android Framework应用框架层和HAL硬件抽象层以及Linux Kernel底层之间的关系
- Android Framework应用框架层和HAL硬件抽象层以及Linux Kernel底层之间的关系
- kernel 调用uefi的run time service 关机
- Linux学习记录--关机相关操作
- linux系统关机、重启操作
- Android进阶之通用RecyclerView适配器打造方法
- 最新ffmpeg编译和用eclipse进行源码调试
- iOS 观察者设计模式
- java多线程和并发库 学习笔记草稿
- 指纹识别与指静脉识别在市场应用的情况
- Linux kernel 关机的底层操作
- iOS 记录crash日志
- Unity的Android打包(Sqlite数据库使用)
- 调用优酷视频api
- 【Android实战】EventBus 更少的代码 更好的体验
- 起点
- 动态代理
- hdu 1050 Moving Tables
- 软件著作权和商业秘密权