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

接口关机两种方法。