earlysuspend,如何在Android
来源:择校网 时间:2024-12-03 16:35:17
一、android kernel和标准linux kernel的区别
android kernel和标准linux kernel的区别
总的区别可以归纳如下:
ARCH--这是Android修改了arch/arm下面的一些文件:
arch/arm:
Chg: arch/arm/kernel/entry-armv.S
Chg: arch/arm/kernel/module.c
Chg: arch/arm/kernel/process.c
Chg: arch/arm/kernel/ptrace.c
Chg: arch/arm/kernel/setup.c
Chg: arch/arm/kernel/signal.c
Chg: arch/arm/kernel/traps.c
Chg: arch/arm/mm/cache-v6.S
Chg: arch/arm/vfp/entry.S
Chg: arch/arm/vfp/vfp.h
Chg: arch/arm/vfp/vfphw.S
Chg: arch/arm/vfp/vfpmodule.c
Goldfish--这是Android为了模拟器所开发的一个虚拟硬件平台。Goldfish执行arm926T指令(在2.6.29中,goldfish也支持ATMv7指令),但是在实际的设备中,该虚拟平台的文件不会被编译。
arch/arm/mach-goldfish:
New: arch/arm/mach-goldfish/audio.c
New: arch/arm/mach-goldfish/board-goldfish.c
New: arch/arm/mach-goldfish/pdev_bus.c
New: arch/arm/mach-goldfish/pm.c
New: arch/arm/mach-goldfish/switch.c
New: arch/arm/mach-goldfish/timer.c
YAFFS2--和PC把文件存储在硬盘上不一样,移动设备一般把Flash作为存储设备。尤其是NAND flash应用非常广泛(绝大多数手机用的都是NAND flash,三星的一些手机使用的是OneNAND)。NAND flash具有低成本和高密度的优点。
YAFFS2是“Yet Another Flash File System, 2nd edition"的简称。它提供在Linux内核和NAND flash设备之前高效率的接口。 YAFFS2并没有包含在标准的Linux内核中, Google把它添加到了Android的kernel
fs/yaffs2:
New: fs/yaffs2/devextras.h
New: fs/yaffs2/Kconfig
New: fs/yaffs2/Makefile
New: fs/yaffs2/moduleconfig.h
New: fs/yaffs2/yaffs_checkptrw.c
New: fs/yaffs2/yaffs_checkptrw.h
New: fs/yaffs2/yaffs_ecc.c
New: fs/yaffs2/yaffs_ecc.h
New: fs/yaffs2/yaffs_fs.c
New: fs/yaffs2/yaffs_getblockinfo.h
New: fs/yaffs2/yaffs_guts.c
New: fs/yaffs2/yaffs_guts.h
New: fs/yaffs2/yaffsinterface.h
New: fs/yaffs2/yaffs_mtdif1.c
New: fs/yaffs2/yaffs_mtdif1.h
New: fs/yaffs2/yaffs_mtdif2.c
New: fs/yaffs2/yaffs_mtdif2.h
New: fs/yaffs2/yaffs_mtdif.c
New: fs/yaffs2/yaffs_mtdif.h
New: fs/yaffs2/yaffs_nand.c
New: fs/yaffs2/yaffs_nandemul2k.h
New: fs/yaffs2/yaffs_nand.h
New: fs/yaffs2/yaffs_packedtags1.c
New: fs/yaffs2/yaffs_packedtags1.h
New: fs/yaffs2/yaffs_packedtags2.c
New: fs/yaffs2/yaffs_packedtags2.h
New: fs/yaffs2/yaffs_qsort.c
New: fs/yaffs2/yaffs_qsort.h
New: fs/yaffs2/yaffs_tagscompat.c
New: fs/yaffs2/yaffs_tagscompat.h
New: fs/yaffs2/yaffs_tagsvalidity.c
New: fs/yaffs2/yaffs_tagsvalidity.h
New: fs/yaffs2/yportenv.h
Bluetooth-- Google为Bluetooth打上了patch,fix了一些Bluetooth的bug
drivers/bluetooth:
Chg: drivers/bluetooth/bfusb.c
Chg: drivers/bluetooth/bt3c_cs.c
Chg: drivers/bluetooth/btusb.c
Chg: drivers/bluetooth/hci_h4.c
Chg: drivers/bluetooth/hci_ll.c
Scheduler--对于Scheduler的改变非常小,我对它并没有去研究。
Chg: kernel/sched.c
New Android Functionality--除了fix一些bug以及其他一些小的更改,Android增加了一些新的功能,介绍如下:
IPC Binder-- The IPC Binder is an Inter-Process Communication(IPC) mechanism. It allows processes to provide services to other processes via a set of higher-level APIs than are available in standard Linux. An Internet search indicated that the Binder concept originated at Be, Inc., and then made its way into Palm's software, before Google wrote a new Binder for Android.
New: drivers/staging/android/binder.c
Low Memory Killer-- Android adds a low-memory killer that, each time it's called, scans the list of running Linux processes, and kills one. It was not clear in our cursory examination why Android adds a low-memory killer on top of the already existing one in the standard Linux kernel.
New: drivers/staging/android/lowmemorykiller.c
Ashmem-- Ashmem is an Anonymous SHared MEMory system that adds interfaces so processes can share named blocks of memory. As an example, the system could use Ashmem to store icons, which multiple processes could then access when drawing their UI. The advantage of Ashmem over traditional Linux shared memory is that it provides a means for the kernel to reclaim these shared memory blocks if they are not currently in use. If a process then tries to access a shared memory block the kernel has freed, it will receive an error, and will then need to reallocate the block and reload the data.
New: mm/ashmem.c
RAM Console and Log Device-- To aid in debugging, Android adds the ability to store kernel log messages to a RAM buffer. Additionally, Android adds a separate logging module so that user processes can read and write user log messages.
New: drivers/staging/android/ram_console.c
Android Debug Bridge-- Debugging embedded devices can best be described as challenging. To make debugging easier, Google created the Android Debug Bridge(ADB), which is a protocol that runs over a USB link between a hardware device running Android and a developer writing applications on a desktop PC.
drivers/usb/gadget:
New: drivers/usb/gadget/android.c
Chg: drivers/usb/gadget/composite.c
Chg: drivers/usb/gadget/f_acm.c
New: drivers/usb/gadget/f_acm.h
New: drivers/usb/gadget/f_adb.c
New: drivers/usb/gadget/f_adb.h
New: drivers/usb/gadget/f_mass_storage.c
New: drivers/usb/gadget/f_mass_storage.h
Android also adds a new real-time clock, switch support, and timed GPIO support. We list the impacted files for these new modules at the end of this document.
Power Management-- Power management is one of the most difficult pieces to get right in mobile devices, so we split it out into a group separate from the other pieces. It's interesting to note that Google added a new power management system to Linux, rather than reuse what already existed. We list the impacted files at the end of this document.
kernel/power:
New: kernel/power/consoleearlysuspend.c
New: kernel/power/earlysuspend.c
New: kernel/power/fbearlysuspend.c
Chg: kernel/power/main.c
Chg: kernel/power/power.h
Chg: kernel/power/process.c
New: kernel/power/userwakelock.c
New: kernel/power/wakelock.c
Miscellaneous Changes-- In addition to the above, we found a number of changes that could best be described as,'Miscellaneous.' Among other things, these changes include additional debugging support, keypad light controls, and management of TCP networking.
(freedom_asic)
二、如何在Android***或Linux***下***做Suspend******Resume***的Debug
在Linux或Android下,做power management的调适时,常遇到没有足够的information,可以做为debug时的依据和参考
我们整理了几个常用的参数或Command,可供设计者,得到足够的Informaiton做Suspend/ Resume的function Debug。
加boot参数 no_console_suspend
基本上我们常常使用console做为suspend function的debug的Information source,但原始的source code在suspend过程中,会将console关掉。所以我们看到一定程度後就再也看不到message了。
但是我们并不知道在Suspend的过程中,系统到底发生了什麼事,可能造成无法suspend。
为此,我们就会在kernel启动参数中加上no_console_suspend这个参数。在AM/DM37x APM中是修改boot.scr档案参数
#!/bin/sh
cat<
if fatload mmc 0 82000000 uImage
then
echo***** Kernel:/dev/mmcblk0p1/uImage*****
fi
echo***** RootFS:/dev/mmcblk0p2*****
# Pantherboard DVI output
#setenv bootargs'console=ttyO2,115200n8 androidbootnsole=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=dvi vram=32M omapfb.mode=dvi:1280x720MR-32 omapfb.vram=0:16M mpurate=1000'
# Pantherboard LCD output
setenv bootargs'console=ttyO2,115200n8 androidbootnsole=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000'
将no_console_suspend加上去到boot参数後就好了
setenv bootargs'console=ttyO2,115200n8 androidbootnsole=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 no_console_suspend'
如果是OMAP4 APM的话,请修改Kernel参数的所在档案即可(在U-boot Source code中)
这个是基本的参数,所以在Android或Linux上都可以使用。 kernel把console suspend掉以後,不管里面出了什麼事情,在Console上都看不到。而使用这个参数後,大部分在suspend/resume时候的死机都可以通过Console看到kernel Panic的信息,这样我们才会知道是哪里出了问题。因为有的时候resume出错,或者suspend到很後面出错的console不加这个参数都看不到。
但这个参数在TI OMAP3/OMAP4/AM37x/DM37x有可能造成有时Suspend完当掉或是resume失败的问题,假如已经抓到问题在那的时候,您就可以将这个参数Disable,不然很可能就会Debug不下去。
initcall_debug
这个同样kernel参数,使用的时机是,当我们不知道是那个driver在suspend/resume过程中出错的时候,可以使用这个参数来找出问题所在。在下完这个参数後,Kernel在suspend时,会将每个driver或task的状况report出来。我们可以藉由这些information,Check在suspend时,每个task和driver是否已经完成进suspend的相关准备工作…
打开这个参数的方法有二种
一种是在console下Command,启动这个function…
echo 1>/sys/module/kernel/parameters/initcall_debug
echo 9>/proc/sys/kernel/printk
其中上面的第一条命令是打开initcall_debug,这个是所有的kernel都会有的。
而第二条命令是要提高kernel message级别,因为initcall的这些信息都是KERN_DEBUG级别的,所以需要提高printk的级别才可以看到,要不然suspend/resume的时候挂了,你就没有机会看到这些信息了。
另一种启动方法是写在kernel的启动参数下,就可以了。
setenv bootargs'console=ttyO2,115200n8 androidbootnsole=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 initcall_debug no_console_suspend'
同样的,这个参数也有可能造成AM37x/DM37x/OMAP4 APM发生进suspend当掉的问题。所以一旦知道问题所在,麻烦请将这个参数Disable掉。
suspend_test
这个方法可以用rtc这种软件的方式来做循环的suspend/resume,尽管对於Android这样并不是很足够,(还要再模拟一个POWER_KEY上去才够),但是对於测试Driver的稳定性,还是有一定用处的。不要认为suspend了几次可以,那麼就可以通过几千次的测试。这个suspend是5秒钟用RTC唤醒,然後回到Android後5秒钟又会自动睡下去,但是对於通用Linux,你可以写个script来让他起来一会再睡下去,或许这个工具比较有用rtcwakeup(google rtcwakeup)。
使用方法:
编译一个有这个功能的kernel, make menuconfig以後选上
CONFIG_PM_DEBUG=y
CONFIG_PM_TEST_SUSPEND=y
这两个选项,烧写新的kernel,然後打开你需要测试的Device,比如WIFI,3G
echo"core">/sys/power/pm_test
echo"mem">/sys/power/state
这样,它就会循环休眠和唤醒了。
wakelock
Android和Linux在Power Management相关的最大的就是wakelock机制的有无。Android有时候会碰到suspend进不去,或者suspend到最後又莫名奇妙的wake up的问题。这些都有可能是wakelock引起的,或者说是wakelock的使用者引起的。怎麼fine tune呢,使用Console在Android系统下设定:
echo 15>/sys/module/wakelock/parameters/debug_mask
echo 15>/sys/module/userwakelock/parameters/debug_mask
15是代表16进制的F,在wakelock里面就是把所有的debug信息打开,起码现在是这样设定的。如果以後不够用了,可能就会改成255.
这样你能看到kernel和frameworks层对於wakelock的操作、申请及释放。这样看申请和释放成对否就可以了。
注意: wakelock有一种是timeout的,就是说多少毫秒以後,会自动释放,对於这些wakelock,申请和释放可能是不成对的。
power.0
有时看到系统suspend到了最後,然後遇到power.0後suspend失败,然後整个系统又resume回来。这个是android专有的,因为power.0是android注册到suspend最後的一个行程,它会在CPU进入suspend之前检查一下有没有wakelock存在,如果这时候还有没有释放的wakelock,那麼它会return-EBUSY然後导致整个suspend失败。 Check这个问题的方法就是把上面wakelock的debug信息打开,然後看看是哪个去申请了wakelock,然後Release它。
这个错误的错误信息大概是这样的:
pm_noirq_op(): platform_pm_suspend_noirq 0x0/0x38 returns-11
PM: Device power.0 failed to suspend late: error-11
earlysuspend
在android里面中另外一个和Power Management有相关的机制叫earlysuspend,同样可以打开debug message,用来做Android earlysuspend debug之用:
echo 15>/sys/module/earlysuspend/parameters/debug_mask
来把相关的debug信息印出来,例如那个earlysuspend要被call之类的。
suspend/resume时间 fine tune
有的时候你要调试suspend/resume的时间太慢的问题。一种方法是用initcall_debug,然後把printk的时间戳打上,然後看那个process最慢,再来Check原因是什麼
我有一个patch,专门用来调试这个问题的,但是upstream不接受,说非要用这种折磨人的方法才行,但是如果你想用可以下下来打上去用一下。
地址在这里:
用法是,打上这个PATCH以後,在KERNEL里面选择上PM_DEBUG, SUSPEND_DEVICE_TIME_DEBUG这两个选项。
然後
echo微秒>/sys/power/device_suspend_time_threshold
比如
echo 50000>/sys/power/device_suspend_time_threshold
注意这里是微秒哦。。。它会把在suspend/resume的时候慢的那些driver打出来,然後你去干掉它。。
三、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。
10、Android timed device提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android/timed_output.c(timed_gpio.c)。
参考资料:百度百科——Android
百度百科——linux
关于本次earlysuspend和如何在Android的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。