最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

大神的學(xué)習(xí)筆記-深入理解Linux內(nèi)核(超完整版)

2022-04-27 14:05 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

第一章、緒論

1.Unix文件可以是下列類型之一:

a.正規(guī)文件(regular file)?

b.目錄(directroy)?

?c.符號(hào)鏈(symbolic link)?

?d.塊設(shè)備文件(block-oriented device file)?

?e.字符設(shè)備文件(charactor-oriented device file)?

?f.管道(pipe)命名管道(named pipe)(即FIFO)?

?h.套接字(socket)

2.內(nèi)核分配給進(jìn)程的虛擬地址空間由以下內(nèi)存區(qū)域組成:

a.程序的可執(zhí)行代碼?

b.程序的初始化數(shù)據(jù)?

?c.程序的未初始化數(shù)據(jù)?

?d.初始程序棧(即用戶態(tài)棧)?

?e.需要共享的庫(kù)的可執(zhí)行代碼和數(shù)據(jù)?

?f.堆(由程序動(dòng)態(tài)請(qǐng)求的內(nèi)存)

3.設(shè)備驅(qū)動(dòng)程序

  • 內(nèi)核通過設(shè)備驅(qū)動(dòng)程序(device driver)與I/O設(shè)備打交道。設(shè)備驅(qū)動(dòng)程序包含在內(nèi)核中,由控制一個(gè)或多個(gè)設(shè)備的數(shù)據(jù)結(jié)構(gòu)和函數(shù)組成。

  • 這些設(shè)備包括硬盤、鍵盤、鼠標(biāo)和監(jiān)視器等。通過特定的接口,每個(gè)驅(qū)動(dòng)程序與內(nèi)核中的其余部分(甚至與其他驅(qū)動(dòng)程序)相互作用:

  • 優(yōu)點(diǎn):

  • 1.可以把特定設(shè)備的代碼封裝在特定的模塊中。

  • 2.廠商可以不懂內(nèi)核代碼,只知道接口規(guī)范,就能增加新的設(shè)備。

  • 3.內(nèi)核以統(tǒng)一的方式對(duì)待所有的設(shè)備,并且通過相同的接口訪問這些設(shè)備。

  • 4.可以把設(shè)備驅(qū)動(dòng)程序?qū)懗赡K,并動(dòng)態(tài)裝到內(nèi)核中,不需要重啟系統(tǒng),不需要的時(shí)候可以卸載模塊,以減少存儲(chǔ)在RAM中的內(nèi)核映像大小。


第二章、進(jìn)程

1.進(jìn)程狀態(tài):

a.可運(yùn)行狀態(tài)?

b.可中斷狀態(tài)?

c.不可中斷的等待狀態(tài)?

d.暫停狀態(tài)?

e.僵死狀態(tài)


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。∏?00名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?


第三章、進(jìn)程調(diào)度

1.涉及進(jìn)程調(diào)度

a.傳統(tǒng)上把進(jìn)程分類:

  • I/O范圍(I/O-bound):頻繁地使用I/O設(shè)備,并花費(fèi)很多時(shí)間等待I/O操作的完成。

  • CPU范圍(CPU-bound):需要大量CPU時(shí)間的數(shù)值計(jì)算應(yīng)用程序。

b.非傳統(tǒng)分類:


  • 交互式進(jìn)程:如命令shell、文本編輯程序及圖像應(yīng)用程序。

  • 批處理進(jìn)程:如編譯程序、數(shù)據(jù)庫(kù)搜索引擎及科學(xué)計(jì)算。

  • 實(shí)時(shí)進(jìn)程:視頻和音頻應(yīng)用程序、機(jī)器人控制程序及從物理傳感器上收集數(shù)據(jù)的程序。

第四章、內(nèi)核同步

1.內(nèi)核同步,內(nèi)核態(tài)進(jìn)程的非搶占性:

a.在內(nèi)核態(tài)中運(yùn)行的進(jìn)程不會(huì)被其他進(jìn)程取代,除非這個(gè)進(jìn)程主動(dòng)放棄CPU的控制權(quán)?

b.中斷或異常處理可以中斷在內(nèi)核態(tài)中運(yùn)行的進(jìn)程。但是,在中斷處理程序結(jié)束時(shí),該進(jìn)程的內(nèi)核控制路徑被恢復(fù)?

c.執(zhí)行中斷或異常處理的內(nèi)核控制路徑只能被執(zhí)行中斷或異常處理的其他內(nèi)核控制路徑所中斷

2.SMP原子操作 從Intel 80286開始引入lock指令解決這中問題。

  1. lock只是一個(gè)用于一條匯編指令之前的特殊字節(jié)。當(dāng)控制單元檢測(cè)到一個(gè)lock字節(jié)時(shí),就鎖定內(nèi)存總線

  2. 這樣其他處理器就不能存取下一條匯編語言指令的目的操作數(shù)所指定的內(nèi)存單元。只有在這條指令執(zhí)行完成時(shí)總線鎖才會(huì)被釋放。

  3. 因此,帶有l(wèi)ock前綴的讀-修改-寫指令即使在多處理器環(huán)境中也是原子的。

  4. 內(nèi)核數(shù)據(jù)結(jié)構(gòu)進(jìn)行同步訪問的常用方法是使用信號(hào)量和自旋鎖。

第五章、虛擬文件系統(tǒng)

1.通用文件模型由下列對(duì)象類型組成:

a.超級(jí)塊對(duì)象(superblock object):存放已安裝文件系統(tǒng)的有關(guān)信息。對(duì)于基于磁盤的文件系統(tǒng),這類對(duì)象通常對(duì)應(yīng)于存放在磁盤上的文件系統(tǒng)控制塊(filesystem control block)。?

b.索引節(jié)點(diǎn)對(duì)象(inode object):存放關(guān)于具體文件的一般信息。對(duì)于基于磁盤的文件系統(tǒng),這類對(duì)象通常對(duì)應(yīng)于存放在磁盤上的文件控制塊(file control block)。每個(gè)索引節(jié)點(diǎn)對(duì)象都有一個(gè)索引節(jié)點(diǎn)號(hào),這個(gè)號(hào)唯一地標(biāo)識(shí)文件系統(tǒng)中的指定文件。?

c.文件對(duì)象(file object):存放打開文件與進(jìn)程之間交互的相關(guān)信息。這類信息僅當(dāng)進(jìn)程訪問文件期間存在于內(nèi)核內(nèi)存中。?

d.目錄項(xiàng)對(duì)象(dentry object):存放目錄項(xiàng)與對(duì)應(yīng)文件進(jìn)行連接的信息。每個(gè)基于磁盤的文件系統(tǒng)都以自己特有的方式將該類信息存在磁盤上。

slab分配高速緩存中。

e.進(jìn)程->文件對(duì)象->目錄項(xiàng)對(duì)象->索引節(jié)點(diǎn)->(超級(jí)塊對(duì)象)->磁盤文件。

2.虛擬文件系統(tǒng),目錄項(xiàng)對(duì)象屬于以下四種狀態(tài)之一:

a.空閑狀態(tài): 還沒有被VFS使用,對(duì)于德內(nèi)存區(qū)由slab分配器進(jìn)行管理。?

b.未使用狀態(tài):該目錄項(xiàng)對(duì)象當(dāng)前還沒有被內(nèi)核使用。該對(duì)象的引用計(jì)數(shù)器d_count為NULL。但其d_indoe域只想相關(guān)索引節(jié)點(diǎn)。為了必要時(shí)回收內(nèi)存,目錄項(xiàng)包含有效信息,它的內(nèi)存可能被丟失。?

c.正在使用狀態(tài):該對(duì)象被內(nèi)核使用。d_count的值為正數(shù)。目錄項(xiàng)包含有效的信息,并且不能被丟棄。?

d.負(fù)狀態(tài):與目錄項(xiàng)相關(guān)的索引節(jié)點(diǎn)不復(fù)存在,那是因?yàn)橄鄳?yīng)的磁盤索引節(jié)點(diǎn)已被刪除,d_count域被置NULL。


第六章、管理I/O設(shè)備

1.三類內(nèi)存地址:

a.邏輯地址(CPU內(nèi)部使用)?

b.線性地址(CPU內(nèi)部使用)?

c.物理地址(CPU從物理上驅(qū)動(dòng)數(shù)據(jù)總線所用的內(nèi)存地址)?

d.總線地址(bus address):除CPU之外的硬件設(shè)備驅(qū)動(dòng)數(shù)據(jù)總線所用的內(nèi)存地址。

2.設(shè)備文件(mknod()系統(tǒng)調(diào)用來創(chuàng)建設(shè)備文件):用來表示Linux所支持的大部分I/O設(shè)備的,除了文件名,每個(gè)設(shè)備文件都還有三個(gè)主要屬性。

a.類型(type):塊設(shè)備或字符設(shè)備?

b.主號(hào)(major number):從1到255之間的一個(gè)數(shù),用以標(biāo)識(shí)設(shè)備的類型,通常,具有相同主號(hào)和相同類型的所有設(shè)備文件共享相同的文件操作集合。因?yàn)樗麄兪怯赏辉O(shè)備驅(qū)動(dòng)程序處理的。?

c.次號(hào)(minor number):在一組主號(hào)相同的設(shè)備之間唯一標(biāo)識(shí)特定設(shè)備所使用的一個(gè)數(shù)字。

3.沒有對(duì)應(yīng)設(shè)備文件的I/O設(shè)備

  1. 比如網(wǎng)卡:網(wǎng)卡把向外發(fā)送的數(shù)據(jù)放入通往遠(yuǎn)程計(jì)算機(jī)系統(tǒng)的一條線上,把從遠(yuǎn)程系統(tǒng)中接受到的報(bào)文裝入內(nèi)核內(nèi)存。

  2. 由于沒有使用文件系統(tǒng),所以系統(tǒng)管理員必須建立設(shè)備名和網(wǎng)絡(luò)地址之間的聯(lián)系。

  3. 應(yīng)用程序和網(wǎng)絡(luò)接口之間的數(shù)據(jù)通信不是基于標(biāo)準(zhǔn)的有關(guān)文件的系統(tǒng)調(diào)用。

  4. 而是基于socket()、bind()、listen()、accept()和connect()系統(tǒng)調(diào)用。

  5. 這些系統(tǒng)調(diào)用對(duì)網(wǎng)絡(luò)地址進(jìn)行操作。這組系統(tǒng)調(diào)用由Unix BSD中首先引入,現(xiàn)在已經(jīng)成為網(wǎng)絡(luò)設(shè)備的標(biāo)準(zhǔn)變成模型。

4.VFS對(duì)設(shè)備文件的處理:設(shè)備文件也在系統(tǒng)的目錄數(shù)中。但它們和正規(guī)文件及目錄有根本的不同。當(dāng)進(jìn)程訪問正規(guī)文件時(shí),

  1. 它會(huì)通過文件系統(tǒng)訪問磁盤分區(qū)的一些數(shù)據(jù)塊;而在進(jìn)程訪問設(shè)備文件時(shí),它只要驅(qū)動(dòng)硬件設(shè)備就可以了。VFS的責(zé)任是為應(yīng)用程序隱藏設(shè)備文件與正規(guī)文件之間的差異。

  2. VFS改變打開的設(shè)備文件的缺省文件操作??梢园褜?duì)設(shè)備文件的任一系統(tǒng)調(diào)用轉(zhuǎn)換成對(duì)設(shè)備相關(guān)的函數(shù)的調(diào)用,而不是對(duì)主文件系統(tǒng)對(duì)于函數(shù)的調(diào)用。

  3. 設(shè)備相關(guān)的函數(shù)對(duì)硬件設(shè)備進(jìn)行操作以完成進(jìn)程所請(qǐng)求的操作。

  4. 驅(qū)動(dòng)程序:控制I/O設(shè)備的一組相關(guān)的函數(shù)稱為設(shè)備驅(qū)動(dòng)程序(device driver)。由于每個(gè)設(shè)備都有一個(gè)唯一的I/O控制器,因此也就有唯一的命令和唯一的狀態(tài)信息,所以大部分I/O設(shè)備類型都有自己的驅(qū)動(dòng)程序。


5.設(shè)備文件調(diào)用open()函數(shù)執(zhí)行的操作:

a.如果設(shè)備驅(qū)動(dòng)程序被包含在一個(gè)內(nèi)核模塊中,那么把引用計(jì)數(shù)器的值加1,以便只有把設(shè)備文件關(guān)閉之后才能卸載這個(gè)模塊。?

b.如果設(shè)備驅(qū)動(dòng)程序要處理多個(gè)同類型的設(shè)備,那么就是用次號(hào)來選擇合適的驅(qū)動(dòng)程序,如果需要,還要使用專門的文件操作表選擇驅(qū)動(dòng)程序。?

c.檢查該設(shè)備是否真正存在,現(xiàn)在是否正在工作。?

d.如果必要,向硬件設(shè)備發(fā)送一個(gè)初始化命令序列。?

e.初始化設(shè)備驅(qū)動(dòng)程序的數(shù)據(jù)結(jié)構(gòu)。

6.內(nèi)核支持的級(jí)別

a.根本不支持:應(yīng)用程序使用設(shè)當(dāng)?shù)膇n和out匯編語言指令直接與設(shè)備的I/O端口進(jìn)行交互。?

b.最小支持:內(nèi)核不能設(shè)別硬件設(shè)備,但能識(shí)別I/O接口。用戶程序把I/O接口是為能夠讀寫字符流的順序設(shè)備。?

c.擴(kuò)展支持:內(nèi)核設(shè)備硬件設(shè)備,并處理I/O設(shè)備本身,事實(shí)上,這種設(shè)備可能就沒有對(duì)應(yīng)的設(shè)備文件。

7.訪問I/O設(shè)備的地址,可以從/proc/ioports文件中獲得。

8.內(nèi)核對(duì)于塊設(shè)備的支持特點(diǎn):

a.通過VFS提供統(tǒng)一接口?

b.對(duì)磁盤數(shù)據(jù)進(jìn)行有效的鏈接?

c.為數(shù)據(jù)提供磁盤高速緩存

9.內(nèi)核基本上把I/O數(shù)據(jù)傳送劃分成兩類:

a.緩沖區(qū)I/O操作:所傳送的數(shù)據(jù)保存在緩沖區(qū)中,緩沖區(qū)是磁盤數(shù)據(jù)在內(nèi)核中的普通內(nèi)存容器。每個(gè)緩沖區(qū)都和一個(gè)特定的塊相關(guān)聯(lián)而這個(gè)塊由一個(gè)設(shè)備號(hào)和一個(gè)塊號(hào)來標(biāo)識(shí)?

b.頁I/O操作:所傳輸?shù)臄?shù)據(jù)保存在頁框中,每個(gè)頁框包含的數(shù)據(jù)都屬于正規(guī)文件。因?yàn)闆]有必要把這種數(shù)據(jù)存放在相鄰的磁盤中。

  • 所以就是用文件的索引節(jié)點(diǎn)和文件內(nèi)的偏移量來標(biāo)識(shí)這種數(shù)據(jù)。主要用于讀取正規(guī)文件、文件內(nèi)存映射和交換。

10.所謂塊(block):就是塊設(shè)備驅(qū)動(dòng)程序在一次單獨(dú)操作中所傳送的一大塊相鄰字節(jié)。

  • 扇區(qū)(sector):扇區(qū)是硬件設(shè)備傳送數(shù)據(jù)的基本單元。

11.塊設(shè)備驅(qū)動(dòng)程序的兩部分:

a.高級(jí)驅(qū)動(dòng)程序:處理VFS層。?

b.低級(jí)驅(qū)動(dòng)程序:處理硬件設(shè)備。


第七章、訪問正規(guī)文件

1.從正規(guī)文件讀取數(shù)據(jù):generic_file_read()函數(shù)實(shí)現(xiàn)了大部分文件系統(tǒng)的正規(guī)文件的read方法。

2.對(duì)正規(guī)文件進(jìn)行預(yù)讀:正規(guī)文件的預(yù)讀需要的算法比物理塊的預(yù)讀需要的算法更復(fù)雜:

a.由于數(shù)據(jù)是逐頁進(jìn)行讀取的,因此預(yù)讀算法不必考慮頁內(nèi)偏移量,只考慮所訪問的頁在文件內(nèi)部的位置就可以了。?

b.當(dāng)前訪問與上一次訪問不是順序的時(shí),預(yù)讀就必須從頭開始重新執(zhí)行。?

c.當(dāng)進(jìn)程一直反復(fù)地訪問同一頁時(shí)(該文件只有很少的一部分被使用),應(yīng)該減慢預(yù)讀的速度甚至停止執(zhí)行。?

d.如果需要,預(yù)讀算法必須激活低級(jí)I/O設(shè)備驅(qū)動(dòng)程序來確保新頁會(huì)被讀取。?

e.內(nèi)核通過多次調(diào)用一個(gè)名為:try_to_read_ahead()的函數(shù)來執(zhí)行預(yù)讀操作(read ahead operation),一次預(yù)讀一頁。?

f.對(duì)于每個(gè)請(qǐng)求頁,內(nèi)核都要調(diào)用generic_file_readhead()函數(shù),該函數(shù)確定是否要執(zhí)行預(yù)讀操作。

3.寫正規(guī)文件:write()系統(tǒng)調(diào)用會(huì)涉及把數(shù)據(jù)從調(diào)用進(jìn)程的用戶態(tài)地址空間中移動(dòng)到內(nèi)核數(shù)據(jù)結(jié)構(gòu)中,然后再移動(dòng)到磁盤上。

  • 文件對(duì)象的write方法允許每種文件類型都定義一個(gè)專用的寫操作。

a.寫操作發(fā)生時(shí),有效數(shù)據(jù)是在緩沖區(qū)高速緩存中,而不是在頁高速緩存中,更確切地說,當(dāng)write方法修改了文件的任何部分時(shí)。與這些部分對(duì)應(yīng)的頁高速緩存中的所有頁都不再包含有效數(shù)據(jù)。一個(gè)進(jìn)程可能認(rèn)為自己在讀取正確數(shù)據(jù),但是卻沒看到其他進(jìn)程對(duì)這些數(shù)據(jù)所做的修改。?

b.所有基于磁盤的文件系統(tǒng)的write方法都要調(diào)用update_vm_cache()函數(shù)來修改讀操作所使用的頁高速緩存。?

c.通過頁高速緩存對(duì)正規(guī)文件執(zhí)行的寫操作,只能用于網(wǎng)絡(luò)文件系統(tǒng)。文件的write方法是使用generic_file_write()函數(shù)實(shí)現(xiàn)。

4.內(nèi)存映射:一個(gè)線性區(qū)可以和基于磁盤的文件系統(tǒng)中的一個(gè)文件(或者文件的一部分)相關(guān)聯(lián)。這就是說,內(nèi)核會(huì)把線性區(qū)中對(duì)一個(gè)頁中字節(jié)的訪問轉(zhuǎn)換成對(duì)正規(guī)文件中相對(duì)于字節(jié)的操作,這種技術(shù)成為內(nèi)存映射。

a.共享的:對(duì)線性區(qū)中的任何寫操作都會(huì)修改磁盤上的文件。而且,如果進(jìn)程對(duì)共享內(nèi)存映射中的一個(gè)頁進(jìn)行寫,那么這種修改對(duì)于其他映射了相同文件的所有進(jìn)程來說都是可見的。?

b.私有的:當(dāng)進(jìn)程創(chuàng)建的映射只是為讀文件,而不是寫文件時(shí)才會(huì)使用。處于這種目的,私有映射的效率要比共享映射的效率更高。但是私有映射頁的認(rèn)識(shí)寫操作都會(huì)使內(nèi)核不再映射該文件中的頁。一個(gè)寫操作即不會(huì)改磁盤上的文件,對(duì)訪問相同文件的其他進(jìn)程來說這種改變也是不可見的。?

c.使用mmap()系統(tǒng)調(diào)用創(chuàng)建一個(gè)新的內(nèi)存映射。必須指定MAP_SHARED或MAP_PRIVATE標(biāo)志。


第八章、磁盤數(shù)據(jù)結(jié)構(gòu)

1.任何Ext2分區(qū)中的第一個(gè)塊從不受Ext2文件系統(tǒng)的管理,因?yàn)檫@一塊是為啟動(dòng)扇區(qū)所保留的。Ext2分區(qū)的其余部分被分成塊組(block group)。

2.塊組中的每個(gè)塊包含下列信息之一:

a.一個(gè)Ext2文件系統(tǒng)超級(jí)塊的拷貝?

b.一組塊組描述符的拷貝?

c.一個(gè)數(shù)據(jù)塊位圖:標(biāo)識(shí)在一組中塊的使用和空閑狀況。?

d.一個(gè)索引節(jié)點(diǎn)位圖 e.一組索引節(jié)點(diǎn) f.屬于文件的一塊數(shù)據(jù);即一個(gè)數(shù)據(jù)塊。

3.如果一個(gè)塊中不包含任何有意義的信息,就說這個(gè)塊是空的。

4.在Ext2文件系統(tǒng)中的所有塊組大小相同并被順序存放,因此,內(nèi)核可以從塊組的整數(shù)索引很容易地得到磁盤中一個(gè)塊組的位置。

5.超級(jí)塊與組描述符被復(fù)制到每個(gè)塊組中。只有塊組0中所包含的超級(jí)塊和描述符才由內(nèi)核使用,而其余的超級(jí)塊和組描述符保持不變事實(shí)上,內(nèi)核甚至不考慮它們。

6./sbin/e2fsck程序?qū)xt2文件系統(tǒng)的狀態(tài)執(zhí)行一致性檢查時(shí),就引用存放在塊組0中的超級(jí)塊和組描述符,然后把它們拷貝到其他所有的塊組中。

7.每組之多有8 x b塊,b是以字節(jié)單位的塊大小。

8.示例:

  • 8GB的Ext2分區(qū)

  • 塊的大小為4KB

  • 塊位圖的大小4KB(b=4KB)

  • 最多描述32KB的數(shù)據(jù)塊

  • 每個(gè)塊組的容量:4KB x 32KB = 128MB

  • 最多需要的塊組數(shù): n = 8GB/128MB = 64

9.磁盤數(shù)據(jù)結(jié)構(gòu):

a.超級(jí)塊的域:

  • 索引節(jié)點(diǎn)的總數(shù)

  • 以塊位單位的文件系統(tǒng)的大小

  • 保留的塊數(shù)

  • 空閑塊計(jì)數(shù)器空閑索引節(jié)點(diǎn)計(jì)數(shù)器

  • 第一次使用的塊號(hào)(總為1)

  • 塊的大小

  • 片的大小

  • 每組中的塊數(shù)

  • 每組中的片數(shù) ..... b.組描述符:每個(gè)塊組有自己的組描述符,為ext2_group_desc結(jié)構(gòu)。

  • Ext2組描述符的域

  • 塊位圖的塊號(hào)

  • 索引節(jié)點(diǎn)位圖的塊號(hào)

  • 第一個(gè)索引節(jié)點(diǎn)表塊的塊號(hào)

  • 組中空閑塊的個(gè)數(shù)

  • 組中索引節(jié)點(diǎn)的個(gè)數(shù)

  • 組中目錄的個(gè)數(shù)

  • ..... c.位圖:是位的序列,0表示相應(yīng)的索引節(jié)點(diǎn)塊或數(shù)據(jù)塊是空閑的,1表示占用。 d.索引節(jié)點(diǎn)表:所有索引節(jié)點(diǎn)的大小相同,即128字節(jié)。索引節(jié)點(diǎn)表第一個(gè)塊的塊號(hào)存放在組描述符的bg_inode_table域中。

  • Ext2磁盤索引節(jié)點(diǎn)的域:

  • 文件類型和訪問權(quán)限

  • 擁有者的標(biāo)識(shí)符

  • 以字節(jié)為單位的文件長(zhǎng)度

  • 最后一次文件訪問的時(shí)間 .......

  • 文件的索引節(jié)點(diǎn)號(hào)沒有必要再磁盤上存放,因?yàn)樗闹悼梢詮膲K組號(hào)和它在索引節(jié)點(diǎn)表中的相對(duì)于位置而得出。

10.Ext2的文件操作:

  • VFS方法的read和mmap是由很多文件系統(tǒng)共用的通用函數(shù)實(shí)現(xiàn)的。這些方法存放在ext2_file_operations表中:

  • lseek -> ext2_file_lseek()

  • read ?-> generic_file_read()

  • write -> ext2_file_write() .......

11.各種文件類型如何使用磁盤塊

  • 正規(guī)文件:正規(guī)文件只有在開始有數(shù)據(jù)時(shí)才需要數(shù)據(jù)塊。

  • 目錄:Ext2以一種特殊的文件實(shí)現(xiàn)了目錄,這種文件的數(shù)據(jù)塊存放了文件名和相應(yīng)的所有節(jié)點(diǎn)號(hào)。

  • 數(shù)據(jù)塊中包含了類型為ext2_dir_entry_2的結(jié)構(gòu)

  • 名字域最大為EXT2_NAME_LEN(通常是255)個(gè)字符的邊長(zhǎng)數(shù)組。

  • 目錄項(xiàng)的長(zhǎng)度是4的倍數(shù)

  • 符號(hào)鏈:符號(hào)鏈的路徑名達(dá)到60個(gè)字符,就把它存放在索引節(jié)點(diǎn)的i_blocks域,該域是由15個(gè)4字節(jié)整數(shù)組成的數(shù)組,因此無需數(shù)據(jù)塊

  • 如果路徑名大于60個(gè)字符,就需要一個(gè)單獨(dú)的數(shù)據(jù)塊。

  • 設(shè)備文件、管道和套接字:這些類型的文件不需要數(shù)據(jù)塊,所有必須的信息都存放在索引節(jié)點(diǎn)中。

12.Ext2文件的類型

  • 0 未知

  • 1 正規(guī)文件

  • 2 目錄

  • 3 字符設(shè)備

  • 4 塊設(shè)備

  • 5 命名管道

  • 6 套接字

  • 7 符號(hào)鏈

13.文件的洞是正規(guī)文件的一部分,它是一些空字符但沒有存放在磁盤的任何數(shù)據(jù)塊中。

  • 引入文件的洞是為了避免磁盤空間的浪費(fèi)。它們被廣泛地用在數(shù)據(jù)庫(kù)引用中,更一般的說,用于文件上散列法的所有應(yīng)用。 第十八章 進(jìn)程通信 1.進(jìn)程間通信的機(jī)制: 管道和FIFO(管道):最適合在進(jìn)程之間實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者的交互。有些進(jìn)程往管道中寫入數(shù)據(jù),而另外一些進(jìn)程則從管道中讀取數(shù)據(jù)。 無名管道:用戶無法打開一個(gè)現(xiàn)有的管道。除非管道是由一個(gè)公共的祖先進(jìn)程創(chuàng)建的。 有名管道:有磁盤索引節(jié)點(diǎn),因此任何進(jìn)程都可以訪問FIFO,沒有使用數(shù)據(jù)塊,使用內(nèi)核緩沖區(qū)。 信號(hào)量IPC(Interprocess Communicatoin),表示一組系統(tǒng)調(diào)用,這組系統(tǒng)調(diào)用 允許用戶態(tài)進(jìn)程: a.通過信號(hào)量和其他進(jìn)程進(jìn)行同步 b.向其他進(jìn)程發(fā)送消息或者從其他進(jìn)程處接受消息 c.和其他進(jìn)程共享一個(gè)線性區(qū) 使用IPC資源: 信號(hào)量:semget() 消息隊(duì)列:msgget() 共享內(nèi)存:shmget() 消息:允許進(jìn)程異步地交換信息(小塊數(shù)據(jù))??梢哉J(rèn)為消息是傳遞附加信息的信號(hào)。 共享內(nèi)存:當(dāng)進(jìn)程之間在高效地共享大量數(shù)據(jù)時(shí),這是一種最合適的交互方式。 套接字(socket):涉及到網(wǎng)絡(luò)相關(guān)。


第九章、程序的執(zhí)行

1.進(jìn)程概念:在Unix中是用來表示正在運(yùn)行的一組程序競(jìng)爭(zhēng)系統(tǒng)資源的行為。

2.內(nèi)核需要處理的問題(把一組指令裝入內(nèi)存并讓CPU執(zhí)行):

不同的可執(zhí)行文件格式: Linux的一個(gè)著名之處就是能執(zhí)行其他操作系統(tǒng)所編譯的二進(jìn)制文件。 共享庫(kù):很多可執(zhí)行文件并不包含運(yùn)行程序所需要的所有代碼,而是希望在運(yùn)行時(shí)由內(nèi)核從函數(shù)庫(kù)裝入函數(shù)。 執(zhí)行上下文中的其他信息:包括程序員熟悉的命令行參數(shù)與環(huán)境變量。

3.進(jìn)程的信任狀和能力:Unix系統(tǒng)與每個(gè)進(jìn)程的一些信任相關(guān),信任狀把進(jìn)程與一個(gè)特定的用戶或用戶組捆綁在一起。

信任狀在多用戶系統(tǒng)上尤為重要,因?yàn)樾湃螤羁梢詻Q定每個(gè)進(jìn)程能做什么,不能做什么,這樣既保證了每個(gè)用戶個(gè)人數(shù)據(jù)的完整性也保證了系統(tǒng)整體上的穩(wěn)定性。

a.進(jìn)程的能力:一種能力僅僅是一個(gè)標(biāo)志,它表明是否允許進(jìn)程執(zhí)行一個(gè)特定的操作或一組特定的操作。

4.庫(kù):所有的全局外部符號(hào)名的線性地址。這些地址的分配或解析是由連接程序完成的,鏈接程序把程序所有的目標(biāo)文件收集起來并構(gòu)造可執(zhí)行文件。

5.靜態(tài)庫(kù)/共享庫(kù)


動(dòng)態(tài)庫(kù)的優(yōu)缺點(diǎn):進(jìn)程不需要拷貝目標(biāo)代碼、僅僅執(zhí)行一個(gè)內(nèi)存映射,把庫(kù)文件的相關(guān)部分映射到進(jìn)程的地址空間中。 缺點(diǎn)也很明顯,動(dòng)態(tài)的啟動(dòng)時(shí)間較長(zhǎng),移植性也不如靜鏈接的好,系統(tǒng)中所包含的庫(kù)版本發(fā)生變化時(shí), 動(dòng)態(tài)庫(kù)連接的程序可能不適合本地運(yùn)行。 靜態(tài)庫(kù)的優(yōu)缺點(diǎn):占用大量的磁盤空間。每個(gè)靜態(tài)連接的可執(zhí)行文件都復(fù)制庫(kù)代碼的一部分。 gcc編譯器提供-static選項(xiàng)告訴鏈接程序使用靜態(tài)庫(kù)。

6.程序段和進(jìn)程的線性區(qū):

  • 邏輯上,Unix程序的線性地址空間傳統(tǒng)上被劃分為幾個(gè)叫段(segment)的區(qū)間: a.正文段:包含可執(zhí)行代碼。 b.數(shù)據(jù)段:包含初始化的數(shù)據(jù),也就是說,初始值存放在可執(zhí)行文件中的所有靜態(tài)變量和全局變量(因?yàn)槌绦蛟趩?dòng)時(shí)必須知道它們的值) c.bss段:包含未初始化的數(shù)據(jù),也就是說,初值沒有存放在可執(zhí)行文件中的所有全局變量(因?yàn)槌绦蛟谝盟鼈冎安刨x值) d.堆棧段:包含程序的堆棧,堆棧中有返回地址、參數(shù)和被執(zhí)行函數(shù)的局部變量。

堆:線性區(qū)包含動(dòng)態(tài)分配給進(jìn)程的內(nèi)存區(qū)。 /sbin/init程序,它創(chuàng)建和監(jiān)視在操作系統(tǒng)外層實(shí)現(xiàn)的所有進(jìn)程的活動(dòng)。init進(jìn)程對(duì)應(yīng)的線性區(qū)可以從(/proc/1/maps)文件得到這樣的信息。

7.執(zhí)行跟蹤(execution tracing):是一個(gè)程序監(jiān)視另一個(gè)程序執(zhí)行的一種技術(shù)。被跟蹤的程序一步一步地執(zhí)行,直到接受到一個(gè)信號(hào)或調(diào)用一個(gè)系統(tǒng)調(diào)用。

執(zhí)行跟蹤由調(diào)試程序(debugger)廣泛應(yīng)用,當(dāng)然還使用其他技術(shù)(包括在被調(diào)試程序中插入斷點(diǎn)及運(yùn)行時(shí)訪問它的變量)。

8.ptrace()系統(tǒng)調(diào)用進(jìn)程執(zhí)行跟蹤。設(shè)置了CAP_SYS_PTRACE能力的進(jìn)程可以跟蹤系統(tǒng)中的任何進(jìn)程(除了init)。

  • 相反,沒有CAP_SYS_PTRACE能力的進(jìn)程P只能跟蹤

  • 與P有相同屬主的進(jìn)程。此外,兩個(gè)進(jìn)程不能同時(shí)跟蹤一個(gè)進(jìn)程。 a.ptrace()系統(tǒng)調(diào)用修改被跟蹤進(jìn)程描述符的p_pptr域以使它指向跟蹤進(jìn)程,因此,跟蹤進(jìn)程變?yōu)楸桓欉M(jìn)程的有效父進(jìn)程跟蹤結(jié)束時(shí),以PTRAC_DETACH命令調(diào)用ptrace()時(shí),這個(gè)系統(tǒng)調(diào)用把p_pptr設(shè)置為p_oppter的值,恢復(fù)被跟蹤進(jìn)程原來的父進(jìn)程。 b.被跟蹤進(jìn)程相關(guān)的幾個(gè)監(jiān)控事件為: 一條單獨(dú)匯編指令執(zhí)行的結(jié)束 進(jìn)入一個(gè)系統(tǒng)調(diào)用 從一個(gè)系統(tǒng)調(diào)用退出 接收到一個(gè)信號(hào) c.當(dāng)一個(gè)監(jiān)控的事件發(fā)生時(shí),被跟蹤的程序停止,并將SIGCHID信號(hào)發(fā)送給它的父進(jìn)程。當(dāng)父進(jìn)程希望恢復(fù)子進(jìn)程的執(zhí)行時(shí),就是用PTRACE_CONT、PTRACE_SINGLESTEP和PTRACE_SYSCALL命令中的一條,這取決于父進(jìn)程要監(jiān)控那種事件。

9.可執(zhí)行格式:Linux正式的可執(zhí)行格式是ELF(Execuable and Linking Format)。

  • 類型為linux_binfmt的對(duì)象所描述的可執(zhí)行格式實(shí)質(zhì)上提供以下三種方法: a.loadbinary:通讀存放在可執(zhí)行文件中的信息為當(dāng)前進(jìn)程建立一個(gè)新的執(zhí)行環(huán)境。 b.load_shlib:用于動(dòng)態(tài)地把一個(gè)共享庫(kù)捆綁到一個(gè)已經(jīng)在運(yùn)行的進(jìn)程,這個(gè)是由uselib()系統(tǒng)調(diào)用激活的。 c.core_dump:在名為core的文件中存放當(dāng)前進(jìn)程的執(zhí)行上下文。這個(gè)文件通常是在進(jìn)程接收到一個(gè)缺省操作為"dump"的信號(hào)時(shí)被創(chuàng)建的其格式取決于被執(zhí)行程序的可執(zhí)行類型。linux_binfmt對(duì)象:處于一個(gè)簡(jiǎn)單的連接鏈表中,第一個(gè)元素的地址被存放在formats變量中??梢酝ㄟ^調(diào)用register_binfmt()和unregister_binfmt()函數(shù)在鏈表中插入和刪除元素。formats鏈表中的最后一個(gè)元素:是一個(gè)對(duì)解釋腳本(interpreted script)的可執(zhí)行格式進(jìn)行描述的一個(gè)對(duì)象。定義了load_binary()方法。其相應(yīng)的do_load_script()可執(zhí)行文件是否是以兩個(gè)#!開始,如果是,這個(gè)函數(shù)就以另一個(gè)可執(zhí)行文件的路徑作為參數(shù)解釋第一行的其余部分,并把文件名作為參數(shù)傳遞過去以執(zhí)行這個(gè)腳本文件。

  • Linux允許用戶注冊(cè)自己定義的可執(zhí)行格式:用如下的格式項(xiàng)/proc/sys/fs/binfmt_misc/register文件寫入一個(gè)字符串:name:type:offset:string:mask:interpreter:


  • name:新格式的標(biāo)識(shí)符 type:識(shí)別類型(M表示魔數(shù),E表示擴(kuò)展) offse:魔數(shù)在文件中的起始偏移量 string:或者以魔數(shù),或者以擴(kuò)展名匹配的字節(jié)序列 mask:屏蔽string中的一些位的字符串 interpreter:程序解釋器的完整路徑名

  • 可執(zhí)行文件的前128字節(jié)填充linux_binprm結(jié)構(gòu)的buf域。

  • exec類函數(shù):這些函數(shù)能用可執(zhí)行文件所描述的新上下文代替進(jìn)程的上下文。


大神的學(xué)習(xí)筆記-深入理解Linux內(nèi)核(超完整版)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
疏勒县| 元氏县| 隆尧县| 乌兰浩特市| 吉林市| 望都县| 虎林市| 长春市| 温州市| 刚察县| 古蔺县| 库车县| 开江县| 安徽省| 东至县| 林州市| 郸城县| 商城县| 万盛区| 桦南县| 隆昌县| 广南县| 云林县| 佛学| 卢龙县| 金寨县| 惠州市| 鄯善县| 安西县| 松原市| 金溪县| 栖霞市| 策勒县| 观塘区| 醴陵市| 顺平县| 河东区| 忻城县| 海口市| 瑞安市| 红安县|