- Android底層接口與驅(qū)動開發(fā)技術(shù)詳解
- 陳強(qiáng)
- 3221字
- 2019-10-12 15:38:29
1.5.2 和Android密切相關(guān)的Linux內(nèi)核知識
Android是在Linux內(nèi)核基礎(chǔ)上運行的,提供的核心系統(tǒng)服務(wù)包括安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)組和驅(qū)動模型等內(nèi)容。接下來將簡要講解上述核心系統(tǒng)服務(wù)的基本知識。
1.安全
Linux安全的知識主要涉及用戶權(quán)限問題和目錄權(quán)限問題。
(1)Linux系統(tǒng)中用戶和權(quán)限
Linux系統(tǒng)中的每個文件和目錄都有訪問權(quán)限,用它來確定誰可以通過何種方式對文件和目錄進(jìn)行訪問和操作。Linux系統(tǒng)中規(guī)定了文件3種不同類型的用戶:文件擁有者(user)用戶、同組用戶(group)、可以訪問系統(tǒng)的其他用戶(others)。并規(guī)定3種訪問文件或目錄的方式:讀(r)、寫(w)、可執(zhí)行或查找(x)。
(2)文件及目錄權(quán)限的功能
● 讀權(quán)限(r):表示只允許指定用戶讀取相應(yīng)文件的內(nèi)容,禁止對它做任何更改操作,如目錄讀權(quán)限表示可以列出存儲在該目錄下的文件,即讀目錄內(nèi)容。
● 寫權(quán)限(w):表示允許指定用戶打開并修改文件,如目錄寫表示允許從目錄中刪除或創(chuàng)建新的文件或目錄。
● 執(zhí)行權(quán)限(x):表示允許指定用戶將該文件作為一個程序執(zhí)行,如對目錄表示允許在目錄中查找,并能用cd命令將工作目錄切換到該目錄。
Linux系統(tǒng)在創(chuàng)建文件時,會自動把該文件的讀/寫權(quán)限分配給其屬主,使用戶能夠顯示和修改該文件,也可以將這些權(quán)限改變?yōu)槠渌M合形式。一個文件如果有執(zhí)行權(quán)限,則允許它作為一個程序被執(zhí)行。
2.內(nèi)存管理
內(nèi)存管理是計算機(jī)編程最為基本的領(lǐng)域之一。在很多腳本語言中,用戶不必?fù)?dān)心內(nèi)存是如何管理的,這并不會使內(nèi)存管理的重要性有一點點降低。對實際編程來說,理解內(nèi)存管理器的能力與局限性至關(guān)重要。在大部分系統(tǒng)語言中必須進(jìn)行內(nèi)存管理,如C和C++。
追溯到在Apple Ⅱ上進(jìn)行匯編語言編程的時代,那時內(nèi)存管理還不是個大問題。實際上在運行整個系統(tǒng),系統(tǒng)有多少內(nèi)存用戶就有多少內(nèi)存。用戶甚至不必費心思去弄明白它有多少內(nèi)存,因為每一臺計算機(jī)的內(nèi)存數(shù)量都相同。所以,如果內(nèi)存需求固定,那么用戶只需選擇一個內(nèi)存范圍并使用它即可。
但是即使是在這樣一個簡單的計算機(jī)中也會有問題,尤其是當(dāng)用戶不知道程序的每個部分將需要多少內(nèi)存時。如果用戶的空間有限,而內(nèi)存需求是變化的,那么需要用一些方法來滿足下面的需求。
(1)確定是否有足夠的內(nèi)存來處理數(shù)據(jù)。
(2)從可用的內(nèi)存中獲取一部分內(nèi)存。
(3)向可用內(nèi)存池(pool)中返回部分內(nèi)存,以使其可以由程序的其他部分或者其他程序使用。
實現(xiàn)上述需求的程序庫稱為分配程序(allocators),因為它們負(fù)責(zé)分配和回收內(nèi)存。程序的動態(tài)性越強(qiáng),內(nèi)存管理就越重要,用戶的內(nèi)存分配程序的選擇也就更重要。下面來了解可用于內(nèi)存管理的不同方法,它們的好處與不足,以及它們最適用的情形。
3.進(jìn)程管理
在Linux操作系統(tǒng)中包括3種不同類型的進(jìn)程,分別是交互進(jìn)程、批處理進(jìn)程和守護(hù)進(jìn)程。每種進(jìn)程都有自己的特點和屬性。交互進(jìn)程是由一個Shell啟動的進(jìn)程。交互進(jìn)程既可以在前臺運行,也可以在后臺運行。批處理進(jìn)程和終端沒有聯(lián)系,是一個進(jìn)程序列。系統(tǒng)守護(hù)進(jìn)程是Linux系統(tǒng)啟動時啟動的進(jìn)程,并在后臺運行。
Linux管理進(jìn)程的最好方法就是使用命令行下的系統(tǒng)命令。Linux下面的進(jìn)程涉及的命令有ps、kill、pgrep等工具。
(1)父進(jìn)程和子進(jìn)程
父進(jìn)程和子進(jìn)程的關(guān)系是管理和被管理的關(guān)系,當(dāng)父進(jìn)程終止時,子進(jìn)程也隨之終止。但子進(jìn)程終止,父進(jìn)程并不一定終止。比如,httpd服務(wù)器運行時,用戶可以“殺掉”其子進(jìn)程,父進(jìn)程并不會因為子進(jìn)程的終止而終止。在進(jìn)程管理中,當(dāng)用戶發(fā)現(xiàn)占用資源過多,或無法控制的進(jìn)程時,應(yīng)該殺死它,以保護(hù)系統(tǒng)的穩(wěn)定安全運行。
(2)進(jìn)程命令
在Linux中,通過命令來管理和操作進(jìn)程,其中常用的命令可以分為如下幾類。
①監(jiān)視進(jìn)程命令
ps(process status命令):用于顯示瞬間行程(process)的動態(tài),其使用方式如下。

其中參數(shù)options的取值非常多,常用參數(shù)的具體說明如下。
pstree命令:功能是顯示當(dāng)前運行的所有進(jìn)程及相關(guān)的子進(jìn)程,輸出的是類似‘tree’命令的樹狀格式。其使用方式如下。

常用參數(shù)的具體說明如下。
● -a:顯示該行程的完整指令及參數(shù),如果是被記憶體置換出去的行程則會加上括號。
● -c:如果有重復(fù)的行程名,則分開列出(預(yù)設(shè)值會在前面加上*)。
top命令:用于實時顯示process的動態(tài),其使用方式如下。

常用參數(shù)的具體說明如下。
● d:改變顯示的更新速度,或是在交談式指令列(interactive command)按s鍵。
● q:沒有任何延遲的顯示速度,如果使用者有superuser的權(quán)限,則top將會以最高的優(yōu)先序執(zhí)行。
● c:切換顯示模式,共有兩種模式,一是只顯示執(zhí)行檔的名稱,另一種是顯示完整的路徑與名稱。
● S:累積模式,會將已完成或消失的子行程(dead child process)的CPU time累積起來。
● s:安全模式,將交談式指令取消,避免潛在的危機(jī)。
● i:不顯示任何閑置(idle)或無用(zombie)的行程。
● n:更新的次數(shù),完成后將會退出top。
● b:批次檔模式,搭配n參數(shù)一起使用,可以用來將top的結(jié)果輸出到檔案內(nèi)。
控制進(jìn)程命令。
向Linux系統(tǒng)的內(nèi)核發(fā)送一個系統(tǒng)操作信號和某個程序的進(jìn)程標(biāo)識號,系統(tǒng)內(nèi)核就可以對進(jìn)程標(biāo)識號指定的進(jìn)程進(jìn)行操作。例如,在top命令中會看到系統(tǒng)運行的許多進(jìn)程,有時就需要使用kill命令中止某些進(jìn)程來提高系統(tǒng)資源。在安裝和登錄命令中使用多個虛擬控制臺的作用是,當(dāng)一個程序出錯造成系統(tǒng)死鎖時可以切換到其他虛擬控制臺工作關(guān)閉這個程序。此時使用的命令就是kill,因為kill是大多數(shù)Shell內(nèi)部命令可以直接調(diào)用的。
在Linux系統(tǒng)中,使用kill命令來控制進(jìn)程。kill可以刪除執(zhí)行中的程序或工作,可以將指定的信息送至程序,預(yù)設(shè)的信息為SIGTERM(15),可將指定程序終止。若仍無法終止該程序,可使用SIGKILL(9)信息嘗試強(qiáng)制刪除程序。程序或工作的編號可利用ps指令或jobs指令查看。
在現(xiàn)實應(yīng)用中,有如下兩種使用kill命令的方式。

各個參數(shù)的具體說明如下。
● -s <信息名稱或編號>:指定要送出的信息;
● -l <信息編號>:如果不加<信息編號>選項,則-l參數(shù)會列出全部的信息名稱。
注意:進(jìn)程是Linux系統(tǒng)中一個非常重要的概念。Linux是一個多任務(wù)的操作系統(tǒng),系統(tǒng)上經(jīng)常同時運行多個進(jìn)程。用戶并不關(guān)心這些進(jìn)程究竟是如何分配的,或者是內(nèi)核如何管理分配時間片的,所關(guān)心的是如何去控制這些進(jìn)程,讓它們能夠很好地為用戶服務(wù)。
②進(jìn)程優(yōu)先級設(shè)定(nice命令)
使用nice命令可以使用更改過的優(yōu)先順序來執(zhí)行程序,如果未指定程序,則會顯示出目前的進(jìn)程優(yōu)先順序,默認(rèn)的adjustment為10,范圍為-20(最高優(yōu)先序)~19(最低優(yōu)先序)。使用nice命令的方式如下。

各個參數(shù)的具體說明如下。
● -n adjustment,-adjustment,--adjustment=adjustment:都將原有的優(yōu)先順序增加adjustment。
● --help:顯示求助信息。
● --version:顯示版本資訊。
4.設(shè)備驅(qū)動程序
既然本書是講解內(nèi)核和驅(qū)動開發(fā)的書籍,就不可避免地講解設(shè)備驅(qū)動程序的知識。設(shè)備驅(qū)動程序用于與系統(tǒng)連接的輸入/輸出裝置通信,如硬盤、軟盤驅(qū)動器、各種接口、聲卡等。按照“萬物皆文件(everything is a file)”的說法,對外設(shè)的訪問可利用/dev目錄下的設(shè)備文件來完成,程序?qū)υO(shè)備的處理完全類似常規(guī)的文件。設(shè)備驅(qū)動程序的任務(wù)在于支持應(yīng)用程序經(jīng)由設(shè)備文件與設(shè)備通信。通常可以將外設(shè)分為以下兩類。
(1)字符設(shè)備。提供連續(xù)的數(shù)據(jù)流,應(yīng)用程序可以順序讀取,通常不支持隨機(jī)存取。相反,此類設(shè)備支持按字節(jié)、字符來讀/寫數(shù)據(jù)。舉例來說,調(diào)制解調(diào)器是典型的字符設(shè)備。
(2)塊設(shè)備。應(yīng)用程序可以隨機(jī)訪問設(shè)備數(shù)據(jù),程序可自行確定讀取數(shù)據(jù)的位置。硬盤是典型的塊設(shè)備,應(yīng)用程序可以尋址磁盤上的任何位置,并由此讀取數(shù)據(jù)。此外,數(shù)據(jù)的讀/寫只能以塊(通常是512bit)的倍數(shù)進(jìn)行。與字符設(shè)備不同,塊設(shè)備并不支持基于字符的尋址。
編寫塊設(shè)備的驅(qū)動程序比字符設(shè)備要復(fù)雜得多,因為內(nèi)核為提高系統(tǒng)性能廣泛地使用緩存機(jī)制。
5.網(wǎng)絡(luò)
網(wǎng)卡也可以通過設(shè)備驅(qū)動程序控制,但在內(nèi)核中屬于特殊狀況,因為網(wǎng)卡不能利用設(shè)備文件訪問。原因在于在網(wǎng)絡(luò)通信期間,數(shù)據(jù)打包到各種協(xié)議層中。在接收到數(shù)據(jù)時,內(nèi)核必須針對各協(xié)議層的處理,對數(shù)據(jù)進(jìn)行拆包與分析,然后才能將有效數(shù)據(jù)傳遞給應(yīng)用程序。在發(fā)送數(shù)據(jù)時,內(nèi)核必須首先根據(jù)各個協(xié)議層的要求打包數(shù)據(jù),然后才能發(fā)送。
為支持通過文件接口處理網(wǎng)絡(luò)連接(按照應(yīng)用程序的觀點),Linux使用源于BSD的套接字抽象。套接字可以看作應(yīng)用程序、文件接口、內(nèi)核的網(wǎng)絡(luò)實現(xiàn)之間的代理。
- 零基礎(chǔ)學(xué)Scratch少兒編程:小學(xué)課本中的Scratch創(chuàng)意編程
- 數(shù)據(jù)結(jié)構(gòu)(Java語言描述)
- Learn Programming in Python with Cody Jackson
- Oracle數(shù)據(jù)庫從入門到運維實戰(zhàn)
- 琢石成器:Windows環(huán)境下32位匯編語言程序設(shè)計
- C++面向?qū)ο蟪绦蛟O(shè)計習(xí)題解答與上機(jī)指導(dǎo)(第三版)
- Learning JavaScript Data Structures and Algorithms
- INSTANT Sinatra Starter
- Creating Mobile Apps with jQuery Mobile(Second Edition)
- Developing SSRS Reports for Dynamics AX
- Kotlin極簡教程
- Java Web開發(fā)實例大全(基礎(chǔ)卷) (軟件工程師開發(fā)大系)
- Delphi開發(fā)典型模塊大全(修訂版)
- 貫通Tomcat開發(fā)
- 計算機(jī)應(yīng)用基礎(chǔ)(第二版)