Android內核和Linux內核的差別
時間(jian):2018-09-27 來源:未知
Android系統的(de)系統層面(mian)的(de)底層是linux,中間加上(shang)了(le)一個叫做Dalvik的(de)Java虛擬(ni)機和(he)ART運(yun)行環(huan)境,表(biao)面(mian)層上(shang)面(mian)是Android運(yun)行庫。每個Android應用都(dou)運(yun)行在(zai)自己的(de)進程上(shang),享(xiang)有ART和(he)Dalvik虛擬(ni)機為它分配的(de)專有實例。為了(le)支持多個虛擬(ni)機在(zai)同一個設備上(shang)高效(xiao)運(yun)行,Dalvik被改寫過(guo)。
Dalvik虛擬(ni)機執(zhi)行(xing)的(de)是(shi)(shi)Dalvik格式的(de)可執(zhi)行(xing)文件(.dex)——該格式經過優化,以降(jiang)低(di)內(nei)存(cun)耗用到低(di)。底層(ceng)功能——例如線(xian)程(cheng)和低(di)內(nei)存(cun)管理方(fang)面,Dalvik虛擬(ni)機是(shi)(shi)依(yi)賴Linux內(nei)核(he)的(de)。由(you)此可見,可以說Android是(shi)(shi)運行(xing)在Linux之上(shang)的(de)操作系(xi)統,但(dan)是(shi)(shi)它本(ben)身不能算是(shi)(shi)Linux的(de)某個版本(ben)。
Android內(nei)核和(he)Linux內(nei)核的差別(bie)主要體現(xian)在11個(ge)方面,如下:
1、Android Binder
Android Binder的源代碼(ma)位于 drivers/staging/android/binder.c
Android Binder是基(ji)于(yu)OpenBinder框架的一個(ge)驅動,用于(yu)提供Android平臺(tai)的進程間通(tong)信(IPC)。
Linux內核系(xi)統上層(ceng)應用(yong)的進(jin)程間(jian)通信主要是D-bus(Desktop bus),采用(yong)消(xiao)息總線的方式來進(jin)行IPC。
2、Android電源(yuan)管(guan)理(PM)
Android電源(yuan)管(guan)理是一個基于標準Linux電源(yuan)管(guan)理系統的(de)輕量級的(de)Android電源(yuan)管(guan)理驅動,針(zhen)對嵌入式(shi)設備做了很(hen)多優(you)化。利用鎖和定時器(qi)來切換系統狀態(tai),控制設備在不同狀態(tai)下的(de)功耗,以達到節能的(de)目的(de)。
Android電源管理的(de)源代碼分別位于(yu)如下(xia)位置:
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kerne/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
Android 5.0版本將引(yin)用(yong)JobScheduler調(diao)度程序,好(hao)處是增(zeng)加設備續(xu)航(hang)時間,以達到節省電量的目的。
3、低內存管理(li)器(Low Memory Killer)
Android中的(de)(de)(de)(de)低內(nei)存管理器(qi)和(he)Linux標準(zhun)的(de)(de)(de)(de)OOM相比,其機(ji)制更加靈活,他(ta)可以根(gen)據需(xu)要殺死進程來(lai)釋放需(xu)要的(de)(de)(de)(de)內(nei)存。Low Memory Killer的(de)(de)(de)(de)代碼很簡單(dan),關鍵的(de)(de)(de)(de)一個(ge)(ge)函數(shu)是(shi)Lowmem_shrinker.作為一個(ge)(ge)模塊(kuai)在(zai)(zai)初始化時調用(yong)register_shrinker注冊了一個(ge)(ge)lowmem_shrinker,它會被vm在(zai)(zai)內(nei)存緊(jin)張的(de)(de)(de)(de)情況下調用(yong)。Lowmem_shrinker用(yong)來(lai)完(wan)成具體操(cao)作。簡單(dan)的(de)(de)(de)(de)說就是(shi)尋(xun)找(zhao)一個(ge)(ge)合適的(de)(de)(de)(de)進程殺死,從而釋放它占(zhan)用(yong)的(de)(de)(de)(de)內(nei)存。
低內(nei)存管理器的源代碼位于drivers/staging/android/lowmenorykiller.c
4、匿名(ming)共(gong)享(xiang)內存(Ashmem)
匿名共享(xiang)(xiang)內(nei)存(cun)為(wei)進程間提(ti)供(gong)大塊(kuai)共享(xiang)(xiang)內(nei)存(cun),同時為(wei)內(nei)核(he)提(ti)供(gong)回收(shou)和管理這個內(nei)存(cun)的(de)機(ji)制。如果一個程序(xu)嘗試訪問(wen)Kernel釋放(fang)的(de)一個共享(xiang)(xiang)內(nei)存(cun)塊(kuai),它將會收(shou)到一個錯誤提(ti)示然后重新分(fen)配(pei)內(nei)存(cun)并重載(zai)數據。
匿名共享(xiang)內(nei)存的源(yuan)代碼位(wei)于(yu)mm/ashmem.c
5、Android PMEM
PMEM用(yong)(yong)于(yu)向用(yong)(yong)戶空間(jian)提(ti)供連續(xu)的(de)物理(li)內存區(qu)域,DSP和某些設(she)備只能(neng)工作在連續(xu)的(de)物理(li)內存上。驅動中提(ti)供了mmap、open、release、ioctl等接口。
Android PMEM的(de)源代碼(ma)位于drivers/misc/pmem.c
6、Android Logger
Android Logger是(shi)一個輕量級的(de)日(ri)志(zhi)設備(bei),用于(yu)抓取Android系統的(de)各種日(ri)志(zhi),是(shi)Linux所沒有的(de)。
Android Logger的源代碼位于drivers/staging/android/logger.c
7、Android Alarm
Android Alarm提(ti)供了一個定(ding)時(shi)器用于把設備從睡眠狀態喚醒(xing),同時(shi)它也提(ti)供了一個即使在設備睡眠時(shi)也會運行的時(shi)鐘基準。
Android Alarm的源代碼位于drivers/rtc/alarm.c 和 drivers/rtc/alarm-dev.c
8、USB Gadget驅動(dong)
USB Gadget驅(qu)動(dong)是(shi)一個基(ji)于(yu)標(biao)準Linux USB gadget驅(qu)動(dong)框(kuang)架(jia)的(de)設(she)備驅(qu)動(dong),Android的(de)USB驅(qu)動(dong)是(shi)基(ji)于(yu)gadget框(kuang)架(jia)的(de)。
USB Gadget驅動(dong)的源(yuan)代碼位(wei)于如下(xia)位(wei)置。
drivers/usb/gadget/android.c
drivers/usb/gadget/f_adb.c
drivers/usb/gadget/f_mass_storage.c
9、Android Console
為(wei)了提供調(diao)試(shi)功能,Android允許將調(diao)試(shi)日志(zhi)信息寫(xie)入一個(ge)被稱為(wei)RAM Console的(de)設備中,它是一個(ge)基于RAM的(de)Buffer。
Android Ram Console的源代碼位于 drivers/staging/android/ram_console.c
10、Android timed device
Android timed device 提供了對設備(bei)進行定(ding)時(shi)的控(kong)制功能,目前僅(jin)支(zhi)持(chi)vibrator和LED設備(bei)。
Android timed device 的源(yuan)代碼位于drivers/staging/android/timed_output.c(timed_gpio.c)
11、Yaffs2文(wen)件(jian)系(xi)統
在Android系(xi)統中(zhong),采(cai)用Yaffs2作為(wei)MTD NAND Flash文件系(xi)統。Yaffs2是一個(ge)快速穩(wen)定的(de)(de)應用于NAND和NOR Flash的(de)(de)跨平臺(tai)的(de)(de)嵌入式設備文件系(xi)統,同其他Flash文件系(xi)統相(xiang)比,Yaffs2使用更小的(de)(de)內存來保存它的(de)(de)運行狀態,因此占用內存小;Yaffs2的(de)(de)垃圾回(hui)收非(fei)常簡單而且(qie)快速,因此能(neng)達到更好(hao)的(de)(de)性能(neng);Yaffs2在大容(rong)量(liang)的(de)(de)NAND Flash上(shang)性能(neng)表(biao)現尤為(wei)明顯,非(fei)常適合大容(rong)量(liang)的(de)(de)Flash存儲。
Yaffs2文(wen)件系統位于(yu)fs/yaffs2/.

