《和菜鳥一起學(xué)linux內(nèi)核源碼之基礎(chǔ)準(zhǔn)備篇Word版》由會員分享,可在線閱讀,更多相關(guān)《和菜鳥一起學(xué)linux內(nèi)核源碼之基礎(chǔ)準(zhǔn)備篇Word版(23頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、
?
和菜鳥一起學(xué)linux內(nèi)核源碼之基礎(chǔ)準(zhǔn)備篇
?
斷斷續(xù)續(xù)地看著內(nèi)核源碼,發(fā)現(xiàn)很多知識點(diǎn)都不是很明白,特別是對于操作系統(tǒng)的一些基礎(chǔ)。雖然看到了塊設(shè)備了,但是發(fā)現(xiàn)也總結(jié)不出什么了,這篇好像好久前更新的,一直沒有發(fā)表。最近還是比較忙碌,同事走了好多人,也有考慮過別的公司。但是正式工作未滿1年,也不能隨隨便便地就離開。雖然很忙,但是還是學(xué)了很多東西。漸漸地接觸了linux應(yīng)用層。發(fā)現(xiàn)應(yīng)用和驅(qū)動還是有很多區(qū)別的,各種需求,各種接口,各種設(shè)計(jì),各種實(shí)現(xiàn)。嗯,慢慢來總會學(xué)好的。對于內(nèi)核,慢慢看,看一遍不懂,那就第二遍,第三遍。相信總會看懂的。Fighting。。。。。。。。
?
2、????? 初始化init下只有一個main函數(shù)。
?????? 首先利用setup.s程序取得的程序參數(shù)設(shè)置系統(tǒng)的根文件設(shè)備號以及一些內(nèi)存全局變量。這些內(nèi)存變量指明了主內(nèi)存的開始地址、系統(tǒng)所擁有的內(nèi)存變量和作為高速緩沖區(qū)內(nèi)存的末端地址。如果還定義了虛擬盤(RAMDISK), 則主內(nèi)存將適當(dāng)減少。
?????? 然后,內(nèi)核進(jìn)行所有方面的硬件初始化工作。包括陷阱門、塊設(shè)備、字符設(shè)備和tty包括人工創(chuàng)建第一個任務(wù)(task 0)。待所有初始化工作完成就設(shè)置中斷允許標(biāo)志,開啟中斷。
?????? 在整個內(nèi)核完成初始化后,內(nèi)核將執(zhí)行權(quán)切換到了用戶模塊,也即CPU從0特權(quán)級切換到了第3特權(quán)級。然后
3、系統(tǒng)第一次調(diào)用創(chuàng)建進(jìn)程函數(shù)fork(),創(chuàng)建出一個用于運(yùn)行init()的子進(jìn)程。
?????? 在該進(jìn)程中系統(tǒng)將運(yùn)行控制臺程序。如果控制臺環(huán)境建立成功,則再生成一個子進(jìn)程,用于運(yùn)行shell程序/bin/sh。若該子進(jìn)程退出,父進(jìn)程返回,則父進(jìn)程進(jìn)入一個死循環(huán)內(nèi),繼續(xù)生成子進(jìn)程,并在此子進(jìn)程中再次執(zhí)行shell程序/bin/sh,而父進(jìn)程則繼續(xù)等待。
?????? 對于linux來說,所有任務(wù)都是在用戶模式執(zhí)行的,包括很多系統(tǒng)應(yīng)用程序,如shell程序、網(wǎng)絡(luò)子系統(tǒng)程序等
推薦精選
關(guān)于linux內(nèi)核體系結(jié)構(gòu)
?????? 說到操作系統(tǒng),我們都會知道windows操作系
4、統(tǒng),linux操作系統(tǒng),蘋果的iOS操作系統(tǒng),以前很火的塞班操作系統(tǒng),還有最近消費(fèi)類電子很火的Android操作系統(tǒng)。一個完整的操作系統(tǒng)分為4個部分。
推薦精選
? ? ? ?可以把這個理解為我們用的手機(jī)。其中的硬件系統(tǒng)就是我們看到的整個手機(jī)了,cpu啊,內(nèi)存啊,這些不拆開來看不到的,和觸摸屏啊,按鍵之類看以看到的。操作系統(tǒng)內(nèi)核就是我們說的android了,不過他包括了linux的內(nèi)核了。操作系統(tǒng)服務(wù)就是android的一套結(jié)構(gòu)了,給我們直觀的就是那個有點(diǎn)炫的界面了。我們可以通過點(diǎn)擊來實(shí)現(xiàn)我們想要的功能。用戶應(yīng)用就是我們常玩的QQ啊,導(dǎo)航啊,當(dāng)然少不了各種好玩的游戲了,憤怒的小鳥,
5、涂鴉跳,水果忍者,是不是又想玩一把?唉,還是好好學(xué)習(xí)吧,雖然手機(jī)就在旁邊。
對于linux內(nèi)核的單內(nèi)核模式的系統(tǒng),有可以把他分為如下:
?????? Linux內(nèi)核又可分為5個大的模塊。
其關(guān)系和主要功能可以見下圖:
推薦精選
推薦精選
關(guān)于linux內(nèi)存
物理內(nèi)存可以分為下圖所示:
內(nèi)核占用內(nèi)存開始部分;接下來是共硬盤,軟盤使用的高速緩沖區(qū)部分,其中扣除顯存和bios的640k到1m;然后是虛擬盤;最后一部分是為所有程序可以使用的主內(nèi)存區(qū)。
推薦精選
Linux內(nèi)存管理中,段變換:將一個由段選擇符和段內(nèi)偏移構(gòu)成的邏輯地址轉(zhuǎn)換為一個線性地址。頁變
6、換:將線性地址轉(zhuǎn)換為對應(yīng)的物理地址。具體可見下圖所示:
虛擬地址:指的是由程序產(chǎn)生的由段選擇符和段內(nèi)偏移地址兩個部分組成的地址。為什么叫它是虛擬的地址呢?因?yàn)檫@兩部分組成的地址并沒有直接訪問物理內(nèi)存,而是要通過分段地址的變換機(jī)構(gòu)處理或映射后才會對應(yīng)到相應(yīng)的物理內(nèi)存地址。
?????? 段描述符:向CPU提供了將邏輯地址映射為線性地址所必要的信息。描述符是由程序編譯器、鏈接器、加載器或者操作系統(tǒng)創(chuàng)建的。
?????? 描述符表:保存描述符在描述符表中的,有兩類
1、?全局描述符表(Global descriptor table---GDT)
2、?局部描述符表(Local desc
7、riptor table---LDT)
推薦精選
描述符表是由8字節(jié)構(gòu)成的描述符項(xiàng)的內(nèi)存中的一個數(shù)組。處理器是通過使用GDT和LDTR寄存器來定位GDT表和當(dāng)前的LDT表。最多可以含有8192(2^13)個描述符。
選擇符:邏輯地址的選擇部分,用于指定一描述符的,它是通過指定一描述符表并且索引其中的一個描述符項(xiàng)完成的。
段寄存器:處理器將描述符中的信息保存在段寄存器中,因而可以避免在每次訪問內(nèi)存時(shí)查詢描述符表。
?
推薦精選
?
?
線性地址:通過指定一個頁表、頁表中的某一頁以及頁中的偏移值,從而間接地指向?qū)?yīng)的物理地址。
頁表:一個簡單的32位頁指示器的數(shù)組。
8、頁表本身也是一頁內(nèi)存,因此它含有4K字節(jié)的內(nèi)存,可容納1K個32位的項(xiàng)。
推薦精選
?
Offset = 2^12=4K, table =2^10, directory = 2^10,所以線性地址空間為2^10*2^10*4k=4G。
由于0.11內(nèi)核把每個進(jìn)程的最大可用的虛擬內(nèi)存空間定義為64M,因此每個進(jìn)程的邏輯地址可以用任務(wù)號*64M,就可以轉(zhuǎn)換到線性空間的地址。
?
?
關(guān)于linux進(jìn)程
推薦精選
???????進(jìn)程可以在內(nèi)核態(tài)或者用戶態(tài)運(yùn)行,當(dāng)資源可用就被喚醒,進(jìn)入就緒態(tài);當(dāng)進(jìn)程處于可中斷睡眠狀態(tài),收到信號可被喚醒;當(dāng)處于不可中斷睡眠狀態(tài),只能被使用w
9、akeup等的喚醒;當(dāng)進(jìn)程處于暫停狀態(tài),可發(fā)送信號使其進(jìn)入就緒態(tài);當(dāng)僵死狀態(tài),當(dāng)已經(jīng)停止運(yùn)行,父進(jìn)程還沒有調(diào)用wait查詢狀態(tài),一旦父進(jìn)程調(diào)用完wait取得子進(jìn)程信息后,這個進(jìn)程任務(wù)數(shù)據(jù)結(jié)構(gòu)就會被釋放掉。
?
推薦精選
?
關(guān)于linux文件系統(tǒng)和源碼目錄
?
推薦精選
?
?
?
?
推薦精選
推薦精選
?
推薦精選
?
推薦精選
?
?
推薦精選
?
推薦精選
?
?
?
推薦精選
?
?
推薦精選
?
?
推薦精選
推薦精選
關(guān)于linux內(nèi)核ma
10、kefile
Linux makefile文件是編譯輔助工具軟件make的參數(shù)配置文件。Make工具軟件的主要用途是通過識別哪些文件已經(jīng)被修改過,從而自動地決定在一個含有多個源程序文件的程序系統(tǒng)中哪些文件需要被重新編譯。
???????這里的makefile主要作用是指示make程序最終使用獨(dú)立編譯連接成的tools/目錄中的build執(zhí)行程序?qū)⑺袃?nèi)核編譯代碼連接和合并成一個可運(yùn)行的內(nèi)核映像文件image。具體是對boot/目錄中的bootsect.s、setup.s使用8086匯編器進(jìn)行編譯,分別生成各自的執(zhí)行模塊。再對源代碼中的其他所有程序使用GNU的編譯器gcc/gas進(jìn)行編譯,并連接成模塊system。再用build工具將這三塊組合成一個內(nèi)核映像文件image。
?
(注:可編輯下載,若有不當(dāng)之處,請指正,謝謝!)
推薦精選