linux核心原理剖析 記憶體定址(一)

2021-10-05 07:14:49 字數 1766 閱讀 8609

最近總想分享點硬核的原創文章出來,一是硬核技術是乙個程式設計師真正應該修煉

的內功;二是修煉硬核技能是通往架構師領域的必經之路。本系列文章將分享關

於linux核心設計原理相關的內容,希望能打通我們的七經八脈,真正領悟底層系

所謂記憶體定址,簡單說來就是cpu接受到指令後需要從記憶體中取得相應資料,但是記憶體中的資料都是有對應位址的,需要通過位址來獲取相應位址段上的資料,這也就是為什麼要記憶體定址。

所謂位址在作業系統中分為邏輯位址、線性位址、實體地址。

從80286和x86開始就引入了安全模式,也就是保護模式(實體地址是通過轉換對映並且提供了安全驗證)。在80286的保護模式也只是乙個過渡,在80286的情況下匯流排位址變為了24位,但是暫存器還是16位,也就是記憶體定址空間達到了16m,但是單個暫存器的定址空間仍為64k。但是此狀況在80386處理器中就得到了解決,匯流排位址和暫存器都變為了32位,單個暫存器的定址空間達到了4g,不但定址能力得到了提高,其為了提高安全性,引入了段描述符表的概念,也就是不是所有的段在使用者空間都可以訪問,關於上述分段機制、段描述符表等原理在下面章節都會介紹。

分段機制就是將邏輯位址轉為線性位址,同時也增加安全性。

段選擇符

乙個邏輯位址是由16位段選擇符和32位偏移量組成。

為了加快查詢段選擇符的速度,處理器提供了段暫存器,段暫存器主要目的就是為了儲存段選擇符。提供了6種段暫存器,分別是cs、ds、es、ss、fs、和gs。

其他三種暫存器作為普通用途。

段描述符

每個段有乙個8個位元組的段描述符,段描述符描述了段的基本資訊,如段的基位址、特權級別等。存在全域性段描述符和區域性段描述符,全域性段描述符放在全域性段描述符表(gdt)中,區域性段描述符放在區域性段描述符表中(ldt)中。

段描述符字段:

base:包含段的首位元組的線性位址。

limit:存放改段最後乙個位元組的偏移量。

dpl:標識當前段描述符的特權級別。為0即是核心態,也就是訪問這個段需要核心態(看段選擇符的cpl的值),為3即使使用者態,也就是所有段選擇符都可以訪問。

上面是幾個主要的段描述符字段,當然還有其他的字段,大家感興趣的可以自行查詢。

段描述符分類:

段描述符分為上面三個型別,其中可以看到base(首位元組的線性位址)佔32位,也包含了我上面說過的limit和dpl。

快速查詢段描述符

為了快速由段選擇符查詢到段描述符,80x86處理器提供了非程式設計暫存器(程式設計師不可訪問),這個暫存器儲存了段描述符,這樣邏輯位址轉換為線性位址就不需要每次都訪問存放在主記憶體中的gdt了,直接訪問暫存器中的段描述符就可以了,這樣就加快了轉換速度。

邏輯位址轉為線性位址其實是用到了乙個叫分段單元的硬體:

上圖說明了邏輯位址轉為線性位址的過程。即首先通過邏輯位址中的ti來找到改邏輯位址是屬於哪個段描述符(gdt/ldt),然後得到相應的gdt/ldt的位址(假設為a),那麼a+邏輯位址中的index*8找到段描述符,線性位址即為找到的段描述符的base位址+邏輯位址中的偏移位址。

linux核心原理剖析 磁碟定址 分割槽

充一篇關於更為底層的 磁碟定址,讓我們更清楚的了解計算機在 硬碟上是如何定址的。上圖顯示了計算機系統中磁碟的形態。其中磁碟會在主軸上通過機械搖臂旋轉,乙個磁碟上下會有2個磁頭 圖中為了方便,只畫了乙個 當旋轉時,磁頭在磁碟上畫出磁軌 乙個磁碟上有多個磁軌 每個磁軌的立面稱為柱面,兩個磁軌之間會分割成...

Linux核心剖析 核心的記憶體管理

核心的記憶體管理不同於使用者空間的記憶體管理,首先來講核心本身的限制點就比較多,比如核心一般不能睡眠,因此處理記憶體錯誤一般來講是件很困難的事情,再加上其他限制以及核心記憶體機制不能太複雜導致想獲取核心記憶體變成了一件難事。在說核心的記憶體管理機制之前,首先我們得明白核心記憶體管理的基本單位才行,一...

linux核心設計與實現 記憶體定址

如果這個世界上只有risc架構的處理器的話,記憶體定址就非常簡單了,無非是虛擬位址轉實體地址什麼的.但是由於有x86的存在,記憶體管理複雜了許多.由於歷史影響,x86不得不一直保留著傳統的段式定址方式.記憶體位址 在x86下有邏輯位址 段 偏移量 線性位址 虛擬位址 和實體地址.對於x86架構來說,...