資源描述:
《linux協(xié)議棧源碼分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、LINUX協(xié)議棧源碼分析jiang_wei@topsec.com.cn分析要點(diǎn)1這里只會(huì)對(duì)網(wǎng)絡(luò)協(xié)議棧相關(guān)的模塊進(jìn)行簡(jiǎn)要的介紹,為的是能夠更好的理解協(xié)議棧的運(yùn)作過(guò)程2內(nèi)核是復(fù)雜的,其中簡(jiǎn)要介紹所涉及的保護(hù)模式,存儲(chǔ)器尋址,內(nèi)存管理(分頁(yè),分段),描述符表(本地、全局以及中斷),中斷控制器(8259AAPIC),中斷系統(tǒng)(硬,軟,軟件),時(shí)間系統(tǒng),進(jìn)程控制調(diào)度,文件系統(tǒng),段保護(hù)機(jī)制,堆棧切換,塊字符設(shè)備驅(qū)動(dòng),DMA(8237)都不會(huì)深入的介紹,可以自己參看相關(guān)書(shū)籍3實(shí)例--跟蹤數(shù)據(jù)包游歷協(xié)議棧,以及命令觸發(fā)協(xié)議棧工作這樣的方式來(lái)詳細(xì)描述其工作過(guò)程IPStack在Linux中
2、的位置由IPStack所處的位置上看,它牽扯到內(nèi)核中大部分模塊,如果對(duì)其中沒(méi)一部分沒(méi)有一定的了解的話,那么對(duì)IPStack工作行為理解就會(huì)出現(xiàn)一些問(wèn)題,這個(gè)也是協(xié)議棧的難點(diǎn)網(wǎng)絡(luò)協(xié)議發(fā)展介紹1網(wǎng)絡(luò)協(xié)議的優(yōu)勝劣汰----無(wú)數(shù)的私有協(xié)議逐漸的消失2IP協(xié)議的出現(xiàn)----被學(xué)校和軍方發(fā)展壯大,形成協(xié)議族TCP/IP3TCP/IP協(xié)議族----健壯、簡(jiǎn)單4蠶食其他網(wǎng)絡(luò)市場(chǎng)份額--IPXOSI七層模型IPStack的實(shí)現(xiàn)基本采用TCP/IP的4層架構(gòu),但是我們?cè)趯W(xué)習(xí)協(xié)議棧的同時(shí)還需要關(guān)注物理層Ip重要性既然IP如此重要,那么應(yīng)該知道每一類(lèi)軟件模塊都不能獨(dú)立存在,必定依托系統(tǒng)其它模塊的支持
3、才能工作。協(xié)議棧是內(nèi)核中實(shí)現(xiàn)的,所以必須要清楚操作系統(tǒng)是如何支持協(xié)議棧的!其中容易被忽視的是2處:glibc–提供各種APIINET—不屬于TCP/IP體系,但是它提供了訪問(wèn)TCP/IP層的接口,這些操作是在網(wǎng)絡(luò)初始化時(shí)就已經(jīng)注冊(cè)到socketLinux協(xié)議棧源碼一系統(tǒng)初始化流程四個(gè)匯編程序:bootsect.Ssetup.Shead.Sentry.SInit目錄下的main.c文件這4個(gè)匯編程序v0.11到現(xiàn)在改動(dòng)與內(nèi)核代碼比起來(lái)改動(dòng)很小,所以如果有興趣的話,可以參看v0.11的,簡(jiǎn)單,實(shí)用,最起碼能讓我們知道系統(tǒng)是如何從加電開(kāi)始,最后顯示“l(fā)ogin:”的要充分的理解內(nèi)核
4、協(xié)議棧,很有必要從系統(tǒng)初始化開(kāi)始閱讀協(xié)議棧相關(guān)的代碼v0.11引導(dǎo)流程Start_kernel()(linux2.6.x/init/main.c)從上邊圖中,我們要關(guān)注一下幾個(gè)方面:1中斷系統(tǒng)及調(diào)度系統(tǒng)2文件系統(tǒng)的初始化3設(shè)備管理系統(tǒng)的初始化4網(wǎng)絡(luò)協(xié)議的初始化因?yàn)榫W(wǎng)絡(luò)系統(tǒng)本身關(guān)系到設(shè)備、文件系統(tǒng)、任務(wù)調(diào)度等方面,如果這些不整清楚,那么理解協(xié)議棧是有一定困難的。對(duì)于目前版本的內(nèi)核,理解一下ELF文件格式也非常重要,為什么重要,往后看就知道了Rest_init()(start_kernel()->rest_init())這里最重要的kernel_thread是創(chuàng)建了一個(gè)內(nèi)核線程:
5、init其原型是intkernel_thread(int(*fn),void*arg,unsignedflags),此函數(shù)定義在Arch/i386/kernel/process.c中,它利用linux/i386的do_fork函數(shù)創(chuàng)建一個(gè)新的內(nèi)核態(tài)線程,LINUX的內(nèi)核態(tài)線程是沒(méi)有虛存的,直接使用物理地址空間現(xiàn)在重點(diǎn)就到了init函數(shù),內(nèi)核中很多模塊都定義了init函數(shù)Init()(kernel_thread()-->init())通過(guò)這個(gè)函數(shù),我們能夠看到,在do_basic_setup是有關(guān)網(wǎng)絡(luò)部分的,sock_init是為網(wǎng)絡(luò)創(chuàng)建了執(zhí)行環(huán)境,并為協(xié)議棧申請(qǐng)了內(nèi)存空間,那
6、么在哪里初始化協(xié)議棧本身呢?重點(diǎn)就在do_initcalls了內(nèi)核文件解讀—ELF文件ELF是*nix系統(tǒng)上可執(zhí)行文件的標(biāo)準(zhǔn)格式,它取代了out格式的可執(zhí)文件,因?yàn)樗哂辛己玫目蓴U(kuò)展性。ELF文件有雙重性質(zhì):一方面編譯器、匯編器和連接器都把它看做是邏輯段(section)的集合,另一方面loader把它看做是段(segment)的集合普通ELF的段排列As生成一個(gè)目標(biāo)文件時(shí),它假設(shè)程序段是從地址0開(kāi)始,ld則把最后的地址賦給這個(gè)程序段,以至于不同的程序段不會(huì)相互覆蓋As輸出的目標(biāo)文件至少有3個(gè)section,任何一個(gè)都有可能為空,即使為空,段依然存在As使用的每個(gè)地址都是如下
7、格式:(section)+(offsetintosection)Ld把所有相同的section放到連續(xù)的地址空間中Linkscript連接器有自己的一套語(yǔ)言規(guī)范,其目的是描述輸入文件中的section是如何被映射到輸出文件中,并控制輸出文件的內(nèi)存排列。編譯生成用戶(hù)態(tài)執(zhí)行的程序使用ld-verbose查看默認(rèn)script,它是內(nèi)置在連接器中,ld就是使用這個(gè)缺省的script去輸出應(yīng)用程序而編譯內(nèi)核的時(shí)候,使用的是內(nèi)核提供的script---arch/xxx/kernel/vmlinux_32.lds.S