一文帶你掌握Linux內(nèi)核協(xié)議棧架構(gòu)(超詳細(xì))
一、Linux內(nèi)核代碼目錄分布

documentation:擁有一套有用內(nèi)核技術(shù)文檔。?
arch:此目錄的所有子目錄的文檔數(shù)據(jù)都是體系結(jié)構(gòu)特有的代碼。有3個(gè)子目錄:Kernel不同體系結(jié)構(gòu)內(nèi)核我有的實(shí)現(xiàn)方式,比如計(jì)時(shí)器、SMP、信號量等等;lib不同體系結(jié)構(gòu)下的高性能通用代碼實(shí)現(xiàn),比如memcpy等等;mm不同體系結(jié)構(gòu)特有的內(nèi)存管理 程序的實(shí)現(xiàn)。?
drivers:內(nèi)核的驅(qū)動(dòng)程序代碼。包括顯卡、網(wǎng)卡、PCI等外圍設(shè)備驅(qū)動(dòng)代碼。?
fs:文件系統(tǒng)代碼。Ext2 Ext3 Ext4等本地文件系統(tǒng)。
include:包含Linux內(nèi)核大部分的頭文件(.h)。?
init:內(nèi)核初始化過程中的代碼。?
ipc:進(jìn)程間通信代碼 kernel:Linux內(nèi)部最重要的目錄。主要包含進(jìn)程創(chuàng)建、銷毀和調(diào)度等代碼。?
net:Linux內(nèi)核網(wǎng)絡(luò)協(xié)議棧的代碼。在此目錄下有netfilter的實(shí)現(xiàn)代碼,建構(gòu)一個(gè)netfilter框架,內(nèi)核防火墻框架,靈活、可實(shí)現(xiàn)安全策略,如數(shù)據(jù)包過濾、數(shù)據(jù)包處理、透明代理、動(dòng)態(tài)網(wǎng)絡(luò)地址轉(zhuǎn)換、數(shù)據(jù)包處理等。抽象及通用化框架,作為中間件,為每種網(wǎng)絡(luò)協(xié)議(IPv4/IPv6等)定義整套鉤子函數(shù)。
Linux內(nèi)核--映射到Linux代碼3個(gè)內(nèi)核層源碼代碼組織,具體如下:

具備開發(fā)經(jīng)驗(yàn)至少我們對TCP網(wǎng)絡(luò)編程流程(socket()/bind()/listen()/accept()/send()/recv()/關(guān)閉socket()順序)。網(wǎng)絡(luò)數(shù)據(jù)在內(nèi)核中處理過程主要是在網(wǎng)卡和協(xié)議棧之間進(jìn)行:交給協(xié)議棧處理;協(xié)議棧將需要發(fā)送的數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送出去。

Linux內(nèi)核的網(wǎng)絡(luò)協(xié)議棧架構(gòu)視圖如下:

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

二、SK_BUFF內(nèi)部原理及協(xié)議棧
內(nèi)核層和用戶層在網(wǎng)絡(luò)方面差別是比較大,在內(nèi)核的網(wǎng)絡(luò)層中sk_buff結(jié)構(gòu)占有重要地位。sk_buff數(shù)據(jù)結(jié)構(gòu)在內(nèi)核源碼組織結(jié)構(gòu)如下:
網(wǎng)絡(luò)報(bào)文存儲(chǔ)空間是在應(yīng)用層發(fā)送網(wǎng)絡(luò)數(shù)據(jù)或者網(wǎng)絡(luò)設(shè)備收到網(wǎng)絡(luò)數(shù)據(jù)時(shí)動(dòng)態(tài)分配的,分配成功之后,將接收或者發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)填充到這個(gè)存儲(chǔ)空間中。
三、網(wǎng)絡(luò)協(xié)議inet_protosw結(jié)構(gòu)分析
網(wǎng)絡(luò)協(xié)議族TCP/UDP等,inet_init()函數(shù)進(jìn)程初始化,使用proto_register()函數(shù)來注冊每個(gè)內(nèi)嵌協(xié)議。

sk_buff的數(shù)據(jù)結(jié)構(gòu)視圖如下:


四、軟中斷CPU報(bào)文隊(duì)列及處理
我們在Linux內(nèi)核中是采用軟中斷方式實(shí)現(xiàn),軟中斷機(jī)制的實(shí)現(xiàn)原理如下:

軟中斷機(jī)制構(gòu)成核心成員包括:中斷狀態(tài)、軟中斷向量表及軟中斷守護(hù)內(nèi)核線程。
軟中斷狀態(tài):即是否有觸發(fā)的軟中斷未處理;
軟中斷向量表:包含兩個(gè)成員變量,一個(gè)是處理此軟中斷的回調(diào)函數(shù),另一個(gè)是處理時(shí)所需的參數(shù)。
軟中斷守護(hù)內(nèi)核線程:內(nèi)核創(chuàng)建一個(gè)內(nèi)核線程ksoftirq來輪詢軟中斷狀態(tài),調(diào)用軟中斷向量表中的軟中斷回調(diào)函數(shù)處理中斷。
假設(shè):當(dāng)一個(gè)軟中斷事件發(fā)生之后,調(diào)用raise_softirq()設(shè)置中斷標(biāo)記位,觸發(fā)中斷事務(wù)。然后會(huì)檢測軟中斷狀態(tài)寄存器的狀態(tài),如果ksoftirq通過查詢發(fā)現(xiàn)某一個(gè)軟中斷事件發(fā)生之后,通過軟中斷向量表調(diào)用軟中斷服務(wù)程序action。
常用軟中斷函數(shù):
open_softirq()函數(shù):它注冊一個(gè)軟中斷,將軟中斷的服務(wù)程序注冊到系統(tǒng)的軟中斷向量表;
raise_softirq()函數(shù):設(shè)置軟中斷狀態(tài)映射表,觸發(fā)軟中斷事務(wù)響應(yīng)。
軟中斷整個(gè)處理架構(gòu)分為:上半部和下半部。
網(wǎng)絡(luò)收到處理軟中斷的實(shí)現(xiàn)機(jī)制:考慮優(yōu)先級,分別占用向量表的2號和3號軟中斷來分別處理接收和發(fā)送。網(wǎng)絡(luò)協(xié)議棧的軟中斷機(jī)制實(shí)現(xiàn)原理如下:


一文帶你掌握Linux內(nèi)核協(xié)議棧架構(gòu)(超詳細(xì))的評論 (共 條)
