Linux 关机重启流程分析

  linux下的关机和重启流程对于一般的桌面应用和网络服务器来说并不重要,但是在用户自己定义的嵌入式系统内核中就有一定的研究意义,通过了解Linux 关机重启的流程,我们对它可以修改和自定义,甚至以此为基础开发出全新的功能来。

  1.概述

  在linux下的关机和重启可能由两种行为引发,一是通过用户编程,一是系统自己产生的消息。用户和系统进行交互的方式也有两个,一个是系统调用:sys_reboot,另一个就是apm或则acpi的设备文件,通过对其操作也可以使系统关机或者重启。

#FormatImgID_0#

  2.通过系统调用sys_reboot的重启

  这个系统调用定义了一系列的MAGIC_NUMBER,在调用的开始部分首先检查MAGIC_NUMBER是否正确,只有正确才继续向下运行。在重启的时候转向分支

case LINUX_REBOOT_CMD_RESTART:

  首先使用notifier_call_chain向其它部分发出重启的消息,然后调用machine_restart函数完成重启。

  machine_restart 函数的开始部分有一段SMP相关的代码,主要完成多CPU时由一个CPU完成重启操作,其它CPU处于等待状态。之后系统根据一个变量 reboot_thru_bios的内容判断重启方式,通过阅读reboot_setup我们可以得知,这个参数的内容是在系统启动时指定的,决定了是否 利用bios,事实上是系统复位后的入口(FFFF:0000)地址的程序进行重启。在不通过bios进行重启的情况下,系统首先设定了重启标志,然后向 端口0xfe写入数字0x64,这种重启的具体原理我还不大清楚,似乎是模拟了一次reset键的按下,希望大家和我讨论。在通过bios重启的情况下, 系统同样先设定了重启模式,然后切换到了实模式,通过一条ljmp $0xffff,$0x0完成了重启。

#FormatImgID_1#

  3.通过系统调用sys_reboot进行关机

  在系统调用的处理分支上,我们可以看到,首先同样是检查MAGIC_NUMBER,然后在

case LINUX_REBOOT_CMD_POWER_OFF:

  的执行流程里面,又是使用 notifier_call_chain发出了关闭计算机电源的消息,紧接着执行了machine_power_off函数。我们在 machine_power_off函数中可以看到,如果pm_power_off这个函数指针不为空,那么系统就会通过调用这个函数进行关机。在apm 已经加载的情况下(SMP除外),实际上pm_power_off函数实际上指向了apm.c中的apm_power_off,在这个函数里系统通过 apm_info结构里的值,使用切换到实模式关机,或者使用apm_bios_call_simple函数调用保护模式下的apm接口关机两种方法。

#FormatImgID_2#

  4.apm驱动本身的关机过程

  apm使用其注册的设备的ioctl接口完成apm的操作,在apm.c的do_ioctl函数中可以看见处理的分支。这里只有suspend和standby的代码,所以我们不能通过ioctl这种方法使用apm关机。

  当 用户按下POWER开关的时候,如果有apm模块,那么关机流程是由apm来处理的。apm驱动在初始化的时候启动了一个apm内核线 程:apm_mainloop,系统会在这里检测到POWEROFF按键消息并且将其命名为APM_SYS_SUSPEND,以区别apm -s设置的APM_USER_SUSPEND模式。紧接着进入了apm_event_handler函数,又从apm_event_handler函数进 入了check_events函数,处理函数对应的case分支上。系统同样使用了suspend函数进行关机,不过由于其它参数的原因,suspend 最后调用的是关机的流程。本文由“www.zrnkyy.com”编辑

时间: 2024-08-05 10:56:38

Linux 关机重启流程分析的相关文章

linux关机重启命令浅析

linux关机重启命令 今天我们来介绍下linux系统中常用到的关机重启命令—shutdown.halt.reboot.poweroff以及init. shutdown命令 以安全的方式关闭系统或重启系统.它在系统关闭之前给系统上的所有登录用户提示一条警告信息.该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段. 命令格式 shutdown [OPTION]... TIME [MESSAGE] time 参数的格式可以有很多种.首先,可以是 hh:mm 格式的

linux关机重启五种方法(sysrq shutdown halt init ipmi)

linux关机重启五种方法(sysrq shutdown halt init) 当前版本 cat /etc/debian_version 5.0.1 一.linux关机命令(前三种) 1.shutdown -h now(-h:halt after shutdown.) halt init 0 2.linux重启命令 shutdown -r(-r:reboot after shutdown.) reboot init 6 二.特殊情况重启和关机(能ping通 上述命令无法使用情况下 也就是系统挂起

linux关机重启指令

linux系统关机重启常用指令: 1)将数据同步写入硬盘中的指令: sync 2) 惯用的关机指令: shutdown 3) 重新启动,关机: reboot, halt , poweroff 下面详细介绍一下上述指令的作用: sync: 所有的数据都得要被读入内存后才能够被 CPU 所处理,但是数据又常常需要由内存写回硬盘当中(例如储存的劢作). 由亍硬盘的速度太慢(相对亍内存来说),如果常常让数据在内存不硬盘中来回写入/读出,系统的效能就丌会太好.因此在 Linux 系统中,为了加忚数据的读取

Linux 关机/重启/注销命令

关机 shutdown -h 0       #<==O秒后关机 shutdown -h now     #<==现在关机 shutdown -h 10      #<==10分钟后关机 shutdown -h 23:20   #<==23:20分关机  shutdown -c         #<==取消shutdown关机命令 init 0              #<==立马关机(切换运行级别为0,推荐使用) halt                #<=

linux 关机/重启命令总结

linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法. 首先来看一下linux下比较常用的一些关机命令 关机命令: 1.halt   立刻关机 2.poweroff  立刻关机 3.shutdown -h now 立刻关机(root用户使用) 4.shutdown -h 10 10分钟后自动关机 如果是通过shutdown命令设置关机的话,可以用shutdown -

Linux关机重启命令

使用shutdown命令,参数如下: - k => 不执行任何关机操作,只发出警告信息给所有用户 - r => 重新启动计算机 - h => 关机并彻底断电 - f => 快速关机且重启动时跳过fsck - n => 快速关机不经过init程序 - c => 取消之前的定时关机 使用方法如下: 立即关机:sudo shutdown -h now 立即重启:sudo shutdown -r now 扩展方法: 10分钟后关机:sudo shutdown -h +10 在1

linux 关机重启命令

shutdown命令 shutdown [选项] 时间 -c  :  取消前一个关机命令 -h  :  关机 -r  :  重启 halt 命令 poweroff命令 init 0命令 reboot命令 init 6命令 logout命令退出命令

Linux内核启动流程分析(二)【转】

转自:http://blog.chinaunix.net/uid-25909619-id-3380544.html S3C2410 Linux 2.6.35.7启动分析(第二阶段) 接着上面的分析,第一阶段的代码跳转后,会进入第二阶段的代码. 第二阶段的代码是从\arch\arm\kernel\head.S开始的. 内核启动第二阶段主要完成的工作有,cpu ID检查,machine ID(也就是开发板ID)检查,创建初始化页表,设置C代码运行环境,跳转到内核第一个真正的C函数startkerne

Linux内核源码分析--内核启动之zImage自解压过程

copy from:https://www.cnblogs.com/pengdonglin137/p/3838245.html 阅读目录(Content) zImage来历 piggy.gz压缩文件的特点 vmlinux.lds arch/arm/boot/compressed/head.S arch/arm/boot/compressed/misc.c arch/arm/boot/compressed/decompressed.c lib/decompress_inflate.c 参考: ht