Android suspend-to-mem 流程分析

本文详细介绍了OMAP4460平板设备在Android系统下的深度休眠流程,从启动到结束的各个环节进行了深入分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 实验平台

cpu: omap4460 blaze tablet

memory: 1-GB DRAM

OS: android 4.0.3, kernel 3.0.31


2.流程分析

1). echo "mem" > /sys/power/state
2). state_store() kernel/power/main.c  
3). request_suspend_states(PM_SUSPEND_MEM)  kernel/power/earlysuspend.c
4). queue_work(suspend_work_queue, &early_suspend_work)  kernel/power/earlysuspend.c 
          early_suspend() 
              // call device driver's early-suspend function to turn off multi-touch, LCM, frame buffer,sensors,release "main" wakelock
5). wake_unlock(&main_wake_lock)  kernel/power/wakelock.c  
          // if system has no activate wakelock,call kernel/power/wakelock.c suspend() start suspend progress.
6). queue_work(suspend_work_queue, &suspend_work);
7). suspend()
          sys_sync()
              pm_suspend()  
                  // here enter suspend
                  // return from this function means exit suspend(resume)

8). pm_suspend(PM_SUSPEND_MEM)
          enter_state()
              sys_sync()
           suspend_prepare()
               pm_notifier_call_chain(PM_SUSPEND_PREPARE)        
               suspend_freeze_processes()
                   freeze_processes() kernel/power/process.c
                       //  the same as hibernation process to freeze user space process and task in kernel
           pm_restrict_gfp_mask()
              //  avoid i/o and fs to allocate memory during suspend progress
              //  clear bit GFP_IOFS of gfp_allowed_mask
           suspend_devices_and_enter()
               omap4_pm_begin()  arch/arm/mach-omap2/pm44xx.c 
                   suspend_prepare() drivers/regulator/core.c
                       // regulator linked with regulator_list     
               suspend_console()
               dpm_suspend_start(PMSG_SUSPEND)
                   dpm_prepare(PMSG_SUSPEND)  drivers/base/power/main.c
                       // execute ->prepare() callback for all non-sysdev devices, device list movement dpm_list-->dpm_prepared_list
                   dpm_suspend(PMSG_SUSPEND)
                       // execute ->suspend() callback for all non-sysdev devices, device list movement dpm_prepared_list-->dpm_suspended_list                
               suspend_enter()
                   dpm_suspend_noirq(PMSG_SUSPEND)
                       // execute "late suspend"
                       suspend_device_irqs() kernel/irq/pm.c
                           // disable all currently enabled interrupt lines
                           // after this function, device will can't receive interrupt
                       device_suspend_noirq()   
                           // execute -->suspend_noirq callback for all non-sysdev devices, device list movement dpm_suspended_list-->dpm_noirq_list                       
                   disable_nonboot_cpus()
                   arch_suspend_disable_irqs() kernel/power/suspend.c
                       local_irq_disable()
                           // disable local cpu interrupt,so there will no interrtup from now on
                   syscore_suspend()  driver/base/syscore.c
                       // Execute all the registered system core suspend callbacks
                       check_wakeup_irqs() kernel/irq/pm.c
                           // check if any wakeup interrupts are pending, if ture, exit suspend
                       // then to execute sysdev's suspend callback, all sysdev are linked with syscore_ops_list      
                   omap4_pm_enter() arch/arm/mach-omap2/pm4xx.c
                       omap2_pm_wakeup_on_timer() arch/arm/mach-omap2/pm-debug.c
                           //  setup a hareware timer if debug enabled
                       omap4_configure_pwrst(off_mode_enabled)
                           // Program all powerdomain(except cpu0_pwrdm and cpu1_pwrdm) to required power domain state
                           // powerdomain linked with pwrst_list
                           // off_mode_enabled = 1
                       omap4_device_set_state_off(1)
                           // setup device off state   
                       omap4_enter_sleep()
                           pwrdm_clear_all_prev_pwrst() 
                               //Clear the powerdomain's previous power state
                           omap4_device_clear_prev_off_state()   
                           pwrdm_read_next_pwrst()
                               //get next powerdomain power state
                           omap2_gpio_prepare_for_idle()
                               omap2_gpio_set_wakeupenables()
                                   // enable wakeup gpio in the list omap_gpio_list
                       omap4_print_wakeirq()
                           // resuming. 
                           // Print wakeup interrupt for debug
                       xxxxxxx     
               
                
                
                
               


Android系统本身并不直接支持"STR(Suspend-to-RAM)"模式的关机操作,这是因为它是一个移动操作系统,主要关注的是电池续航和快速启动。通常情况下,当手机进入睡眠状态或待机时,它会切换到低功耗模式,而不是完全关机并保存所有数据到RAM。 然而,如果你想要模拟类似的功能,例如在应用层面暂时停止服务而保留内存中的数据,你可以创建一个自定义的应用行为管理器,通过Service或JobScheduler来控制任务暂停和恢复。这里提供一个简单的示例,展示如何在Service中实现“假关机”: ```java public class MyService extends Service { private boolean isSuspended = false; @Override public void onStartCommand(Intent intent, int flags, int startId) { // 检查是否需要暂停服务 if (isSuspended) { stopSelf(); } else { // 服务正常运行... } } public synchronized void suspendToRam() { isSuspended = true; // 实现"假关机"逻辑,比如清理无用资源,更新UI指示等 updateUi("正在暂停..."); // 将自身从后台停止,但不销毁 stopSelf(); } public synchronized void resumeFromRam() { isSuspended = false; // 当用户恢复需求时,重新启动服务 Intent restartIntent = new Intent(this, MyService.class); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getService(this, 0, restartIntent, 0); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent); // 5秒后重启 } // 其他必要的Service方法... // 更新UI的部分通常是UI线程操作,确保在这里处理 private void updateUi(String message) { runOnUiThread(new Runnable() { @Override public void run() { // 设置UI显示暂停状态 //... } }); } } ``` 请注意,这只是一个基本示例,并非真正的STR模式,因为Android设备实际关机过程由硬件管理和OS内核控制。此外,由于隐私和性能原因,应用程序不应该尝试强制停止核心服务或改变系统的整体状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值