官术网_书友最值得收藏!

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)之間的代理。

主站蜘蛛池模板: 封丘县| 进贤县| 西峡县| 东兰县| 呼伦贝尔市| 若尔盖县| 全南县| 福州市| 桃源县| 措美县| 丘北县| 琼结县| 苍溪县| 惠来县| 宣威市| 轮台县| 芦溪县| 阿勒泰市| 普格县| 博白县| 新野县| 天祝| 湘阴县| 保德县| 鄂托克前旗| 怀来县| 平谷区| 琼结县| 灵山县| 金坛市| 合水县| 皋兰县| 竹溪县| 长宁区| 林周县| 曲沃县| 高要市| 广宗县| 新沂市| 惠来县| 汕尾市|