Android的Linux“心”

你問(wèn)我愛(ài)你有多深

我愛(ài)你有幾分

你去想一想

你去看一看

內(nèi)核代表我的心

......

Android的總體架構(gòu)有時(shí)被描述為“運(yùn)行在Linux上的Java”,然而這種說(shuō)法不夠準(zhǔn)確薛闪,并不能完全體現(xiàn)出這一平臺(tái)的復(fù)雜性和架構(gòu)粗恢。Android的總體架構(gòu)由5個(gè)主要層次上的組件構(gòu)成惋耙,這5層是:Android應(yīng)用層泛鸟、Android框架層、Dalvik虛擬機(jī)層病曾、用戶空間原生代碼層和Linux內(nèi)核層秕噪。圖1顯示了這些層是如何構(gòu)成Android軟件棧的钳降。


圖1 Android系統(tǒng)的總體架構(gòu)

Android應(yīng)用層允許開(kāi)發(fā)者無(wú)須修改底層代碼就對(duì)設(shè)備的功能進(jìn)行擴(kuò)展和提升,而Android框架層則為開(kāi)發(fā)者提供了大量的用來(lái)訪問(wèn)Android設(shè)備各種必需設(shè)備的API腌巾,也就是充當(dāng)應(yīng)用層與Dalvik虛擬機(jī)(DalvikVM)層之間的“粘合劑”遂填。API中包含各種構(gòu)件(building block)以允許開(kāi)發(fā)者執(zhí)行通用任務(wù)铲觉,比如管理UI元素、訪問(wèn)共享數(shù)據(jù)存儲(chǔ)吓坚,以及在應(yīng)用組件間傳遞信息等撵幽。

Android應(yīng)用和Android框架都是用Java語(yǔ)言開(kāi)發(fā)的,并在DalvikVM中運(yùn)行礁击。DalvikVM的作用主要是為底層操作系統(tǒng)提供一個(gè)高效的抽象層盐杂。DalvikVM是一種基于寄存器的虛擬機(jī),能夠解釋執(zhí)行Dalvik可執(zhí)行格式(DEX)的字節(jié)碼哆窿;另一方面链烈,DalvikVM依賴于一些由支持性原生代碼程序庫(kù)所提供的功能。

Android系統(tǒng)中的用戶空間原生代碼組件包括系統(tǒng)服務(wù)(如vold和DBus)挚躯、網(wǎng)絡(luò)服務(wù)(如dhcpd和wpa_supplicant)和程序庫(kù)(如bioniclibc强衡、WebKit和OpenSSL)。其中一些服務(wù)和程序庫(kù)會(huì)與內(nèi)核級(jí)的服務(wù)與驅(qū)動(dòng)進(jìn)行交互码荔,而其他的則只是便利底層原生操作管理代碼漩勤。

Android的底層基礎(chǔ)是Linux內(nèi)核,Android對(duì)內(nèi)核源碼樹(shù)作了大量的增加與修改缩搅,其中有些代碼存在一些獨(dú)特的安全后果越败。后面會(huì)更加詳細(xì)地討論這些話題。內(nèi)核級(jí)驅(qū)動(dòng)也提供了額外的功能硼瓣,比如訪問(wèn)照相機(jī)究飞、Wi-Fi以及其他網(wǎng)絡(luò)設(shè)備。需要特別注意Binder驅(qū)動(dòng)巨双,它實(shí)現(xiàn)了進(jìn)程間通信(IPC)機(jī)制噪猾。

下面詳細(xì)看一下內(nèi)核霉祸。

盡管Android的根基——Linux內(nèi)核文檔相當(dāng)完備而且已經(jīng)被深入理解筑累,但是Linux內(nèi)核和Android使用的內(nèi)核還是有很多顯著的差異。下面將介紹其中的一些變化丝蹭,特別是那些和Android安全相關(guān)的慢宗。

Android分支

在早期,谷歌創(chuàng)建了Linux內(nèi)核的一個(gè)Android分支奔穿,因?yàn)樵S多修改和添加已經(jīng)不再與Linux內(nèi)核主代碼樹(shù)相互兼容镜沽。總體而言贱田,這其中包括了大約250個(gè)補(bǔ)丁缅茉,涉及文件系統(tǒng)支持、網(wǎng)絡(luò)處理調(diào)整男摧,以及進(jìn)程和內(nèi)存管理功能等蔬墩。根據(jù)一位內(nèi)核工程師的說(shuō)法译打,絕大部分的補(bǔ)丁“代表著Android開(kāi)發(fā)者在Linux內(nèi)核中發(fā)現(xiàn)的一些局限性”。2012年3月拇颅,Linux內(nèi)核維護(hù)者將Android特有的內(nèi)核修改合并到了主代碼樹(shù)奏司。表1顯示了一些對(duì)主代碼樹(shù)的添加與修改,這里將詳細(xì)介紹其中的一部分樟插。


表1 Android對(duì)Linux內(nèi)核的主要修改

Binder

對(duì)Android的Linux內(nèi)核最為重要的一個(gè)添加也許是Binder驅(qū)動(dòng)韵洋。Binder是一個(gè)基于OpenBinder修改版本的IPC機(jī)制,OpenBinder最初由Be公司開(kāi)發(fā)黄锤,后來(lái)又由Palm公司開(kāi)發(fā)和維護(hù)搪缨。Android的Binder代碼量相對(duì)較小(大約有4000行源碼猜扮,存在于2個(gè)文件中)勉吻,但是對(duì)于大部分的Android功能都是非常關(guān)鍵的。

概括地說(shuō)旅赢,Binder內(nèi)核驅(qū)動(dòng)是整個(gè)Binder架構(gòu)的粘合劑齿桃。Binder作為一個(gè)架構(gòu),以客戶端—服務(wù)器模型運(yùn)行煮盼,允許一個(gè)進(jìn)程同時(shí)調(diào)用多個(gè)“遠(yuǎn)程”進(jìn)程中的多個(gè)方法短纵。Binder架構(gòu)將底層細(xì)節(jié)進(jìn)行了抽象,使得這些方法調(diào)用看起來(lái)就像是本地函數(shù)調(diào)用僵控。圖2顯示了Binder的通信流圖香到。


圖2 Binder的通信流

Binder也使用進(jìn)程ID(PID)和UID信息作為一種標(biāo)識(shí)調(diào)用進(jìn)程的手段,允許被調(diào)用方作出訪問(wèn)控制的決策报破。通常會(huì)調(diào)用Binder.getCallingUid和Binder.getCallingPid等函數(shù)悠就,或者調(diào)用checkCallingPermission等高層次上的檢查函數(shù)。

ashmem

匿名共享內(nèi)存服務(wù)充易,簡(jiǎn)稱ashmem梗脾,是另一個(gè)在Linux內(nèi)核Android分支中添加的代碼模塊。ashmem驅(qū)動(dòng)基本上提供了基于文件盹靴、通過(guò)引用計(jì)數(shù)的共享內(nèi)存接口炸茧。它廣泛應(yīng)用于大多數(shù)Android核心組件中,包括SurfaceFlinger稿静、AudioFlinger梭冠、系統(tǒng)服務(wù)器和DalvikVM等。ashmem能夠自動(dòng)收縮內(nèi)存緩存改备,并在全局可用內(nèi)存較低時(shí)回收內(nèi)存區(qū)域控漠,因而非常適用于低內(nèi)存環(huán)境。

pmem

另一個(gè)Android特有的自定義驅(qū)動(dòng)是pmem悬钳,用來(lái)管理1—16MB(或更多盐捷,取決于具體實(shí)現(xiàn))的大塊物理上連續(xù)的內(nèi)存區(qū)塊柬脸。這些區(qū)塊是特殊的,可以在用戶空間進(jìn)程和其他內(nèi)核驅(qū)動(dòng)(比如GPU驅(qū)動(dòng))之間共享毙驯。與ashmem不同的是倒堕,pmem驅(qū)動(dòng)需要一個(gè)分配進(jìn)程,為pmem的內(nèi)存堆保留一個(gè)文件描述符爆价,直到所有其他索引都關(guān)閉垦巴。

日志記錄器

雖然Android內(nèi)核仍然維護(hù)自己基于Linux內(nèi)核的日志機(jī)制,但它也使用另一個(gè)日志記錄子系統(tǒng)铭段,即俗稱的“日志記錄器”(logger)骤宣。作為logcat命令的支持,這個(gè)驅(qū)動(dòng)用于查看日志緩沖區(qū)序愚。它根據(jù)信息的類型憔披,提供了4個(gè)獨(dú)立的日志緩沖區(qū):main(主緩沖區(qū))、radio(無(wú)線電緩沖區(qū))爸吮、event(事件緩沖區(qū))與system(系統(tǒng)緩沖區(qū))芬膝。圖3顯示了日志事件的流圖以及輔助日志記錄器的組件。


圖3 Android日志記錄系統(tǒng)架構(gòu)

Paranoid Networking

Android內(nèi)核基于一個(gè)調(diào)用進(jìn)程的輔助用戶組來(lái)限制網(wǎng)絡(luò)操作形娇,而這個(gè)調(diào)用進(jìn)程就是被稱為Paranoid Networking的內(nèi)核修改模塊锰霜。在高層次上,這個(gè)模塊將一個(gè)AID(以及隨后的GID)映射到應(yīng)用層的權(quán)限聲明或請(qǐng)求上桐早。例如癣缅,Manifest文件中的權(quán)限android.permission.INTERNET有效地映射到AID_INETAID(或GID3003)上。這些用戶組哄酝、UID以及它們相應(yīng)的權(quán)能在內(nèi)核源碼樹(shù)的include/linux/android_aid.h文件中定義友存,詳見(jiàn)表2。


表2 根據(jù)用戶組定義的網(wǎng)絡(luò)權(quán)能

相關(guān)圖書推薦


1陶衅、Android安全第一書


Android安全攻防權(quán)威指南

書號(hào):978-7-115-38570-3

作者:Joshua J. Drake屡立,Pau Oliva Fora等

譯者:諸葛建偉 肖梓航 楊坤

頁(yè)數(shù):394

定價(jià):89.00 元


? ? *頂級(jí)白帽子(Joshua J. Drake等)原著 + 一線安全專家(諸葛建偉/肖梓航/楊坤)翻譯

? ? *tombkeeper、Flanker万哪、dm557侠驯、非蟲(chóng)等知名白帽子鼎力推薦

? ? *專注于闡述設(shè)備root抡秆、逆向工程奕巍、漏洞研究和軟件漏洞利用等技術(shù)細(xì)節(jié)


《Android安全攻防權(quán)威指南》由世界頂尖級(jí)黑客打造,是目前最全面的一本Android系統(tǒng)安全手冊(cè)儒士。書中細(xì)致地介紹了Android系統(tǒng)中的漏洞挖掘的止、分析,并給出了大量利用工具着撩,結(jié)合實(shí)例從白帽子角度分析了諸多系統(tǒng)問(wèn)題诅福,是一本難得的佳作匾委。

點(diǎn)擊左下角【閱讀原文】跳轉(zhuǎn)到京東本書頁(yè)面。

閱讀原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氓润,一起剝皮案震驚了整個(gè)濱河市赂乐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咖气,老刑警劉巖挨措,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異崩溪,居然都是意外死亡浅役,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伶唯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)觉既,“玉大人,你說(shuō)我怎么就攤上這事乳幸〉伤希” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵粹断,是天一觀的道長(zhǎng)尝艘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)姿染,這世上最難降的妖魔是什么背亥? 我笑而不...
    開(kāi)封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮悬赏,結(jié)果婚禮上狡汉,老公的妹妹穿的比我還像新娘。我一直安慰自己闽颇,他們只是感情好盾戴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著兵多,像睡著了一般尖啡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剩膘,一...
    開(kāi)封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天衅斩,我揣著相機(jī)與錄音,去河邊找鬼怠褐。 笑死畏梆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奠涌,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宪巨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了溜畅?” 一聲冷哼從身側(cè)響起捏卓,我...
    開(kāi)封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慈格,沒(méi)想到半個(gè)月后天吓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峦椰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年龄寞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汤功。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡物邑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滔金,到底是詐尸還是另有隱情色解,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布餐茵,位于F島的核電站科阎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏忿族。R本人自食惡果不足惜锣笨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望道批。 院中可真熱鬧错英,春花似錦、人聲如沸隆豹。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)璃赡。三九已至判哥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碉考,已是汗流浹背塌计。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豆励,地道東北人夺荒。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像良蒸,于是被迫代替她去往敵國(guó)和親技扼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容