|
CPU 是如何執(zhí)行一條指令的?這張表描述了 Linux 系統(tǒng)中幾個段描述符信息。 數(shù)據(jù)段和代碼段,仔細看一下相關書籍就知道這些描述符代表什么意思,但是: 為什么這幾個段的 Base 地址都是 0x00000000? 為什么 Limit 都是 0xfffff? 為什么它們的 Type 類型和優(yōu)先級 DPL 又各不相同? 如果沒有對 x86 平臺的一些基礎知識的理解,要啃完這本書真的是挺費力氣的! 更要命的是,隨著 Linux 內(nèi)核代碼的體積不斷膨脹,最新的 5.13 版本壓縮檔已經(jīng)是一百多兆了: 這么一個龐然大物,如何下手才能真正的學好 Linux 呢?! 即便是從 Linux 0.11 版本開始,其中的很多代碼看起來也是非常費勁的! 周末在整理一些吃灰的書籍時,發(fā)現(xiàn)幾本以前看過的好書: 王爽的《匯編語言》,李忠的《從實模式到保護模式》,馬朝暉翻譯的《匯編語言程序設計》等等。 都是非常-非常-老的書籍,再次翻了一下,真心覺得內(nèi)容寫得真好! 對一些概念、原理、設計思路的描述,清晰而透徹。 Linux 系統(tǒng)中的很多關于分段、內(nèi)存、寄存器相關的設計,都可以在這些書籍中找到基礎支撐。 于是乎,我就有了一個想法:是否可以把這些書籍中,與 Linux 系統(tǒng)相關的內(nèi)容進行一次重讀和整理,但絕不是簡單的知識搬運。 考慮了一下,大概有下面幾個想法:
先確定最終目標的目標:學習 Linux 操作系統(tǒng);
這幾本書寫的都是匯編語言,以及比較基礎的底層知識。我們會淡化匯編語言部分,把重點放在與 Linux 操作系統(tǒng)有關聯(lián)的原理部分;
不會嚴格按照書中的內(nèi)容、順序來輸出文章,而是把幾本書中內(nèi)容相關的部分放在一起學習、討論; 有些內(nèi)容,可以與 Linux 2.6 版本中的相關部分進行對比分析,這樣的話在以后學習 Linux 內(nèi)核部分時,可以找到底層的支撐; 最后,希望我自己能堅持這個系列,也算是給自己的一個梳理吧。
一句話:以基礎知識為主! 古老的 Intel8086 處理器 8086 是 Intel 公司的第一款 16 位處理器,誕生于 1978 年,應該比各位小伙伴的年齡都大一些。 在 Intel 公司的所有處理器中,它占有很重要的地位,是整個 Intel 32 位架構處理器(IA-32)的開山鼻祖。 那么,問題來了,什么叫 16 位的處理器? 有些人會把處理器的位數(shù)與地址總線的位數(shù)搞混在一起! 我們知道,CPU 在訪問內(nèi)存的時候,是通過地址總線來傳送物理地址的。 8086 CPU 有 20 位的地址線,可以傳送 20 位地址。 每一根地址線都表示一個 bit,那么 20 個 bit 可以表示的最大值就是 2 的 20 次方。 也就是說:最大可以定位到 1M 地址的內(nèi)存,這稱作 CPU 的尋址能力。 但是,8086 處理器卻是 16 位的,因為:
運算器一次最多可以處理 16 位的數(shù)據(jù); 寄存器的最大寬度為 16 位; 寄存器和運算器之間的通路為 16 位;
也就是說:在 8086 處理器的內(nèi)部,能夠一次性處理、傳輸、暫時存儲的最大長度是 16 位,因此,我們說它是 16 位結構的 CPU。 主存儲器是什么? 計算機的本質(zhì)就是對數(shù)據(jù)的存儲和處理,那么參與計算的數(shù)據(jù)是從哪里來的呢?那就是一個稱作 存儲器(Storage 或 Memory)的物理器件。 從廣義上來說,只要能存儲數(shù)據(jù)的器件都可以稱作存儲器,比如:硬盤、U盤等。 但是,在計算機內(nèi)部,有一種專門與 CPU 相連接,用來存儲正在執(zhí)行的程序和數(shù)據(jù)的存儲器,一般稱作內(nèi)存儲器或者主存儲器,簡稱:內(nèi)存或主存。 內(nèi)存按照字節(jié)來組織,單次訪問的最小單位是 1 個字節(jié),這是最基本的存儲單元。 每一個存儲單元,也就是一個字節(jié),都對應著一個地址,如下圖所示: CPU 就通過地址總線來確定:對內(nèi)存中的哪一個存儲單元中的數(shù)據(jù)進行訪問。 第 1 個字節(jié)的地址是 0000H,第 2 個字節(jié)的地址是 0001H,后面以此類推。 圖中的這個內(nèi)存,最大存儲單元的地址是 FFFFH,換算成十進制就是 65535,因此這個內(nèi)存的容量是 65536 字節(jié),也就是 64 KB。 這里有一個原子操作的問題可以考慮一下。 在 Linux 內(nèi)核代碼中,很多地方使用了原子操作,比如:互斥鎖的實現(xiàn)代碼。 為什么原子操作需要對變量的類型限制為 int 型呢?這就涉及到對內(nèi)存的讀寫操作了。 盡管內(nèi)存的最小組成單位是字節(jié),但是,經(jīng)過精心的設計和安排,不同位數(shù)的 CPU,能夠按照字節(jié)、字、雙字進行訪問。 換句話說,僅通過單次訪問,16 位處理器就能處理 16 位的二進制數(shù),32 位處理器就能處理32 位的二進制數(shù)。 寄存器是什么? 在 CPU 內(nèi)部,一些都是代表 0 或 1 的電信號,這些二進制數(shù)字的一組電信號出現(xiàn)在處理器內(nèi)部線路上,它們是一排高低電平的組合,代表著二進制數(shù)中的每一位。 在處理器內(nèi)部,必須用一個稱為寄存器的電路把這些數(shù)據(jù)鎖存起來。 因此,寄存器本質(zhì)上也屬于存儲器的一種。只不過它們位于處理器的內(nèi)部,CPU 訪問寄存器比訪問內(nèi)存的速度更快。 處理器總是很忙的,在它操作的過程中,所有數(shù)據(jù)在寄存器里面只能是臨時存在一小會,然后再被送往別處,這就是為什么它被叫做“寄存器”。 剛才說了,這些寄存器都是 16 位的。由于需要與以前更古老的處理器兼容,其中的 4 個寄存器:AX、BX、CX、DX 還可以當成 2 個 8 位的寄存器來使用。 |