2024年3月31日发(作者:)
Android poweroff
流程详解
•
•
资料整理:程洪斌
2011
年
11
月
18
日
关机流程
android
系统都有一个关机按键,长按这个按键系统会进行关机操作。具体实现流程如下:
在
android
层通过系统调用
reboot
(
arg
)调用内核中的
sys_reboot,
具体流程如下:
reboot——>sys_reboot()——>kernel_power_off()——>machine_power_off()——>pm_power_off();
pm_power_off
是一个函数指针,他指向和具体硬件平台相关的关机操作函数。和
sys_reboot
相关的系统调
用在
source/kernel/sys.c
中实现,然后在
source/asm-arm/unistd.h
中添加系统调用号。然后在
source/arch/arm/kernel/entry-common.S
中对
sys_call_table(
系统调用表
)
进行定义,具体的表在
source/arch/arm/kernel/call.S
中实现。
Reboot
流程
Linux
下的关机和重启流程对于一般的桌面应用和网络服务器来说并不重要,但是在用户自己定义的
嵌入式系统内核中就有一定的研究意义,通过了解
Linux
关机重启的流程,我们对它可以修改和自定义,
甚至以此为基础开发出全新的功能来。
1.
概述
在
linux
下的关机和重启可能由两种行为引发,一是通过用户编程,一是系统自己产生的消息。用户和
系统进行交互的方式也有两个,一个是系统调用:
sys_reboot
,另一个就是
apm
或则
acpi
的设备文件,通
过对其操作也可以使系统关机或者重启。
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
完成了重启。
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
接口关机两种方法。
发布评论