Linux暂停/恢复代码流程(在Android手机上)

时间:2012-11-07 01:32:59

标签: android linux linux-device-driver resume suspend

有没有人知道关于android / linux暂停/恢复的整个过程和代码流程的任何好的阅读(按下手机上的结束键后)? 我想了解并阅读相关的代码和文件。

或者,也许有人可以指点我看代码......

2 个答案:

答案 0 :(得分:11)

我希望我能帮忙。

  
    

Android基于Linux,因此基本与Linux Suspend Resume的基本或多或少相同。     几乎没有其他功能,最重要的是 Wakelocks 提前暂停,这些功能被添加到移动设备中,PDA因电池有限而更加省电。

  

现在让我们从你问的问题开始吧: 只要按下电源按钮,就会触发明显的中断,从而启动序列。

差异:您应该注意到,只要按下电源按钮,LCD和触摸就会进入睡眠状态。它们 early_suspend 。设备可能正常运行,只需耗电量最大的LCD,触摸就会进入睡眠状态。然后在背景中检查 Wakelocks ,是否有人正在获取,就好像有人正在获取然后执行那些待处理的任务。

常见:然后同步文件系统(RAM - > NAND)并冻结进程。然后设备暂停,然后保存CPU状态然后它休眠。序列在Linux和Android中都很常见。

在Android接收event.POWER并确认没有wake_lock存在,Android 通过echo mem > /sys/power/state

触发内核中的挂起流

state_store>> pm_suspend>> enter_state>> suspend_prepare>> suspend_devices_and_enter>> dpm_suspend_start>> dpm_suspend>> device_suspend>> __device_suspend ---> suspend_enter(在__device_suspend完成后由suspend_device_and_enter调用)

以上序列存在于Linux和Android中。

文件: suspend.c,(kernel / power /) wakelock.c,main.c(drivers / base / power)。

注意:所有特定于SoC的挂起回调,如enter,valid,begin,都存在于arch / arm /<中的pm.c中。文件夹中。

答案 1 :(得分:0)

关于暂停/恢复代码流(在Android手机上)是一个很大的话题。内核中的代码流已经被shingaridavesh所描述。

还有什么内核专用接口(机制)可以将系统挂起到Android。但是大多数控制逻辑(策略)都在Android系统的PowerManagerService中。我希望这能帮助您了解在按下电源键后系统真正做了什么。

1。报告PowerKey

  1. 通过内核中的输入系统报告电源键事件,可能是这样的:(直到你的SoC平台)

    input_report_key(powerkeydev,KEY_POWER,1); input_sync(powerkeydev); msleep(1); input_report_key(powerkeydev,KEY_POWER,1); input_sync(powerkeydev);

    KEY_POWER = 116在include / uapi / linux / input.h中定义

  2. android中的键码映射 机器人/框架/碱/数据/键盘/ Generic.kl 机器人/框架/天然的/包括/输入/ KeycodeLables.h

  3. 拦截Key事件 安卓/框架/基/服务/核心/ JAVA / COM / Anroid的/服务器/政策/ PhoneWindowManager.java interceptKeyBeforeQueueing()>> interceptPowerKeyUp()>> powerPress()>> powerPress>> case SHORT_PRESS_POWER_GO_TO_SLEEP>> mPowerManager.goToSleep

  4. 管理PowerManagerService中的唤醒锁: PowerManager.java:goToSleep() - > mService.goToSleep() PowerManagerService.java:goToSleep() - > goToSleepInternal - > goToSleepNoUpdateLocked() - > updatePowerStateLocked() - > updateSuspendBlockerLocked()(清除唤醒锁

  5. 2。 libsuspend触发暂停

    1. suspend_thread_func check应该每100ms暂停一次。在所有唤醒锁定清除之后:

      <强>机器人/系统/核心/ libsuspend / autosuspend.c: suspend_thread_func() - &gt; write(state_fd,sleep_state,strlen(sleep_state))

    2. 这个menes: echo&#34; mem&#34; &GT; / sys / power / state ,它触发内核中的挂起流。

      3。如何设置自动挂起线程?

      线程suspend_thread_func()由:

      创建
      1. init autosuspend

        android / system / core / libsuspend / autosuspend.c: int autosuspend_enable(void)

      2. 在jni中调用autosuspend

        <强>机器人/框架/碱/服务/型芯/ JNI / com_android_server_power_PowerManagerService.cpp: autosuspend_enable() - &gt; nativeSetAutoSuspend()

      3. 通过PowerManagerService初始化

        android / services / core / java / com / android / server / power / PowerManagerService.java: nativeSetAutoSuspend(boolean enable);