日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

tipi 深入理解php内核 pdf_大牛的学习笔记-深入理解Linux内核(完整版)

發(fā)布時間:2024/10/8 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tipi 深入理解php内核 pdf_大牛的学习笔记-深入理解Linux内核(完整版) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第一章、緒論
1.Unix文件可以是下列類型之一:
a.正規(guī)文件(regular file)
b.目錄(directroy)
c.符號鏈(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.需要共享的庫的可執(zhí)行代碼和數(shù)據(jù)
f.堆(由程序動態(tài)請求的內(nèi)存)
3.設(shè)備驅(qū)動程序
內(nèi)核通過設(shè)備驅(qū)動程序(device driver)與I/O設(shè)備打交道。設(shè)備驅(qū)動程序包含在內(nèi)核中,由控制一個或多個設(shè)備的數(shù)據(jù)結(jié)構(gòu)和函數(shù)組成。
這些設(shè)備包括硬盤、鍵盤、鼠標(biāo)和監(jiān)視器等。通過特定的接口,每個驅(qū)動程序與內(nèi)核中的其余部分(甚至與其他驅(qū)動程序)相互作用:
優(yōu)點:
1.可以把特定設(shè)備的代碼封裝在特定的模塊中。
2.廠商可以不懂內(nèi)核代碼,只知道接口規(guī)范,就能增加新的設(shè)備。
3.內(nèi)核以統(tǒng)一的方式對待所有的設(shè)備,并且通過相同的接口訪問這些設(shè)備。
4.可以把設(shè)備驅(qū)動程序?qū)懗赡K,并動態(tài)裝到內(nèi)核中,不需要重啟系統(tǒng),不需要的時候可以卸載模塊,
以減少存儲在RAM中的內(nèi)核映像大小。第三章、進(jìn)程
1.進(jìn)程狀態(tài):
a.可運行狀態(tài)
b.可中斷狀態(tài)
c.不可中斷的等待狀態(tài)
d.暫停狀態(tài)
e.僵死狀態(tài)第四章、進(jìn)程調(diào)度
1.涉及進(jìn)程調(diào)度
a.傳統(tǒng)上把進(jìn)程分類:
I/O范圍(I/O-bound):頻繁地使用I/O設(shè)備,并花費很多時間等待I/O操作的完成。
CPU范圍(CPU-bound):需要大量CPU時間的數(shù)值計算應(yīng)用程序。
b.非傳統(tǒng)分類:
交互式進(jìn)程:如命令shell、文本編輯程序及圖像應(yīng)用程序。
批處理進(jìn)程:如編譯程序、數(shù)據(jù)庫搜索引擎及科學(xué)計算。
實時進(jìn)程:視頻和音頻應(yīng)用程序、機器人控制程序及從物理傳感器上收集數(shù)據(jù)的程序。第五章、內(nèi)核同步
1.內(nèi)核同步,內(nèi)核態(tài)進(jìn)程的非搶占性:
a.在內(nèi)核態(tài)中運行的進(jìn)程不會被其他進(jìn)程取代,除非這個進(jìn)程主動放棄CPU的控制權(quán)
b.中斷或異常處理可以中斷在內(nèi)核態(tài)中運行的進(jìn)程。但是,在中斷處理程序結(jié)束時,該進(jìn)程的內(nèi)核控制路徑被恢復(fù)
c.執(zhí)行中斷或異常處理的內(nèi)核控制路徑只能被執(zhí)行中斷或異常處理的其他內(nèi)核控制路徑所中斷
2.SMP原子操作 從Intel 80286開始引入lock指令解決這中問題。
lock只是一個用于一條匯編指令之前的特殊字節(jié)。當(dāng)控制單元檢測到一個lock字節(jié)時,就鎖定內(nèi)存總線
這樣其他處理器就不能存取下一條匯編語言指令的目的操作數(shù)所指定的內(nèi)存單元。只有在這條指令執(zhí)行完成時總線鎖才會被釋放。
因此,帶有l(wèi)ock前綴的讀-修改-寫指令即使在多處理器環(huán)境中也是原子的。
3.內(nèi)核數(shù)據(jù)結(jié)構(gòu)進(jìn)行同步訪問的常用方法是使用信號量和自旋鎖。第六章、虛擬文件系統(tǒng)
1.通用文件模型由下列對象類型組成:
a.超級塊對象(superblock object):存放已安裝文件系統(tǒng)的有關(guān)信息。對于基于磁盤的文件系統(tǒng),
這類對象通常對應(yīng)于存放在磁盤上的文件系統(tǒng)控制塊(filesystem control block)。
b.索引節(jié)點對象(inode object):存放關(guān)于具體文件的一般信息。對于基于磁盤的文件系統(tǒng),
這類對象通常對應(yīng)于存放在磁盤上的文件控制塊(file control block)。
每個索引節(jié)點對象都有一個索引節(jié)點號,這個號唯一地標(biāo)識文件系統(tǒng)中的指定文件。
c.文件對象(file object):存放打開文件與進(jìn)程之間交互的相關(guān)信息。這類信息僅當(dāng)進(jìn)程訪問文件期間存在于內(nèi)核內(nèi)存中。
d.目錄項對象(dentry object):存放目錄項與對應(yīng)文件進(jìn)行連接的信息。每個基于磁盤的文件系統(tǒng)都以自己特有的方式將該類信息存在磁盤上。
slab分配高速緩存中。
e.進(jìn)程->文件對象->目錄項對象->索引節(jié)點->(超級塊對象)->磁盤文件。
2.虛擬文件系統(tǒng),目錄項對象屬于以下四種狀態(tài)之一:
a.空閑狀態(tài): 還沒有被VFS使用,對于德內(nèi)存區(qū)由slab分配器進(jìn)行管理。
b.未使用狀態(tài): 該目錄項對象當(dāng)前還沒有被內(nèi)核使用。該對象的引用計數(shù)器d_count為NULL。
但其d_indoe域只想相關(guān)索引節(jié)點。為了必要時回收內(nèi)存,目錄項包含有效信息,它的內(nèi)存可能被丟失。
c.正在使用狀態(tài): 該對象被內(nèi)核使用。d_count的值為正數(shù)。目錄項包含有效的信息,并且不能被丟棄。
d.負(fù)狀態(tài): 與目錄項相關(guān)的索引節(jié)點不復(fù)存在,那是因為相應(yīng)的磁盤索引節(jié)點已被刪除,d_count域被置NULL。第七章、管理I/O設(shè)備
1.三類內(nèi)存地址:
a.邏輯地址(CPU內(nèi)部使用)
b.線性地址(CPU內(nèi)部使用)
c.物理地址(CPU從物理上驅(qū)動數(shù)據(jù)總線所用的內(nèi)存地址)
d.總線地址(bus address):除CPU之外的硬件設(shè)備驅(qū)動數(shù)據(jù)總線所用的內(nèi)存地址。
2.設(shè)備文件(mknod()系統(tǒng)調(diào)用來創(chuàng)建設(shè)備文件):用來表示Linux所支持的大部分I/O設(shè)備的,除了文件名,每個設(shè)備文件都還有三個主要屬性。
a.類型(type):塊設(shè)備或字符設(shè)備
b.主號(major number):從1到255之間的一個數(shù),用以標(biāo)識設(shè)備的類型,通常,具有相同主號和相同類型的所有設(shè)備文件共享相同的文件操作集合。
因為他們是由同一設(shè)備驅(qū)動程序處理的。
c.次號(minor number):在一組主號相同的設(shè)備之間唯一標(biāo)識特定設(shè)備所使用的一個數(shù)字。
3.沒有對應(yīng)設(shè)備文件的I/O設(shè)備
比如網(wǎng)卡:網(wǎng)卡把向外發(fā)送的數(shù)據(jù)放入通往遠(yuǎn)程計算機系統(tǒng)的一條線上,把從遠(yuǎn)程系統(tǒng)中接受到的報文裝入內(nèi)核內(nèi)存。
由于沒有使用文件系統(tǒng),所以系統(tǒng)管理員必須建立設(shè)備名和網(wǎng)絡(luò)地址之間的聯(lián)系。
應(yīng)用程序和網(wǎng)絡(luò)接口之間的數(shù)據(jù)通信不是基于標(biāo)準(zhǔn)的有關(guān)文件的系統(tǒng)調(diào)用。
而是基于socket()、bind()、listen()、accept()和connect()系統(tǒng)調(diào)用。
這些系統(tǒng)調(diào)用對網(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對設(shè)備文件的處理:設(shè)備文件也在系統(tǒng)的目錄數(shù)中。但它們和正規(guī)文件及目錄有根本的不同。當(dāng)進(jìn)程訪問正規(guī)文件時,
它會通過文件系統(tǒng)訪問磁盤分區(qū)的一些
數(shù)據(jù)塊;而在進(jìn)程訪問設(shè)備文件時,它只要驅(qū)動硬件設(shè)備就可以了。VFS的責(zé)任是為應(yīng)用程序隱藏設(shè)備文件與正規(guī)文件之間的差異。
VFS改變打開的設(shè)備文件的缺省文件操作。可以把對設(shè)備文件的任一系統(tǒng)調(diào)用轉(zhuǎn)換成對設(shè)備相關(guān)的函數(shù)的調(diào)用,而不是對主文件系統(tǒng)對于函數(shù)的調(diào)用。
設(shè)備相關(guān)的函數(shù)對硬件設(shè)備進(jìn)行操作以完成進(jìn)程所請求的操作。
驅(qū)動程序:控制I/O設(shè)備的一組相關(guān)的函數(shù)稱為設(shè)備驅(qū)動程序(device driver)。由于每個設(shè)備都有一個唯一的I/O控制器,因此也就有唯一的
命令和唯一的狀態(tài)信息,所以大部分I/O設(shè)備類型都有自己的驅(qū)動程序。
5.設(shè)備文件調(diào)用open()函數(shù)執(zhí)行的操作:
a.如果設(shè)備驅(qū)動程序被包含在一個內(nèi)核模塊中,那么把引用計數(shù)器的值加1,以便只有把設(shè)備文件關(guān)閉之后才能卸載這個模塊。
b.如果設(shè)備驅(qū)動程序要處理多個同類型的設(shè)備,那么就是用次號來選擇合適的驅(qū)動程序,如果需要,還要使用專門的文件操作表選擇驅(qū)動程序。
c.檢查該設(shè)備是否真正存在,現(xiàn)在是否正在工作。
d.如果必要,向硬件設(shè)備發(fā)送一個初始化命令序列。
e.初始化設(shè)備驅(qū)動程序的數(shù)據(jù)結(jié)構(gòu)。
6.內(nèi)核支持的級別
a.根本不支持:應(yīng)用程序使用設(shè)當(dāng)?shù)膇n和out匯編語言指令直接與設(shè)備的I/O端口進(jìn)行交互。
b.最小支持:內(nèi)核不能設(shè)別硬件設(shè)備,但能識別I/O接口。用戶程序把I/O接口是為能夠讀寫字符流的順序設(shè)備。
c.擴展支持:內(nèi)核設(shè)備硬件設(shè)備,并處理I/O設(shè)備本身,事實上,這種設(shè)備可能就沒有對應(yīng)的設(shè)備文件。
7.訪問I/O設(shè)備的地址,可以從/proc/ioports文件中獲得。
8.內(nèi)核對于塊設(shè)備的支持特點:
a.通過VFS提供統(tǒng)一接口
b.對磁盤數(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)存容器。每個緩沖區(qū)都和一個特定的塊相關(guān)聯(lián)
而這個塊由一個設(shè)備號和一個塊號來標(biāo)識
b.頁I/O操作:所傳輸?shù)臄?shù)據(jù)保存在頁框中,每個頁框包含的數(shù)據(jù)都屬于正規(guī)文件。因為沒有必要把這種數(shù)據(jù)存放在相鄰的磁盤中。
所以就是用文件的索引節(jié)點和文件內(nèi)的偏移量來標(biāo)識這種數(shù)據(jù)。主要用于讀取正規(guī)文件、文件內(nèi)存映射和交換。
10.所謂塊(block):就是塊設(shè)備驅(qū)動程序在一次單獨操作中所傳送的一大塊相鄰字節(jié)。
扇區(qū)(sector):扇區(qū)是硬件設(shè)備傳送數(shù)據(jù)的基本單元。
11.塊設(shè)備驅(qū)動程序的兩部分:
a.高級驅(qū)動程序:處理VFS層。
b.低級驅(qū)動程序:處理硬件設(shè)備。第八章、訪問正規(guī)文件
1.從正規(guī)文件讀取數(shù)據(jù):generic_file_read()函數(shù)實現(xiàn)了大部分文件系統(tǒng)的正規(guī)文件的read方法。
2.對正規(guī)文件進(jìn)行預(yù)讀:正規(guī)文件的預(yù)讀需要的算法比物理塊的預(yù)讀需要的算法更復(fù)雜:
a.由于數(shù)據(jù)是逐頁進(jìn)行讀取的,因此預(yù)讀算法不必考慮頁內(nèi)偏移量,只考慮所訪問的頁在文件內(nèi)部的位置就可以了。
b.當(dāng)前訪問與上一次訪問不是順序的時,預(yù)讀就必須從頭開始重新執(zhí)行。
c.當(dāng)進(jìn)程一直反復(fù)地訪問同一頁時(該文件只有很少的一部分被使用),應(yīng)該減慢預(yù)讀的速度甚至停止執(zhí)行。
d.如果需要,預(yù)讀算法必須激活低級I/O設(shè)備驅(qū)動程序來確保新頁會被讀取。
e.內(nèi)核通過多次調(diào)用一個名為:try_to_read_ahead()的函數(shù)來執(zhí)行預(yù)讀操作(read ahead operation),一次預(yù)讀一頁。
f.對于每個請求頁,內(nèi)核都要調(diào)用generic_file_readhead()函數(shù),該函數(shù)確定是否要執(zhí)行預(yù)讀操作。
3.寫正規(guī)文件:write()系統(tǒng)調(diào)用會涉及把數(shù)據(jù)從調(diào)用進(jìn)程的用戶態(tài)地址空間中移動到內(nèi)核數(shù)據(jù)結(jié)構(gòu)中,然后再移動到磁盤上。
文件對象的write方法允許每種文件類型都定義一個專用的寫操作。
a.寫操作發(fā)生時,有效數(shù)據(jù)是在緩沖區(qū)高速緩存中,而不是在頁高速緩存中,更確切地說,當(dāng)write方法修改了文件的任何部分時。
與這些部分對應(yīng)的頁高速緩存中的所有頁都不再包含有效數(shù)據(jù)。一個進(jìn)程可能認(rèn)為自己在讀取正確數(shù)據(jù),
但是卻沒看到其他進(jìn)程對這些數(shù)據(jù)所做的修改。
b.所有基于磁盤的文件系統(tǒng)的write方法都要調(diào)用update_vm_cache()函數(shù)來修改讀操作所使用的頁高速緩存。
c.通過頁高速緩存對正規(guī)文件執(zhí)行的寫操作,只能用于網(wǎng)絡(luò)文件系統(tǒng)。文件的write方法是使用generic_file_write()函數(shù)實現(xiàn)。
4.內(nèi)存映射:一個線性區(qū)可以和基于磁盤的文件系統(tǒng)中的一個文件(或者文件的一部分)相關(guān)聯(lián)。這就是說,內(nèi)核會把線性區(qū)中對一個頁中字節(jié)的訪問轉(zhuǎn)換成
對正規(guī)文件中相對于字節(jié)的操作,這種技術(shù)成為內(nèi)存映射。
a.共享的:對線性區(qū)中的任何寫操作都會修改磁盤上的文件。而且,如果進(jìn)程對共享內(nèi)存映射中的一個頁進(jìn)行寫,
那么這種修改對于其他映射了相同文件的所有
進(jìn)程來說都是可見的。
b.私有的:當(dāng)進(jìn)程創(chuàng)建的映射只是為讀文件,而不是寫文件時才會使用。處于這種目的,私有映射的效率要比共享映射的效率更高。
但是私有映射頁的認(rèn)識寫操作都會使內(nèi)核不再映射該文件中的頁。一個寫操作即不會改磁盤上的文件,
對訪問相同文件的其他進(jìn)程來說這種改變也是不可見的。
c.使用mmap()系統(tǒng)調(diào)用創(chuàng)建一個新的內(nèi)存映射。必須指定MAP_SHARED或MAP_PRIVATE標(biāo)志。第九章、磁盤數(shù)據(jù)結(jié)構(gòu)
1.任何Ext2分區(qū)中的第一個塊從不受Ext2文件系統(tǒng)的管理,因為這一塊是為啟動扇區(qū)所保留的。Ext2分區(qū)的其余部分被分成塊組(block group)。
2.塊組中的每個塊包含下列信息之一:
a.一個Ext2文件系統(tǒng)超級塊的拷貝
b.一組塊組描述符的拷貝
c.一個數(shù)據(jù)塊位圖:標(biāo)識在一組中塊的使用和空閑狀況。
d.一個索引節(jié)點位圖
e.一組索引節(jié)點
f.屬于文件的一塊數(shù)據(jù);即一個數(shù)據(jù)塊。
3.如果一個塊中不包含任何有意義的信息,就說這個塊是空的。
4.在Ext2文件系統(tǒng)中的所有塊組大小相同并被順序存放,因此,內(nèi)核可以從塊組的整數(shù)索引很容易地得到磁盤中一個塊組的位置。
5.超級塊與組描述符被復(fù)制到每個塊組中。只有塊組0中所包含的超級塊和描述符才由內(nèi)核使用,而其余的超級塊和組描述符保持不變
事實上,內(nèi)核甚至不考慮它們。
6./sbin/e2fsck程序?qū)xt2文件系統(tǒng)的狀態(tài)執(zhí)行一致性檢查時,就引用存放在塊組0中的超級塊和組描述符,然后把它們拷貝到其他所有的塊組中。
7.每組之多有8 x b塊,b是以字節(jié)單位的塊大小。
8.示例:
8GB的Ext2分區(qū)
塊的大小為4KB
塊位圖的大小4KB(b=4KB)
最多描述32KB的數(shù)據(jù)塊
每個塊組的容量:4KB x 32KB = 128MB
最多需要的塊組數(shù): n = 8GB/128MB = 64
9.磁盤數(shù)據(jù)結(jié)構(gòu):
a.超級塊的域:
索引節(jié)點的總數(shù)
以塊位單位的文件系統(tǒng)的大小
保留的塊數(shù)
空閑塊計數(shù)器
空閑索引節(jié)點計數(shù)器
第一次使用的塊號(總為1)
塊的大小
片的大小
每組中的塊數(shù)
每組中的片數(shù)
.....
b.組描述符:每個塊組有自己的組描述符,為ext2_group_desc結(jié)構(gòu)。
Ext2組描述符的域
塊位圖的塊號
索引節(jié)點位圖的塊號
第一個索引節(jié)點表塊的塊號
組中空閑塊的個數(shù)
組中索引節(jié)點的個數(shù)
組中目錄的個數(shù)
.....
c.位圖:是位的序列,0表示相應(yīng)的索引節(jié)點塊或數(shù)據(jù)塊是空閑的,1表示占用。
d.索引節(jié)點表:所有索引節(jié)點的大小相同,即128字節(jié)。索引節(jié)點表第一個塊的塊號存放在組描述符的bg_inode_table域中。
Ext2磁盤索引節(jié)點的域:
文件類型和訪問權(quán)限
擁有者的標(biāo)識符
以字節(jié)為單位的文件長度
最后一次文件訪問的時間
.......
文件的索引節(jié)點號沒有必要再磁盤上存放,因為它的值可以從塊組號和它在索引節(jié)點表中的相對于位置而得出。
10.Ext2的文件操作:
VFS方法的read和mmap是由很多文件系統(tǒng)共用的通用函數(shù)實現(xiàn)的。這些方法存放在
ext2_file_operations表中:
lseek -> ext2_file_lseek()
read -> generic_file_read()
write -> ext2_file_write()
.......
11.各種文件類型如何使用磁盤塊
正規(guī)文件:正規(guī)文件只有在開始有數(shù)據(jù)時才需要數(shù)據(jù)塊。
目錄:Ext2以一種特殊的文件實現(xiàn)了目錄,這種文件的數(shù)據(jù)塊存放了文件名和相應(yīng)的所有節(jié)點號。
數(shù)據(jù)塊中包含了類型為ext2_dir_entry_2的結(jié)構(gòu)
名字域最大為EXT2_NAME_LEN(通常是255)個字符的邊長數(shù)組。
目錄項的長度是4的倍數(shù)
符號鏈:符號鏈的路徑名達(dá)到60個字符,就把它存放在索引節(jié)點的i_blocks域,該域是由15個4字節(jié)整數(shù)組成的數(shù)組,因此無需數(shù)據(jù)塊
如果路徑名大于60個字符,就需要一個單獨的數(shù)據(jù)塊。
設(shè)備文件、管道和套接字:這些類型的文件不需要數(shù)據(jù)塊,所有必須的信息都存放在索引節(jié)點中。
12.Ext2文件的類型
0 未知
1 正規(guī)文件
2 目錄
3 字符設(shè)備
4 塊設(shè)備
5 命名管道
6 套接字
7 符號鏈
13.文件的洞是正規(guī)文件的一部分,它是一些空字符但沒有存放在磁盤的任何數(shù)據(jù)塊中。
引入文件的洞是為了避免磁盤空間的浪費。它們被廣泛地用在數(shù)據(jù)庫引用中,更一般的說,用于文件上散列法的所有應(yīng)用。
第十八章 進(jìn)程通信
1.進(jìn)程間通信的機制:
管道和FIFO(管道):最適合在進(jìn)程之間實現(xiàn)生產(chǎn)者/消費者的交互。有些進(jìn)程往管道中寫入數(shù)據(jù),而另外一些進(jìn)程則從管道中讀取數(shù)據(jù)。
無名管道:用戶無法打開一個現(xiàn)有的管道。除非管道是由一個公共的祖先進(jìn)程創(chuàng)建的。
有名管道:有磁盤索引節(jié)點,因此任何進(jìn)程都可以訪問FIFO,沒有使用數(shù)據(jù)塊,使用內(nèi)核緩沖區(qū)。
信號量IPC(Interprocess Communicatoin),表示一組系統(tǒng)調(diào)用,這組系統(tǒng)調(diào)用
允許用戶態(tài)進(jìn)程:
a.通過信號量和其他進(jìn)程進(jìn)行同步
b.向其他進(jìn)程發(fā)送消息或者從其他進(jìn)程處接受消息
c.和其他進(jìn)程共享一個線性區(qū)
使用IPC資源:
信號量:semget()
消息隊列:msgget()
共享內(nèi)存:shmget()
消息:允許進(jìn)程異步地交換信息(小塊數(shù)據(jù))。可以認(rèn)為消息是傳遞附加信息的信號。
共享內(nèi)存:當(dāng)進(jìn)程之間在高效地共享大量數(shù)據(jù)時,這是一種最合適的交互方式。
套接字(socket):涉及到網(wǎng)絡(luò)相關(guān)。
第十章、程序的執(zhí)行
1.進(jìn)程概念:在Unix中是用來表示正在運行的一組程序競爭系統(tǒng)資源的行為。
2.內(nèi)核需要處理的問題(把一組指令裝入內(nèi)存并讓CPU執(zhí)行):
不同的可執(zhí)行文件格式: Linux的一個著名之處就是能執(zhí)行其他操作系統(tǒng)所編譯的二進(jìn)制文件。
共享庫: 很多可執(zhí)行文件并不包含運行程序所需要的所有代碼,而是希望在運行時由內(nèi)核從函數(shù)庫裝入函數(shù)。
執(zhí)行上下文中的其他信息: 包括程序員熟悉的命令行參數(shù)與環(huán)境變量。
3.進(jìn)程的信任狀和能力:Unix系統(tǒng)與每個進(jìn)程的一些信任相關(guān),信任狀把進(jìn)程與一個特定的用戶或用戶組捆綁在一起。
信任狀在多用戶系統(tǒng)上尤為重要,因為信任狀可以決定每個進(jìn)程能做什么,不能做什么,這樣既保證了每個用戶個人數(shù)據(jù)的完整性
也保證了系統(tǒng)整體上的穩(wěn)定性。
a.進(jìn)程的能力:一種能力僅僅是一個標(biāo)志,它表明是否允許進(jìn)程執(zhí)行一個特定的操作或一組特定的操作。
4.庫:所有的全局外部符號名的線性地址。這些地址的分配或解析是由連接程序完成的,鏈接程序把程序所有的目標(biāo)文件收集起來并構(gòu)造可執(zhí)行文件。
5.靜態(tài)庫/共享庫
動態(tài)庫的優(yōu)缺點:進(jìn)程不需要拷貝目標(biāo)代碼、僅僅執(zhí)行一個內(nèi)存映射,把庫文件的相關(guān)部分映射到進(jìn)程的地址空間中。
缺點也很明顯,動態(tài)的啟動時間較長,移植性也不如靜鏈接的好,系統(tǒng)中所包含的庫版本發(fā)生變化時,
動態(tài)庫連接的程序可能不適合本地運行。
靜態(tài)庫的優(yōu)缺點:占用大量的磁盤空間。每個靜態(tài)連接的可執(zhí)行文件都復(fù)制庫代碼的一部分。 gcc編譯器提供-static選項告訴鏈接程序使用靜態(tài)庫。
6.程序段和進(jìn)程的線性區(qū):
邏輯上,Unix程序的線性地址空間傳統(tǒng)上被劃分為幾個叫段(segment)的區(qū)間:
a.正文段:包含可執(zhí)行代碼。
b.數(shù)據(jù)段:包含初始化的數(shù)據(jù),也就是說,初始值存放在可執(zhí)行文件中的所有靜態(tài)變量和全局變量(因為程序在啟動時必須知道它們的值)
c.bss段:包含未初始化的數(shù)據(jù),也就是說,初值沒有存放在可執(zhí)行文件中的所有全局變量(因為程序在引用它們之前才賦值)
d.堆棧段:包含程序的堆棧,堆棧中有返回地址、參數(shù)和被執(zhí)行函數(shù)的局部變量。
堆:線性區(qū)包含動態(tài)分配給進(jìn)程的內(nèi)存區(qū)。
/sbin/init程序,它創(chuàng)建和監(jiān)視在操作系統(tǒng)外層實現(xiàn)的所有進(jìn)程的活動。init進(jìn)程對應(yīng)的線性區(qū)可以從(/proc/1/maps)文件得到這樣的信息。
7.執(zhí)行跟蹤(execution tracing):是一個程序監(jiān)視另一個程序執(zhí)行的一種技術(shù)。被跟蹤的程序一步一步地執(zhí)行,直到接受到一個信號或調(diào)用一個系統(tǒng)調(diào)用。
執(zhí)行跟蹤由調(diào)試程序(debugger)廣泛應(yīng)用,當(dāng)然還使用其他技術(shù)(包括在被調(diào)試程序中插入斷點及運行時訪問它的變量)。
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)程。此外,兩個進(jìn)程不能同時跟蹤一個進(jìn)程。
a.ptrace()系統(tǒng)調(diào)用修改被跟蹤進(jìn)程描述符的p_pptr域以使它指向跟蹤進(jìn)程,因此,跟蹤進(jìn)程變?yōu)楸桓欉M(jìn)程的有效父進(jìn)程
跟蹤結(jié)束時,以PTRAC_DETACH命令調(diào)用ptrace()時,這個系統(tǒng)調(diào)用把p_pptr設(shè)置為p_oppter的值,恢復(fù)被跟蹤進(jìn)程原來的父進(jìn)程。
b.被跟蹤進(jìn)程相關(guān)的幾個監(jiān)控事件為:
一條單獨匯編指令執(zhí)行的結(jié)束
進(jìn)入一個系統(tǒng)調(diào)用
從一個系統(tǒng)調(diào)用退出
接收到一個信號
c.當(dāng)一個監(jiān)控的事件發(fā)生時,被跟蹤的程序停止,并將SIGCHID信號發(fā)送給它的父進(jìn)程。當(dāng)父進(jìn)程希望恢復(fù)子進(jìn)程的執(zhí)行時,
就是用PTRACE_CONT、PTRACE_SINGLESTEP和
PTRACE_SYSCALL命令中的一條,這取決于父進(jìn)程要監(jiān)控那種事件。
9.可執(zhí)行格式:Linux正式的可執(zhí)行格式是ELF(Execuable and Linking Format)。
類型為linux_binfmt的對象所描述的可執(zhí)行格式實質(zhì)上提供以下三種方法:
a.loadbinary:通讀存放在可執(zhí)行文件中的信息為當(dāng)前進(jìn)程建立一個新的執(zhí)行環(huán)境。
b.load_shlib:用于動態(tài)地把一個共享庫捆綁到一個已經(jīng)在運行的進(jìn)程,這個是由uselib()系統(tǒng)調(diào)用激活的。
c.core_dump:在名為core的文件中存放當(dāng)前進(jìn)程的執(zhí)行上下文。這個文件通常是在進(jìn)程接收到一個缺省操作為"dump"的信號時被創(chuàng)建的
其格式取決于被執(zhí)行程序的可執(zhí)行類型。
linux_binfmt對象:處于一個簡單的連接鏈表中,第一個元素的地址被存放在formats變量中。
可以通過調(diào)用register_binfmt()和unregister_binfmt()函數(shù)
在鏈表中插入和刪除元素。
formats鏈表中的最后一個元素:是一個對解釋腳本(interpreted script)的可執(zhí)行格式進(jìn)行描述的一個對象。定義了load_binary()方法。
其相應(yīng)的do_load_script()
可執(zhí)行文件是否是以兩個#!開始,如果是,這個函數(shù)就以另一個可執(zhí)行文件的路徑作為參數(shù)解釋第一行的其余部分,
并把文件名作為參數(shù)傳遞過去以執(zhí)行這個腳本文件。
Linux允許用戶注冊自己定義的可執(zhí)行格式:用如下的格式項/proc/sys/fs/binfmt_misc/register文件寫入一個字符串
:name:type:offset:string:mask:interpreter:
name:新格式的標(biāo)識符
type:識別類型(M表示魔數(shù),E表示擴展)
offse:魔數(shù)在文件中的起始偏移量
string:或者以魔數(shù),或者以擴展名匹配的字節(jié)序列
mask:屏蔽string中的一些位的字符串
interpreter:程序解釋器的完整路徑名
可執(zhí)行文件的前128字節(jié)填充linux_binprm結(jié)構(gòu)的buf域。
exec類函數(shù):這些函數(shù)能用可執(zhí)行文件所描述的新上下文代替進(jìn)程的上下文。


首先恭喜您,能夠認(rèn)真的閱讀到這里,如果對部分理解不太明白,建議先將文章收藏起來,然后對不清楚的知識點進(jìn)行查閱,然后在進(jìn)行閱讀,相應(yīng)你會有更深的認(rèn)知。如果您喜歡這篇文章,就點個贊或者【關(guān)注我】吧!!

總結(jié)

以上是生活随笔為你收集整理的tipi 深入理解php内核 pdf_大牛的学习笔记-深入理解Linux内核(完整版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲天堂女人 | 亚洲人人人| 国产一区二区视频在线播放 | 奇米影视亚洲春色 | 亚洲制服在线观看 | 国产成人精品免费看视频 | 久久免费精品视频 | 超级碰在线观看 | www.一区| 天天综合天天添夜夜添狠狠添 | 欧美精品成人在线 | www.97av.com| 欧美中文字幕 | 免费小视频在线观看 | 黄a网站| 精品国产一级 | 91精品亚洲 | 精品少妇人妻一区二区黑料社区 | a在线视频 | 不卡的av在线 | 久久久久亚洲av成人网人人网站 | 亚洲av成人精品午夜一区二区 | 五月天婷婷激情视频 | 久操福利| 日韩欧美一区在线 | 九九精品视频在线观看 | 中日韩欧美在线观看 | 久久久国产成人一区二区三区 | 国产精品免费一区二区三区在线观看 | 探花av在线 | 精品九九久久 | 成人午夜影视 | 国产a级精品 | 欧美aⅴ在线 | 成人在线亚洲 | 五月天三级 | 亚洲经典在线 | 网站一区二区 | 国产精品19乱码一区二区三区 | 手机看片日韩国产 | av一区在线 | 午夜宅男在线 | 久久99精品久久久水蜜桃 | 三级福利片 | 最新地址在线观看 | 国产精品久久久av | 国产男女猛烈无遮挡免费视频动漫 | 久久99精品国产麻豆婷婷洗澡 | 重囗味sm一区二区三区 | www男人的天堂 | a天堂av| 少妇一级淫免费观看 | 91精品国产综合久久久久 | 蜜桃视频久久 | 色婷婷在线播放 | 麻豆av一区二区 | 日本一区二区在线播放 | 色污网站 | 在线观看色网 | 中文在线资源天堂 | 尤物网站在线播放 | 亚洲交性网 | 男女交性视频播放 | 日本a级大片 | 99热黄色| 合欢视频污 | 国产激情在线 | av一级免费 | 理论片av | 在线观看国产精品入口男同 | 国语对白真实视频播放 | jvid视频| 国产精品高潮呻吟 | 国内成人精品 | 亚洲欧洲视频 | 麻豆国产av超爽剧情系列 | 中文字幕av日韩 | 天天操夜操 | 草比视频在线观看 | 免费特级黄毛片 | 中文字幕在线一区 | xxx毛片| 成人高潮片免费 | 黄色一级免费大片 | 深夜视频在线观看 | 神马影院一区二区三区 | 日韩不卡一二三区 | 国产成人亚洲综合a∨婷婷 台湾a级片 | 手机看片日韩欧美 | 免费无遮挡在线观看视频网站 | 日本美女视频网站 | 天天插天天操天天干 | 欧美mv日韩mv国产网站app | 久久久看| 中日韩在线播放 | 青青草日韩 | 熟女人妻在线视频 | 青青草原av | 海角社区id:1220.7126,10. |