1.Kswapd 源码解析
2.androidåLinuxçåºå«ï¼
3.android wake_lock 锁源码分析
4.Android Touch事件InputManagerService源码解析(二)
5.Linux standby 开发指南
Kswapd 源码解析
kswapd是手机手机设置Linux内核中的一个内存回收线程,主要用于内存不足时回收内存。唤醒唤醒初始化函数为kswapd_init,源码源码内核为每个节点分配一个kswapd进程。手机手机设置每个节点的唤醒唤醒pg_data_t结构体中维护四个成员变量,用于管理kswapd线程。源码源码节节高小红旗指标公式源码
在初始化后,手机手机设置每个节点的唤醒唤醒kswapd线程进入睡眠状态。唤醒时机主要在被动唤醒和主动唤醒两种场景:被动唤醒是源码源码内存分配进程唤醒并完成异步内存回收后,对节点内存环境进行平衡度检查,手机手机设置若平衡则线程短暂休眠ms后主动唤醒。唤醒唤醒主动唤醒是源码源码内存回收策略调用kswapd,对节点进行异步内存回收,手机手机设置让节点达到平衡状态。唤醒唤醒
内存回收包括快速和直接两种方式,源码源码lftp 源码安装但系统周期性调用kswapd线程平衡不满足要求的节点,因为有些任务内存分配不允许阻塞或激活I/O访问,回收内存相当于亡羊补牢,系统利用空闲时间进行内存回收是必要的。
kswapd线程通过module_init(kswapd_init)创建,一般处于睡眠状态等待被唤醒,当系统内存紧张时,会唤醒kswapd线程,调整不平衡节点至平衡状态。
kswapd函数包含alloc_order、reclaim_order和classzone_idx三个变量,用于控制线程执行流程。kswapd_try_to_sleep函数判断是否睡眠并让出CPU控制权,同时是dspic foc源码线程唤醒的入口。balance_pgdat函数是实际内存回收操作,涉及内存分配失败后唤醒kswapd线程,调用此函数对指定节点进行异步内存回收。
kswapd_shrink_node函数通过shrink_node对低于sc->reclaim_idx的非平衡zone区域进行回收。
总结kswapd执行流程,其生命周期与Linux操作系统相似,平时处于睡眠状态让出CPU控制权。在内存紧张时被唤醒,有被动唤醒和周期性主动唤醒两种时机。被动唤醒发生在内存分配任务获取不到内存时,表明系统内存环境紧张,主动唤醒则是内存回收策略的执行。线程周期性唤醒在被动唤醒后的短暂时间内,原因在于系统内存环境紧张,js 源码api需要在这段时间内进行内存回收。
androidåLinuxçåºå«ï¼
æ以ä¸ä¸ç¹åºå«ï¼1ãAndroid没ææ¬å°çªå£ç³»ç»ï¼èLinuxæ¯æXçªå£ç³»ç»ã
2ãAndroid没æglibcæ¯æï¼èLinuxæ¯æglibcæ¯æçã
3ãAndroidæ¯æèªå·±ä¸æç驱å¨ç¨åºã
è½ç¶AndroidåºäºLinuxå æ ¸ï¼ä½æ¯å®ä¸Linuxä¹é´è¿æ¯æå¾å¤§çå·®å«ã
æ©å±èµæ
Androidä¸æç驱å¨ç¨åº
1ãAndroid Binder åºäºOpenBinderæ¡æ¶çä¸ä¸ªé©±å¨ï¼ç¨äºæä¾ Androidå¹³å°çè¿ç¨é´éä¿¡(InterProcess Communicationï¼IPC)åè½ãæºä»£ç ä½äºdrivers/staging/android/binder.cã
2ãAndroidçµæºç®¡ç(PM) ä¸ä¸ªåºäºæ åLinuxçµæºç®¡çç³»ç»çè½»é级Androidçµæºç®¡ç驱å¨ï¼é对åµå ¥å¼è®¾å¤åäºå¾å¤ä¼åãæºä»£ç ä½äºï¼
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
3ãä½å å管çå¨(Low Memory Killer) æ¯Linuxçæ åçOOM(Out Of Memory)æºå¶æ´å çµæ´»ï¼å®å¯ä»¥æ ¹æ®éè¦ææ»è¿ç¨ä»¥éæ¾éè¦çå åãæºä»£ç ä½äº drivers/staging/ android/lowmemorykiller.cã
4ãå¿åå ±äº«å å(Ashmem) 为è¿ç¨é´æä¾å¤§åå ±äº«å åï¼åæ¶ä¸ºå æ ¸æä¾åæ¶å管çè¿ä¸ªå åçæºå¶ãæºä»£ç ä½äºmm/ashmem.cã
5ãAndroid PMEM(Physical) PMEMç¨äºåç¨æ·ç©ºé´æä¾è¿ç»çç©çå ååºåï¼DSPåæäºè®¾å¤åªè½å·¥ä½å¨è¿ç»çç©çå åä¸ãæºä»£ç ä½äºdrivers/misc/pmem.cã
6ãAndroid Logger ä¸ä¸ªè½»é级çæ¥å¿è®¾å¤ï¼ç¨äºæåAndroidç³»ç»çåç§æ¥å¿ãæºä»£ç ä½äºdrivers/staging/android/logger.cã
7ãAndroid Alarm æä¾äºä¸ä¸ªå®æ¶å¨ï¼ç¨äºæ设å¤ä»ç¡ç ç¶æå¤éï¼åæ¶å®è¿æä¾äºä¸ä¸ªå³ä½¿å¨è®¾å¤ç¡ç æ¶ä¹ä¼è¿è¡çæ¶éåºåãæºä»£ç ä½äºdrivers/rtc/alarm.cã
8ãUSB Gadgeté©±å¨ ä¸ä¸ªåºäºæ å Linux USB gadget驱å¨æ¡æ¶ç设å¤é©±å¨ï¼AndroidçUSB驱å¨æ¯åºäºgaegetæ¡æ¶çãæºä»£ç ä½äºdrivers/usb/gadget/ã
9ãAndroid Ram Console 为äºæä¾è°è¯åè½ï¼Androidå 许å°è°è¯æ¥å¿ä¿¡æ¯åå ¥ä¸ä¸ªè¢«ç§°ä¸ºRAM Consoleç设å¤éï¼å®æ¯ä¸ä¸ªåºäºRAMçBufferãæºä»£ç ä½äºdrivers/staging/android / ram_console.cã
ãAndroid timed device æä¾äºå¯¹è®¾å¤è¿è¡å®æ¶æ§å¶çåè½ï¼ç®åæ¯ævibratoråLED设å¤ãæºä»£ç ä½äºdrivers/staging/android /timed_output.c(timed_gpio.c)ã
åèèµæï¼ç¾åº¦ç¾ç§ââAndroid
ç¾åº¦ç¾ç§ââlinux
android wake_lock 锁源码分析
在Android系统中,WakeLock锁被广泛用于保持设备唤醒,避免进入休眠状态,以满足应用程序持续运行的需求。本文从源码角度对WakeLock的基本流程原理进行深入分析。
WakeLock主要存在三种表现形式:
1. PowerManager.WakeLock:此接口由PMS提供给应用层和其它组件,用于申请WakeLock。
2. PowerManagerService.WakeLock:它是PowerManager.WakeLock在PMS内部的具体实现。
3. SuspendBlocker:在向底层节点操作时,PowerManagerService.WakeLock会转变为这种形式。
接下来,我们通过一个实例演示如何申请WakeLock锁。
在PowerManagerService中,gradle 编译源码会根据特定条件禁用部分WakeLock。这通常发生在:
1. 强制进入suspend状态。
2. 当WakeLock所属进程不处于active状态且进程adj大于PROCESS_STATE_RECEIVER。
3. 设备Idle处于IDLE状态,且所属进程不在doze白名单中。
当禁用条件满足时,mWakeLockSuspendBlocker会调用JNI方法nativeAcquireSuspendBlocker。
在power.c文件中,acquire_wake_lock的实现会将一个字符串数据写入指定的路径文件节点,新版本路径为“/sys/power/wake_lock”,旧版本为“/sys/android_power/acquire_partial_wake_lock”。至此,WakeLock锁的获取过程基本完成。释放过程与获取类似。
文章结束,感谢您的阅读。
Android Touch事件InputManagerService源码解析(二)
解析Android Touch事件分发过程,深入InputManagerService源码。触摸事件的产生与传递机制是本文探讨的核心。
InputDispatcher接收到事件,通过enqueueInboundEventLocked接口将事件放入mInboundQueue队列,等待分发处理。
InputDispatcher内部线程在有事件时被唤醒,执行dispatchOnce,根据事件类型调用dispatchMotionLocked进行处理。处理流程涉及找到要处理事件的窗口。
窗口查找通过findFocusedWindowTargetsLocked方法实现,该方法从map中获取focusedWindowHandle和focusedApplicationHandle,存储目标窗口信息。
这些句柄的初始化在Activity的生命周期回调中,如Activity.onResume时。具体路径涉及ActivityTaskManagerService、DisplayContent、InputMonitor和InputManagerService。
分发循环由prepareDispatchCycleLocked、enqueueDispatchEntryLocked和enqueueDispatchEntriesLocked方法实现,最后调用startDispatchCycleLocked,将事件发送给对应进程。
InputReader持续从底层读取事件,InputDispatcher通过线程处理分发,直至事件被发送至目标进程。本文深入解析了Touch事件的分发机制与关键步骤,提供了对Android触摸事件处理过程的全面理解。
Linux standby 开发指南
[toc]
Linux standby 开发指南
1 前言
1.1 文档简介
提供关于 standby 模块配置与调试的方法。
1.2 目标读者
面向 standby 模块的开发与维护人员。
1.3 适用范围
详细列表用于说明适用于哪些产品。
2 模块介绍
2.1 模块功能介绍
解释休眠唤醒的功能,包括进入低功耗模式(standby),分为 super standby 和 normal standby,以及假关机模式,适用于特定产品替代常规关机,实现红外/蓝牙开机。
2.2 相关术语介绍
列出并解释与模块相关的术语。
2.3 模块配置介绍
2.3.1 Device Tree 配置说明
解释设备树中的配置,包括路径与默认配置信息。
2.3.2 board.dts 配置说明
说明 board.dts 中的配置,涵盖参数如 standby、唤醒源、GPIO、假关机参数等。
2.3.3 kernel menuconfig 配置说明
概述 Linux 内核版本(如4.9)下的配置流程与关键选项。
2.3.4 uboot- 配置
具体描述在 defconfig 中对 uboot- 的相关配置。
2.4 源码结构介绍
说明 standby 源代码的存放位置。
2.5 驱动框架介绍
描述驱动框架在休眠唤醒流程中的作用。
3 FAQ
3.1 调试方法
3.1.1 调试节点
介绍 pm_test、wake_lock、wakeup_sources 节点的用途。
3.2 常见问题
3.2.1 系统被错误唤醒
分析和解决系统被定时器或其他非预期源错误唤醒的问题。
3.2.2 系统不能被唤醒
探讨系统休眠后无法唤醒的原因与解决方案。
3.2.3 红外遥控器不能唤醒系统
解释红外遥控唤醒的配置要求,并提供解决方案。
3.2.4 USB设备不能唤醒系统
说明 USB 唤醒的配置需求,并提供调整方法。
3.2.5 hdmi_cec 不能唤醒系统
分析 HDMI CEC 唤醒的配置问题,并给出解决路径。
3.2.6 cpus 退出休眠失败
讨论 cpus 退出休眠时的故障及其解决方案。
3.2.7 系统无法休眠
解释系统持锁无法休眠的可能原因与应对措施。
3.2.8 休眠唤醒过程中挂掉
分析休眠或唤醒阶段故障的排查与解决策略。