最后有福利
在看一些 GNU 開源軟件,或者閱讀 Linux 內(nèi)核、驅(qū)動(dòng)源碼時(shí),相信大家和我一樣,經(jīng)常會(huì)遇到一些“看似熟悉”,但一仔細(xì)分析又不是很懂的 C 語言“稀奇古怪”的語法。其實(shí)這些都是 GNU C 對 C 語言語法的擴(kuò)展。一般的教材中基本不會(huì)講到這些,所以看不懂這些特殊的 C 語法應(yīng)用也很正常。
此達(dá)人課將帶領(lǐng)大家,一起學(xué)習(xí) Linux 內(nèi)核或 GNU 開源軟件中對 C 語言各種擴(kuò)展語法的使用,最終的目標(biāo)是看懂 Linux 內(nèi)核或 GNU 開源軟件中這些“奇葩的語法”,掃除理解 Linux 內(nèi)核驅(qū)動(dòng)或 GNU 開源軟件的語法障礙。
1《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
2《深入理解Linux內(nèi)核》
3《Linux內(nèi)核完全注釋》
4《Linux內(nèi)核源代碼情景分析 》
一。《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
1. 單內(nèi)核和微內(nèi)核
Linux的內(nèi)核雖然是基于單內(nèi)核的,但是經(jīng)過這么多年的發(fā)展,也具備微內(nèi)核的一些特征。(體現(xiàn)了Linux實(shí)用至上的原則)
主要有以下特征:
2. 內(nèi)核版本號
內(nèi)核的版本號主要有四個(gè)數(shù)組組成。比如版本號:2.6.26.1 其中,
2 - 主版本號
6 - 從版本號或副版本號
26 - 修訂版本號
1 - 穩(wěn)定版本號
副版本號表示這個(gè)版本是穩(wěn)定版(偶數(shù))還是開發(fā)版(奇數(shù)),上面例子中的版本號是穩(wěn)定版。
穩(wěn)定的版本可用于企業(yè)級環(huán)境。
修訂版本號的升級包括BUG修正,新的驅(qū)動(dòng)以及新的特性的追加。
穩(wěn)定版本號主要是一些關(guān)鍵性BUG的修改。
二,深入理解Linux內(nèi)核
Linux 和一些商用unix的區(qū)別
1. Linux 主要是由 unix 內(nèi)核加上 gnu的引用程序組成的 兼容IEEE POSIX 標(biāo)準(zhǔn)
2.linux 是傳統(tǒng)上面的單塊結(jié)構(gòu)有邏輯上不同的部分組成
3.linux采用的是模塊的方式(動(dòng)態(tài)編譯的方式)加載程序塊。
4.Linux內(nèi)核支持對稱多處理器
5.Linux支持面向?qū)ο蟮奶摂M文件系統(tǒng),日志文集系統(tǒng)
優(yōu)勢:
1.免費(fèi)
2.充分定制Linux系統(tǒng) 隨時(shí)隨地修改Linux代碼
3.可以充分利用硬件平臺 ,對硬件性能要求不高
4.Linux系統(tǒng)的代碼運(yùn)行時(shí)高效率的 ,而且沒有商用的限制 。
5.內(nèi)核精簡
6.Linux系統(tǒng)兼容性好
7后臺支持廣泛
系統(tǒng)調(diào)用是 實(shí)現(xiàn)用戶態(tài)到內(nèi)核態(tài)的過程 , 特權(quán)模式由用戶態(tài)轉(zhuǎn)變?yōu)閮?nèi)核態(tài) 保存斷點(diǎn) ,最后 由硬件實(shí)現(xiàn)系統(tǒng)調(diào)用 返回進(jìn)程斷點(diǎn)
三,《Linux內(nèi)核完全注釋》
1、選擇《Linux內(nèi)核完全注釋》的理由
從現(xiàn)在起,我打算學(xué)習(xí)Linux內(nèi)核,作一個(gè)基本的了解和入門吧。在網(wǎng)上也看了許多國內(nèi)外的一些經(jīng)典書籍的評價(jià),最后我還是選擇閱讀《Linux內(nèi)核完全注釋》這本書,作為一個(gè)基礎(chǔ)入門,這本書在網(wǎng)上的評價(jià)也還可以。
這本書講解的Linux內(nèi)核版本是Linux 0.11,雖然內(nèi)核版本很低,但是作為學(xué)習(xí)來說應(yīng)該還是可以的,該內(nèi)核已經(jīng)能夠正常的編譯運(yùn)行,并且其中已經(jīng)包括了Linux工作原理的精髓。由于Linux 0.11內(nèi)核不超過2萬行代碼量,因此可以完全的通過一本書進(jìn)行了解和學(xué)習(xí)。正是因?yàn)長inux 0.11內(nèi)核代碼量小,這本書對Linux 0.11內(nèi)核的全部代碼進(jìn)行了注釋,便于讀者學(xué)習(xí)和理解。
為了讓讀者對所研究的系統(tǒng)有感性的了解,并能通過實(shí)驗(yàn)來加深對原來的理解,作者還專門重建了基于該內(nèi)核的可運(yùn)行的Linux 0.11系統(tǒng),因?yàn)槠渲泻蠫NU gcc編譯環(huán)境,因此使用該系統(tǒng)也能做一些簡單的開發(fā)工作。
當(dāng)然,使用早期內(nèi)核作為學(xué)習(xí)的對象也有不足之處。所選用的Linux 0.11內(nèi)核,不包含對虛擬文件系統(tǒng)VFS的支持、對網(wǎng)絡(luò)系統(tǒng)的支持,僅支持a.out執(zhí)行文件和對其他一些現(xiàn)有內(nèi)核中復(fù)雜子系統(tǒng)的說明。
2、資料傳送門
下面列舉一下書中提供的一些資料鏈接,也方便以后自己的查找吧:
http://oldlinux.org/Linux.old/images/:該目錄中含有已經(jīng)制作好的內(nèi)核映像文件bootimage和根文件系統(tǒng)映像文件rootimage。
http://oldlinux.org/Linux.old/bochs/:該目錄中含有已經(jīng)設(shè)置好的運(yùn)行在計(jì)算機(jī)仿真系統(tǒng)bochs下的Linux系統(tǒng)。
http://oldlinux.org/Linux.old/Linux-0.11/:該目錄中含有可以在Linux 0.11系統(tǒng)中使用的其他一些工具程序和原來發(fā)布的一些安裝說明文檔。
http://oldlinux.org/Linux.old/kernel/0.1x/:可以在這里下載本書講解的Linux 0.11內(nèi)核源碼,文件名:linux-0.11.tar.gz。
3、內(nèi)核源碼目錄結(jié)構(gòu)
整個(gè)Linux 0.11內(nèi)核源代碼的目錄結(jié)構(gòu)如下圖所示:
四。Linux內(nèi)核源代碼情景分析
1預(yù)備知識
1.1linux內(nèi)核簡介
linux發(fā)展史
linux源代碼組成
linux內(nèi)核版和發(fā)行版的命名方式
1.2 Intelx86的尋址方式
早期8086和8088處理器是16位,尋址方式為實(shí)模式,后來隨著技術(shù)的發(fā)展,人們意識到實(shí)模式的不足(完全把計(jì)算機(jī)暴露在用戶的眼皮下),就產(chǎn)生了保護(hù)模式,關(guān)于這兩點(diǎn)的區(qū)別,主要在于對內(nèi)存的訪問是否有進(jìn)行保護(hù),主要是越界和越權(quán)。越界就是用戶不能訪問的地址范圍不允許訪問,用戶沒有權(quán)限的地址范圍不能訪問。所以早期計(jì)算機(jī)工作者們就在建立了段式內(nèi)存管理,把內(nèi)存地址進(jìn)行分段(比如,16段,每段大小64k,剛好1M)然后cpu中設(shè)置了四個(gè)段寄存器:CS,DS,SS,ES,分別用于可執(zhí)行代碼的指令,數(shù)據(jù),堆棧,其他。由于早期intel內(nèi)存大小采用1M,而cpu確實(shí)16位,如果不做一定額處理,16位總線是不能訪問超過64k的范圍,所以每個(gè)段寄存器的內(nèi)容作為內(nèi)存地址的高16位,同時(shí)與段內(nèi)偏移地址作為低16進(jìn)行相加(重疊12位),這樣就剛好形成了20位的內(nèi)存地址,即1M。
由于這種管理機(jī)制無法提供對內(nèi)存的保護(hù),所以基于段式內(nèi)存管理機(jī)制,到后來的386以后,人們采用保護(hù)模式,并且數(shù)據(jù)總線為32位了,人們在原來的四個(gè)段寄存器的基礎(chǔ)上加上兩個(gè)段寄存器FS,GS,為了實(shí)現(xiàn)保護(hù)模式的作用。所以數(shù)據(jù)總線的地址內(nèi)容應(yīng)該有如下設(shè)計(jì)思想
1根據(jù)指令的性質(zhì)來確定應(yīng)該使用哪個(gè)段寄存器
2根據(jù)段寄存器的內(nèi)容,找到相應(yīng)的地址段描述結(jié)構(gòu)
3根據(jù)地址段描述結(jié)構(gòu)得到基地址
4將指令發(fā)出的地址作為位移,與段描述結(jié)構(gòu)中規(guī)定的段長度比較,是否越界
5根據(jù)地址段描述結(jié)構(gòu)符中的訪問權(quán)限來確定是否越權(quán)
6將指令發(fā)出的地址作為位移,與基地址相加得出實(shí)際的物理地址。
上面就是保護(hù)模式下段式內(nèi)存管理的設(shè)計(jì)思想,下面就是實(shí)現(xiàn)過程。
1段寄存器,由于段地址描述結(jié)構(gòu)棧8個(gè)字節(jié),故地址為8的整數(shù)倍,所以段寄存器低三位可以用于其他作用。
2段地址描述結(jié)構(gòu)(GDTR,LDTR),其數(shù)據(jù)的主要作用在于描述基地址,權(quán)限,范圍。
通過上面的段寄存器映射到過渡的段地址描述結(jié)構(gòu),最后就是指令發(fā)出的地址與段地址描述結(jié)構(gòu)提供的基地址來映射到最后的物理地址了(前提是沒有采用分頁內(nèi)存管理)
1.3 i386頁式管理機(jī)制
由于段式管理機(jī)制是實(shí)實(shí)在在的,沒有抽象出來,不方便內(nèi)存管理,人們就又在段式管理的基礎(chǔ)上增加了分頁式管理,從而由虛擬地址經(jīng)過段式管理映射得到的地址不再是物理地址了,人們稱為線性地址,在線性地址的基礎(chǔ)上經(jīng)過頁面映射后得到的才是真正的物理地址。
在分頁機(jī)制中,線性地址的結(jié)構(gòu)被人為的劃分為
而整個(gè)頁面映射的過程為
這里解釋兩點(diǎn)
1 記得前面我的每個(gè)段地址描述結(jié)構(gòu)都占8個(gè)字節(jié),所以地址一定按8的整數(shù)倍對其,這里我們的頁面大小人為的劃分為4k,即按4k對其,所以我們的目錄項(xiàng)和頁表同樣可以拿出低12位用作他用。至于怎樣實(shí)現(xiàn),那是硬件上的問題。
2 為什么采用多級分頁機(jī)制,而不簡單直接的使用頁表和頁內(nèi)偏移地址來進(jìn)行分頁,目的是在于節(jié)省內(nèi)存,至于是怎么節(jié)省的,我當(dāng)初上操作系統(tǒng)課程始終不明白,現(xiàn)在搞明白了。因?yàn)椴僮飨到y(tǒng)在創(chuàng)建進(jìn)程時(shí)會(huì)為進(jìn)程分配一個(gè)進(jìn)程控制塊,里面其中有一部分就是對虛存管理的頁面數(shù)據(jù)結(jié)構(gòu),如果不采用多級分頁機(jī)制的話,那么每個(gè)進(jìn)程關(guān)頁面表就占 個(gè)字節(jié),即1M,即是進(jìn)程用不著那么頁表項(xiàng)(因?yàn)?2位地址默認(rèn)個(gè)用戶的虛存空間是4G,但一個(gè)進(jìn)程很難想象會(huì)用完這4G),但還是會(huì)占內(nèi)存,但是采用多級分頁的話,那么不需要的頁表項(xiàng)就不進(jìn)行分配,從而也就節(jié)省了內(nèi)存,但是相反一個(gè)進(jìn)程真的用完了4G的虛存,那么他需要的目錄項(xiàng)和頁表項(xiàng)占的內(nèi)存就多了目錄項(xiàng)這一部分了。
1.4linux內(nèi)核源代碼中C語言代碼
Linux內(nèi)核的主體是由GNU的C語言編寫,CNU為此提供了編譯器gcc,而gcc從C++語言中吸收了inline和const,其實(shí)GNU的C和C++是合為一體的,gcc既是C的編譯器也是C++的編譯器,所以linux中很多C語言代碼自然就有C++風(fēng)格在里面,所以需要一點(diǎn)C++基礎(chǔ)。但這不是問題關(guān)鍵,關(guān)鍵在學(xué)習(xí)linux中C語言設(shè)計(jì)思想。
1常見的宏定義對簡單函數(shù)的實(shí)現(xiàn)
#define DUMP_WRITE(addr,nr) \ do{ memcpy(bufp,addr,nr);bufp+=nr} while(0)
2使用結(jié)構(gòu)體封裝多個(gè)隊(duì)列
3使用宏定義與函數(shù)實(shí)現(xiàn)簡單初始化
1.5linux內(nèi)核源代碼中的匯編語言代碼
匯編語言有兩套格式,在dos/windows領(lǐng)域中采用的匯編語言都是由intel定義的指令格式,也就是我們教材里面的匯編語言格式。另外一種就是UNIX領(lǐng)域使用的AT&T定義的格式,所以在linux內(nèi)核中所使用的匯編格式是AT&T。盡管兩種匯編語言指令不一樣,但是指令的風(fēng)格很類似,所以提供了一種互相學(xué)習(xí)的條件。而且AT&T匯編同樣適用于gcc編譯器,所以在c語言中可以嵌入式匯編語句,所以看懂linux內(nèi)核代碼,需要AT&T匯編基礎(chǔ)以及嵌入式匯編基礎(chǔ)。這里不詳細(xì)介紹,后面在進(jìn)程切換一節(jié)中借助一段內(nèi)核中用來實(shí)現(xiàn)內(nèi)存空間切換的匯編代碼來介紹一下嵌入式AT&T匯編。
詳細(xì)參見:需要相關(guān)資料的可以后臺私信,資料,可MF領(lǐng)取 歡迎
來百度APP暢享高清圖片
//下栽のke:chaoxingit.com/3601/
從0開始:手寫自己的Linux X86操作系統(tǒng)
在計(jì)算機(jī)科學(xué)的世界中,操作系統(tǒng)的地位就如同皇冠上的寶石,它管理著硬件資源,提供用戶接口,是軟件與硬件之間的橋梁。對于許多開發(fā)者來說,編寫一個(gè)操作系統(tǒng)是一個(gè)充滿挑戰(zhàn)和成就感的任務(wù)。本文將引導(dǎo)你從零開始,手寫一個(gè)基于Linux X86架構(gòu)的操作系統(tǒng)。
一、準(zhǔn)備工作
手寫自己的 Linux x86 操作系統(tǒng)是一個(gè)非常具有挑戰(zhàn)性和復(fù)雜性的任務(wù),需要深入了解計(jì)算機(jī)體系結(jié)構(gòu)、操作系統(tǒng)原理和匯編語言編程。以下是準(zhǔn)備工作的一些步驟:
二、啟動(dòng)過程
三、內(nèi)核實(shí)現(xiàn)
四、調(diào)試與測試
從零開始手寫自己的 Linux x86 操作系統(tǒng)涉及到復(fù)雜的編程和系統(tǒng)設(shè)計(jì)。在這個(gè)過程中,調(diào)試和測試是不可或缺的環(huán)節(jié),以確保系統(tǒng)的可靠性和穩(wěn)定性。下面是一些基本的調(diào)試與測試策略:
1. 使用虛擬機(jī)進(jìn)行模擬
2. 使用調(diào)試器
3. 日志和打印
4. 單元測試
5. 持續(xù)集成
6. 性能測試和優(yōu)化
7. 社區(qū)反饋和協(xié)作
五、優(yōu)勢以及適合人群
五、持續(xù)改進(jìn)
操作系統(tǒng)是一個(gè)不斷發(fā)展和完善的系統(tǒng),你需要根據(jù)用戶的需求和使用反饋來不斷優(yōu)化和改進(jìn)你的操作系統(tǒng)。你可以添加新的功能,提高性能,增強(qiáng)安全性等。
編寫一個(gè)操作系統(tǒng)是一項(xiàng)艱巨的任務(wù),但也是一個(gè)充滿樂趣和成就感的過程。通過這個(gè)過程,你不僅能夠深入理解計(jì)算機(jī)的運(yùn)行原理和操作系統(tǒng)的設(shè)計(jì)思想,還能夠鍛煉你的編程能力和解決問題的能力。希望本文能夠?yàn)槟闾峁┮粋€(gè)有價(jià)值的參考和指導(dǎo),幫助你在編寫操作系統(tǒng)的道路上走得更遠(yuǎn)。