八千字硬核長文梳理Linux內(nèi)核概念及學(xué)習(xí)路線

      網(wǎng)友投稿 897 2025-04-01

      01 前言

      本文主要講解什么是Linux內(nèi)核,以及通過多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux內(nèi)核,能看懂Linux內(nèi)核。

      擁有超過1300萬行的代碼,Linux內(nèi)核是世界上最大的開源項目之一,但是內(nèi)核是什么,它用于什么?

      02 什么是內(nèi)核

      內(nèi)核是與計算機(jī)硬件接口的易替換軟件的最低級別。它負(fù)責(zé)將所有以“用戶模式”運行的應(yīng)用程序連接到物理硬件,并允許稱為服務(wù)器的進(jìn)程使用進(jìn)程間通信(IPC)彼此獲取信息

      03 內(nèi)核還要分種類?

      3.1 微內(nèi)核

      微內(nèi)核只管理它必須管理的東西:CPU、內(nèi)存和IPC。計算機(jī)中幾乎所有的東西都可以被看作是一個附件,并且可以在用戶模式下處理。微內(nèi)核具有可移植性的優(yōu)勢,因為只要操作系統(tǒng)仍然試圖以相同的方式訪問硬件,就不必?fù)?dān)心您是否更改了視頻卡,甚至是操作系統(tǒng)。微內(nèi)核對內(nèi)存和安裝空間的占用也非常小,而且它們往往更安全,因為只有特定的進(jìn)程在用戶模式下運行,而用戶模式不具有管理員模式的高權(quán)限。

      可移植性

      安裝占用空間小

      小內(nèi)存占用

      安全

      通過驅(qū)動程序,硬件更加抽象

      硬件可能反應(yīng)較慢,因為驅(qū)動程序處于用戶模式

      進(jìn)程必須在隊列中等待才能獲得信息

      進(jìn)程不能在不等待的情況下訪問其他進(jìn)程

      3.2 單內(nèi)核

      單內(nèi)核與微內(nèi)核相反,因為它們不僅包含CPU、內(nèi)存和IPC,而且還包含設(shè)備驅(qū)動程序、文件系統(tǒng)管理和系統(tǒng)服務(wù)器調(diào)用等內(nèi)容。單內(nèi)核更擅長于訪問硬件和多任務(wù)處理,因為如果一個程序需要從內(nèi)存或運行中的其他進(jìn)程中獲取信息,那么它就有一條更直接的線路來訪問信息,而不需要在隊列中等待來完成任務(wù)。但是,這可能會導(dǎo)致問題,因為在管理模式下運行的東西越多,如果行為不正常,就會有越多的東西導(dǎo)致系統(tǒng)崩潰。

      更直接地訪問程序的硬件

      流程之間更容易通信

      如果支持您的設(shè)備,它應(yīng)該不需要額外安裝就可以工作

      進(jìn)程反應(yīng)更快,因為沒有等待處理器時間的隊列

      較*安裝體積

      較*內(nèi)存占用

      不太安全,因為所有操作都在管理模式下運行

      3.3 混合的內(nèi)核

      混合內(nèi)核能夠選擇在用戶模式下運行什么,以及在管理模式下運行什么。通常情況下,設(shè)備驅(qū)動程序和文件系統(tǒng)I/O將在用戶模式下運行,而IPC和服務(wù)器調(diào)用將保持在管理器模式下。這是兩全其美,但通常需要硬件制造商做更多的工作,因為所有驅(qū)動程序的責(zé)任都由他們來承擔(dān)。它還可能存在一些與微內(nèi)核固有的延遲問題。

      4.1 Pros

      開發(fā)人員可以選擇什么在用戶模式下運行,什么在管理模式下運行

      比單片內(nèi)核更小的安裝占用空間

      比其他型號更靈活

      4.2 Cons

      會遭受與微內(nèi)核相同的進(jìn)程延遲

      設(shè)備驅(qū)動程序需要由用戶管理(通常)

      05 Linux內(nèi)核文件在哪里

      Ubuntu中的內(nèi)核文件存儲在/boot文件夾中,稱為vmlinux -version。vmlinuz這個名字來自于unix世界,早在60年代,他們就把內(nèi)核簡單地稱為“unix”,所以當(dāng)內(nèi)核在90年代首次開發(fā)時,Linux就開始把內(nèi)核稱為“Linux”。

      當(dāng)開發(fā)虛擬內(nèi)存以便更容易地進(jìn)行多任務(wù)處理時,將“vm”放在文件的前面,以顯示內(nèi)核支持虛擬內(nèi)存。有一段時間,Linux內(nèi)核被稱為vmlinux,但是內(nèi)核變得太*,無法裝入可用的引導(dǎo)內(nèi)存,因此壓縮了內(nèi)核映像,并將末尾的x更改為z,以顯示它是用zlib壓縮的。并不總是使用相同的壓縮,通常用LZMA或BZIP2替換,一些內(nèi)核簡單地稱為zImage。

      版本號將采用A.B.C.格式D在。B可能是2.6,C是您的版本,D表示您的補(bǔ)丁或補(bǔ)丁。

      在/boot文件夾中還有其他非常重要的文件,稱為initrd.img-version、system.map-version, config-version。initrd文件用作一個小RAM磁盤,用于提取和執(zhí)行實際的內(nèi)核文件。這個系統(tǒng)。map文件用于內(nèi)核完全加載之前的內(nèi)存管理,配置文件告訴內(nèi)核在編譯內(nèi)核映像時要加載哪些選項和模塊。

      06 Linux內(nèi)核體系結(jié)構(gòu)

      因為Linux內(nèi)核是單片的,所以它比其他類型的內(nèi)核占用空間最大,復(fù)雜度也最高。這是一個設(shè)計特性,在Linux早期引起了相當(dāng)多的爭論,并且仍然帶有一些與單內(nèi)核固有的相同的設(shè)計缺陷。

      為了解決這些缺陷,Linux內(nèi)核開發(fā)人員所做的一件事就是使內(nèi)核模塊可以在運行時加載和卸載,這意味著您可以動態(tài)地添加或刪除內(nèi)核的特性。這不僅可以向內(nèi)核添加硬件功能,還可以包括運行服務(wù)器進(jìn)程的模塊,比如低級別虛擬化,但也可以替換整個內(nèi)核,而不需要在某些情況下重啟計算機(jī)。

      想象一下,如果您可以升級到Windows服務(wù)包,而不需要重新啟動……

      07 內(nèi)核模塊

      如果Windows已經(jīng)安裝了所有可用的驅(qū)動程序,而您只需要打開所需的驅(qū)動程序怎么辦?這本質(zhì)上就是內(nèi)核模塊為Linux所做的。內(nèi)核模塊,也稱為可加載內(nèi)核模塊(LKM),對于保持內(nèi)核在不消耗所有可用內(nèi)存的情況下與所有硬件一起工作是必不可少的。

      模塊通常向基本內(nèi)核添加設(shè)備、文件系統(tǒng)和系統(tǒng)調(diào)用等功能。lkm的文件擴(kuò)展名是.ko,通常存儲在/lib/modules目錄中。由于模塊的特性,您可以通過在啟動時使用menuconfig命令將模塊設(shè)置為load或not load,或者通過編輯/boot/config文件,或者使用modprobe命令動態(tài)地加載和卸載模塊,輕松定制內(nèi)核。

      第三方和封閉源碼模塊在一些發(fā)行版中是可用的,比如Ubuntu,默認(rèn)情況下可能無法安裝,因為這些模塊的源代碼是不可用的。該軟件的開發(fā)人員(即nVidia、ATI等)不提供源代碼,而是構(gòu)建自己的模塊并編譯所需的.ko文件以便分發(fā)。雖然這些模塊像beer一樣是免費的,但它們不像speech那樣是免費的,因此不包括在一些發(fā)行版中,因為維護(hù)人員認(rèn)為它通過提供非免費軟件“污染”了內(nèi)核。

      內(nèi)核并不神奇,但對于任何正常運行的計算機(jī)來說,它都是必不可少的。Linux內(nèi)核不同于OS X和Windows,因為它包含內(nèi)核級別的驅(qū)動程序,并使許多東西“開箱即用”。希望您能對軟件和硬件如何協(xié)同工作以及啟動計算機(jī)所需的文件有更多的了解。

      08 Linux 內(nèi)核學(xué)習(xí)經(jīng)驗總結(jié)

      開篇

      學(xué)習(xí)內(nèi)核,每個人都有自己的學(xué)習(xí)方法,仁者見仁智者見智。以下是我在學(xué)習(xí)過程中總結(jié)出來的東西,對自身來說,我認(rèn)為比較有效率,拿出來跟大家交流一下。

      內(nèi)核學(xué)習(xí),一偏之見;疏漏難免,懇請指正。

      為什么寫這篇博客

      剛開始學(xué)內(nèi)核的時候,不要執(zhí)著于一個方面,不要專注于一個子系統(tǒng)就一頭扎到實際的代碼行中去,因為這樣的話,牽涉的面會很廣,會碰到很多困難,容易產(chǎn)生挫敗感,一個函數(shù)體中(假設(shè)剛開始的時候正在學(xué)習(xí)某個方面的某個具體的功能函數(shù))很可能摻雜著其他各個子系統(tǒng)方面設(shè)計理念(多是大量相關(guān)的數(shù)據(jù)結(jié)構(gòu)或者全局變量,用于支撐該子系統(tǒng)的管理工作)下相應(yīng)的代碼實現(xiàn),這個時候看到這些東西,紛繁蕪雜,是沒有頭緒而且很不理解的,會產(chǎn)生很多很多的疑問,(這個時候如果對這些疑問糾纏不清,刨根問底,那么事實上就是在學(xué)習(xí)當(dāng)前子系統(tǒng)的過程中頻繁的去涉足其他子系統(tǒng),這時候注意力就分散了),而事實上等了解了各個子系統(tǒng)后再回頭看這些東西的話,就簡單多了,而且思路也會比較清晰。所以,要避免 “只見樹木,不見森林”,不要急于深入到底層代碼中去,不要過早研究底層代碼。

      八千字硬核長文梳理Linux內(nèi)核概念及學(xué)習(xí)路線

      我在大二的時候剛開始接觸內(nèi)核,就犯了這個錯誤,一頭扎到內(nèi)存管理里頭,去看非常底層的實現(xiàn)代碼,雖然也是建立在內(nèi)存管理的設(shè)計思想的基礎(chǔ)上,但是相對來說,比較孤立,因為此時并沒有學(xué)習(xí)其它子系統(tǒng),應(yīng)該說無論是視野還是思想,都比較狹隘,所以代碼中牽涉到的其它子系統(tǒng)的實現(xiàn)我都直接跳過了,這一點還算聰明,當(dāng)然也是迫不得已的。

      我的學(xué)習(xí)方法

      剛開始,我認(rèn)為主要的問題在于你知道不知道,而不是理解不理解,某個子系統(tǒng)的實現(xiàn)采用了某種策略、方法,而你在學(xué)習(xí)中需要做的就是知道有這么一回事兒,然后才是理解所描述的策略或者方法。

      根據(jù)自己的學(xué)習(xí)經(jīng)驗,剛開始學(xué)習(xí)內(nèi)核的時候,我認(rèn)為要做的是在自己的腦海中建立起內(nèi)核的大體框架,理解各個子系統(tǒng)的設(shè)計理念和構(gòu)建思想,這些理念和思想會從宏觀上呈獻(xiàn)給你清晰的脈絡(luò),就像一個去除了枝枝葉葉的大樹的主干,一目了然;當(dāng)然,肯定還會涉及到具體的實現(xiàn)方法、函數(shù),但是此時接觸到的函數(shù)或者方法位于內(nèi)核實現(xiàn)的較高的層次,是主(要)函數(shù),已經(jīng)了解到這些函數(shù),針對的是哪些設(shè)計思想,實現(xiàn)了什么樣的功能,達(dá)成了什么樣的目的,混個臉熟的說法在這兒也是成立的。至于該主函數(shù)所調(diào)用的其它的輔助性函數(shù)就等同于枝枝葉葉了,不必太早就去深究。此時,也就初步建立起了內(nèi)核子系統(tǒng)框架和代碼實現(xiàn)之間的關(guān)聯(lián),關(guān)聯(lián)其實很簡單,比如一看到某個函數(shù)名字,就想起這個函數(shù)是針對哪個子系統(tǒng)的,實現(xiàn)了什么功能。

      我認(rèn)為此時要看的就是LKD3,這本書算是泛泛而談,主要就是從概念,設(shè)計,大的實現(xiàn)方法上描述各個子系統(tǒng),而對于具體的相關(guān)的函數(shù)實現(xiàn)的代碼講解很少涉及(對比于ULK3,此書主要就是關(guān)于具體函數(shù)代碼的具體實現(xiàn)的深入分析,當(dāng)然,你也可以看,但是過早看這本書,會感覺很痛苦,很枯燥無味,基本上都是函數(shù)的實現(xiàn)),很少,但不是沒有,這就很好,滿足我們當(dāng)前的需求,還避免我們過早深入到實際的代碼中去。而且本書在一些重要的點上還給出了寫程序時的注意事項,算是指導(dǎo)性建議。主要的子系統(tǒng)包括:內(nèi)存管理,進(jìn)程管理和調(diào)度,系統(tǒng)調(diào)用,中斷和異常,內(nèi)核同步,時間和定時器管理,虛擬文件系統(tǒng),塊I/O層,設(shè)備和模塊。(這里的先后順序其實就是LKD3的目錄的順序)。

      我學(xué)習(xí)的時候是三本書交叉著看的,先看LKD3,專于一個子系統(tǒng),主要就是了解設(shè)計的原理和思想,當(dāng)然也會碰到對一些主要函數(shù)的介紹,但大多就是該函數(shù)基于前面介紹的思想和原理完成了什么樣的功能,該書并沒有就函數(shù)本身的實現(xiàn)進(jìn)行深入剖析。然后再看ULK3和PLKA上看同樣的子系統(tǒng),但是并不仔細(xì)分析底層具體函數(shù)的代碼,只是粗略地、不求甚解地看,甚至不看。因為,有些時候,在其中一本書的某個點上,卡殼了,不是很理解了,在另外的書上你可能就碰到對同一個問題的不同角度的描述,說不準(zhǔn)哪句話就能讓你豁然開朗,如醍醐灌頂。我經(jīng)常碰到這種情況。

      并不是說學(xué)習(xí)過程中對一些函數(shù)體的實現(xiàn)完全就忽略掉,只要自己想徹底了解其代碼實現(xiàn),沒有誰會阻止你。我是在反復(fù)閱讀過程中慢慢深入的。比如VFS中文件打開需要對路徑進(jìn)行分析,需要考慮的細(xì)節(jié)不少(.././之類的),但是其代碼實現(xiàn)是很好理解的。再比如,CFS調(diào)度中根據(jù)shedule latency、隊列中進(jìn)程個數(shù)及其nice值(使用的是動態(tài)優(yōu)先級)計算出分配給進(jìn)程的時間片,沒理由不看的,這個太重要了,而且也很有意思。

      ULK3也會有設(shè)計原理與思想之類的概括性介紹,基本上都位于某個主題的開篇段落。但是更多的是對支持該原理和思想的主要函數(shù)實現(xiàn)的具體分析,同樣在首段,一句話綜述函數(shù)的功能,然后對函數(shù)的實現(xiàn)以1、2、3,或者a、b、c步驟的形式進(jìn)行講解。我只是有選擇性的看,有時候?qū)φ罩胹ource ?insight打開的源碼,確認(rèn)一下代碼大體上確實是按書中所描述的步驟實現(xiàn)的,就當(dāng)是增加感性認(rèn)識。由于步驟中摻雜著各種針對不同實現(xiàn)目的安全性、有效性檢查,如果不理解就先跳過。這并不妨礙你對函數(shù)體功能實現(xiàn)的整體把握。

      Intel V3,針對X86的CPU,本書自然是系統(tǒng)編程的權(quán)威。內(nèi)核部分實現(xiàn)都可以在本書找到其根源。所以,在讀以上三本書某個子系統(tǒng)的時候,不要忘記可以在V3中相應(yīng)章節(jié)找到一些基礎(chǔ)性支撐信息。

      在讀書過程中,會產(chǎn)生相當(dāng)多的疑問,這一點是確信無疑的。大到搞不明白一個設(shè)計思想,小到不理解某行代碼的用途。各個方面,各種疑問,你完全可以把不理解的地方都記錄下來(不過,我并沒有這么做,沒有把疑問全部記下來,只標(biāo)記了很少一部分我認(rèn)為很關(guān)鍵的幾個問題),專門寫到一張紙上,不對,一個本上,我確信會產(chǎn)生這么多的疑問,不然內(nèi)核相關(guān)的論壇早就可以關(guān)閉了。其實,大部分的問題(其中很多問題都是你知道不知道有這么一回事的問題)都可以迎刃而解,只要你肯回頭再看,書讀百遍,其義自現(xiàn)。多看幾遍,前前后后的聯(lián)系明白個七七八八是沒有問題的。我也這么做了,針對某些子系統(tǒng)也看了好幾遍,切身體會。

      子系統(tǒng)進(jìn)行管理工作需要大量的數(shù)據(jù)結(jié)構(gòu)。子系統(tǒng)之間交互的一種方式就是各個子系統(tǒng)各自的主要數(shù)據(jù)結(jié)構(gòu)通過指針成員相互引用。學(xué)習(xí)過程中,參考書上在講解某個子系統(tǒng)的時候會對數(shù)據(jù)結(jié)構(gòu)中主要成員的用途解釋一下,但肯定不會覆蓋全部(成員比較多的情況,例如task_struct),對其它子系統(tǒng)基于某個功能實現(xiàn)的引用可能解釋了,也可能沒做解釋,還可能說這個變量在何處會做進(jìn)一步說明。所以,不要糾結(jié)于一個不理解的點上,暫且放過,回頭還可以看的。之間的聯(lián)系可以在對各個子系統(tǒng)都有所了解之后再建立起來。其實,我仍然在強(qiáng)調(diào)先理解概念和框架的重要性。

      等我們完成了建立框架這一步,就可以選擇一個比較感興趣的子系統(tǒng),比如驅(qū)動、網(wǎng)絡(luò),或者文件系統(tǒng)之類的。這個時候你再去深入了解底層代碼實現(xiàn),相較于一開始就鉆研代碼,更容易一些,而且碰到了不解之處,或者忘記了某個方面的實現(xiàn),此時你完全可以找到相應(yīng)的子系統(tǒng),因為你知道在哪去找,查漏補(bǔ)缺,不僅完成了對當(dāng)前函數(shù)的鉆研,而且可以回顧、溫習(xí)以前的內(nèi)容,融會貫通的時機(jī)就在這里了。

      《深入理解linux虛擬內(nèi)存》(2.4內(nèi)核版本),LDD3,《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》,幾乎每一個子系統(tǒng)都需要一本書的容量去講解,所以說,剛開始學(xué)習(xí)不宜對某個模塊太過深入,等對各個子系統(tǒng)都有所了解了,再有針對性的去學(xué)習(xí)一個特定的子系統(tǒng)。這時候?qū)ζ渌到y(tǒng)的援引都可以讓我們不再感到茫然、復(fù)雜,不知所云。

      比如,LDD3中的以下所列章節(jié):構(gòu)造和運行模塊,并發(fā)和競態(tài),時間、延遲及延緩操作,分配內(nèi)存,中斷處理等,都屬于驅(qū)動開發(fā)的支撐性子系統(tǒng),雖說本書對這些子系統(tǒng)都專門開辟一個章節(jié)進(jìn)行講解,但是詳細(xì)程度怎么能比得上PLKA,ULK3,LKD3這三本書,看完這三本書,你會發(fā)現(xiàn)讀LDD3這些章節(jié)的時候簡直跟喝白開水一樣,太隨意了,因為LDD3的講解比之LKD3更粗略。打好了基礎(chǔ),PCI、USB、TTY驅(qū)動,塊設(shè)備驅(qū)動,網(wǎng)卡驅(qū)動,需要了解和學(xué)習(xí)的東西就比較有針對性了。這些子系統(tǒng)就屬于通用子系統(tǒng),了解之后,基于這些子系統(tǒng)的子系統(tǒng)的開發(fā)—驅(qū)動(需進(jìn)一步針對硬件特性)和網(wǎng)絡(luò)(需進(jìn)一步理解各種協(xié)議)—相對而言,其學(xué)習(xí)難度大大降低,學(xué)習(xí)進(jìn)度大大加快,學(xué)習(xí)效率大大提升。說著容易做來難。達(dá)到這樣一種效果的前提就是:必須得靜下心來,認(rèn)真讀書,要看得進(jìn)去,PLKA,ULK3厚得都跟磚頭塊兒一樣,令人望之生畏,如果沒有興趣,沒有熱情,沒有毅力,無論如何都是不行,因為需要時間,需要很長時間。我并不是說必須打好了基礎(chǔ)才可以進(jìn)行驅(qū)動開發(fā),只是說打好了基礎(chǔ)的情況下進(jìn)行開發(fā)會更輕松,更有效率,而且自己對內(nèi)核代碼的駕馭能力會更強(qiáng)大。這只是我個人見解,我自己的學(xué)習(xí)方式,僅供參考。

      語言

      PLKA是個德國人用德語寫的,后來翻譯成英文,又從英文翻譯成中文,我在網(wǎng)上書店里沒有找到它的紙質(zhì)英文版,所以就買了中文版的。ULK3和LKD3都是英文版的。大牛們寫的書,遣詞造句真的是簡潔,易懂,看原版對我們學(xué)習(xí)計算機(jī)編程的程序員來說完全不成問題,最好原汁原味。如果一本書確實翻譯地很好,我們當(dāng)然可以看中文版的,用母語進(jìn)行學(xué)習(xí),理解速度和學(xué)習(xí)進(jìn)度當(dāng)然是很快的,不作他想。看英文的時候不要腦子里想著把他翻譯成中文,沒必要。

      API感想

      “比起知道你所用技術(shù)的重要性,成為某一個特別領(lǐng)域的專家是不重要的。知道某一個具體API調(diào)用一點好處都沒有,當(dāng)你需要他的時候只要查詢下就好了。”這句話源于我看到的一篇翻譯過來的博客。我想強(qiáng)調(diào)的就是,這句話針應(yīng)用型編程再合適不過,但是內(nèi)核API就不完全如此。

      內(nèi)核相當(dāng)復(fù)雜,學(xué)習(xí)起來很不容易,但是當(dāng)你學(xué)習(xí)到一定程度,你會發(fā)現(xiàn),如果自己打算寫內(nèi)核代碼,到最后要關(guān)注的仍然是API接口,只不過這些API絕大部分是跨平臺的,滿足可移植性。內(nèi)核黑客基本上已經(jīng)標(biāo)準(zhǔn)化、文檔化了這些接口,你所要做的只是調(diào)用而已。當(dāng)然,在使用的時候,最好對可移植性這一話題在內(nèi)核中的編碼約定爛熟于心,這樣才會寫出可移植性的代碼。就像應(yīng)用程序一樣,可以使用開發(fā)商提供的動態(tài)庫API,或者使用開源API。同樣是調(diào)用API,不同點在于使用內(nèi)核API要比使用應(yīng)用API了解的東西要多出許多。

      當(dāng)你了解了操作系統(tǒng)的實現(xiàn)—這些實現(xiàn)可都是對應(yīng)用程序的基礎(chǔ)性支撐啊—你再去寫應(yīng)用程序的時候,應(yīng)用程序中用到的多線程,定時器,同步鎖機(jī)制等等等等,使用共享庫API的時候,聯(lián)系到操作系統(tǒng),從而把對該API的文檔描述同自己所了解到的這些方面在內(nèi)核中的相應(yīng)支撐性實現(xiàn)結(jié)合起來進(jìn)行考慮,這會指導(dǎo)你選擇使用哪一個API接口,選出效率最高的實現(xiàn)方式。對系統(tǒng)編程頗有了解的話,對應(yīng)用編程不無益處,甚至可以說是大有好處。

      設(shè)計實現(xiàn)的本質(zhì),知道還是理解

      操作系統(tǒng)是介于底層硬件和應(yīng)用軟件之間的接口,其各個子系統(tǒng)的實現(xiàn)很大程度上依賴于硬件特性。書上介紹這些子系統(tǒng)的設(shè)計和實現(xiàn)的時候,我們讀過了,也就知道了,如果再深入考慮一下,為什么整體架構(gòu)要按照這種方式組織,為什么局部函數(shù)要遵循這樣的步驟處理,知其然,知其所以然,如果你知道了某個功能的實現(xiàn)是因為芯片就是這么設(shè)計的,CPU就是這么做的,那么你的疑問也就基本上到此為止了。再深究,就是芯片架構(gòu)方面的設(shè)計與實現(xiàn),對于程序員來講,無論是系統(tǒng)還是應(yīng)用程序員,足跡探究到這里,已經(jīng)解決了很多疑問,因為我們的工作性質(zhì)偏軟,而這些東西實在是夠硬。

      比如,ULK3中講解的中斷和異常的實現(xiàn),究其根源,那是因為Intel x86系列就是這么設(shè)計的,去看看Intel ?V3手冊中相應(yīng)章節(jié)介紹,都可以為ULK3中描述的代碼實現(xiàn)方式找到注解。還有時間和定時器管理,同樣可以在Intel V3 ?對APIC的介紹中獲取足夠的信息,操作系統(tǒng)就是依據(jù)這些硬件特性來實現(xiàn)軟件方法定義的。

      又是那句話,不是理解不理解的問題,而是知道不知道的問題。有時候,知道了,就理解了。在整個學(xué)習(xí)過程中,知道,理解,知道,理解,知道……,交叉反復(fù)。為什么開始和結(jié)尾都是知道,而理解只是中間步驟呢?世界上萬事萬物自有其規(guī)律,人類只是發(fā)現(xiàn)而已,實踐是第一位的,實踐就是知道的過程,實踐產(chǎn)生經(jīng)驗,經(jīng)驗的總結(jié)就是理論,理論源于實踐,理論才需要理解。我們學(xué)習(xí)內(nèi)核,深入研究,搞來搞去,又回到了芯片上,芯片是物質(zhì)的,芯片的功用基于自然界中物質(zhì)本有的物理和電子特性。追本溯源,此之謂也。

      動手寫代碼

      紙上得來終覺淺,絕知此事要躬行。只看書是絕對不行的,一定要結(jié)合課本給出的編程建議自己敲代碼。剛開始就以模塊形式測試好了,或者自己編譯一個開發(fā)版本的內(nèi)核。一臺機(jī)器的話,使用UML方式調(diào)試,內(nèi)核控制路走到哪一步,單步調(diào)試看看程序執(zhí)行過程,比書上的講解更直觀明了。一定要動手實際操作。

      LDD3 ? ? ? ? ?Linux Device Driver 3rd

      LDD3 ? ? ? ? ?Linux Device Driver 3rd

      LKD3 ? ? ? ? ?Linux Kernel Development 3rd

      LKD3 ? ? ? ? ?Linux Kernel Development 3rd

      ULK3 ? ? ? ? ?Understanding the Linux Kernel 3rd

      ULK3 ? ? ? ? ?Understanding the Linux Kernel 3rd

      PLKA ? ? ? ? ?Professional Linux Kernel Architecture

      PLKA ? ? ? ? ?Professional Linux Kernel Architecture

      UML ? ? ? ? ? ?User Mode Linux

      UML ? ? ? ? ? ?User Mode Linux

      Intel V3 ? ? ? Intel? 64 and IA-32 Architectures Software Developer’s Manual ?Volume 3 (3A, 3B & 3C): System Programming Guide

      Intel V3 ? ? ? Intel? 64 and IA-32 Architectures Software Developer’s Manual ?Volume 3 (3A, 3B & 3C): System Programming Guide

      盡信書不如無書。

      http://lwn.net/Articles/419855/ 此處是一篇關(guān)于LKD3的書評,指出了其中的錯誤,當(dāng)你讀完的時候,不妨去找找,看一下自己在其中所描述的地方有什么特別的印象。

      http://lwn.net/Articles/161190/此處是一篇對ULK3的介紹,我認(rèn)為其中很關(guān)鍵的幾句話就可以給本書定位:

      這幾句話對本書的描述非常到位。基于此,作為指導(dǎo)性原則,我們就可以很有效率地使用它了。

      看一本技術(shù)書籍,書中的序言部分絕對是首先應(yīng)該翻閱的,其次就是目錄。我發(fā)現(xiàn)在閱讀過程中我會頻繁的查看目錄,甚至是喜歡看目錄。

      結(jié)尾

      興趣的力量是無窮的。興趣能帶來激情,如果工作可以和興趣結(jié)合到一起,工作起來才會有熱情,那么工作就不只是工作了,更是一種享受。

      Linux,我的興趣,我的動力,我的方向,我的未來!

      來源?:https://www.cnblogs.com/still-smile/p/13977370.html

      Linux 任務(wù)調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:啟動Excel時自動打開指定工作簿的兩種設(shè)置方法(EXCEL工作簿文件在默認(rèn)情況下會打開( )個工作表)
      下一篇:微軟發(fā)布Office365“用戶密碼箱”的使用演示視頻及使用方法
      相關(guān)文章
      亚洲欧美日韩久久精品| 亚洲在成人网在线看| 激情综合亚洲色婷婷五月APP| 久久久久久亚洲AV无码专区| 亚洲av无码一区二区三区不卡| 亚洲精品无码久久久久去q| 亚洲精品无码永久在线观看| 在线观看亚洲免费视频| 亚洲AV永久无码精品网站在线观看| 亚洲色大成网站www| 亚洲精品无码专区| 亚洲成a人片在线观看天堂无码| 亚洲日本VA中文字幕久久道具| 日本亚洲色大成网站www久久| 最新亚洲春色Av无码专区| 亚洲中文无码mv| 亚洲欧美黑人猛交群| 亚洲av无码片vr一区二区三区| 国产成人精品日本亚洲语音| 久久水蜜桃亚洲AV无码精品 | 无码专区—VA亚洲V天堂| 久久久亚洲精品无码| 久久青青草原亚洲av无码app| 91精品国产亚洲爽啪在线观看| 久久精品亚洲中文字幕无码麻豆 | 亚洲Aⅴ无码一区二区二三区软件| 国产精品亚洲精品日韩电影| jizzjizz亚洲| 中文字幕亚洲一区| 国产亚洲无线码一区二区| 亚洲AV日韩AV永久无码免下载| 2022年亚洲午夜一区二区福利 | 亚洲一区二区三区亚瑟| 中文字幕亚洲精品无码| 极品色天使在线婷婷天堂亚洲| 亚洲色偷偷综合亚洲AV伊人| 国产aⅴ无码专区亚洲av| 1区1区3区4区产品亚洲| 亚洲熟女www一区二区三区| 国产精品亚洲综合| 久久精品国产亚洲麻豆|