《深入理解Linux核心》 2 2 硬體分段

2021-08-20 14:31:56 字數 1232 閱讀 1633

宣告: 以下是對原文知識點的提煉總結,並非對照翻譯。因為直接翻譯並不容易理解。

linux把記憶體位址粗略的分為幾個區域,分別用作不同的功能,就叫分段。為什麼要分段?因為linux程序對不同位址空間的初始化、申請釋放、訪問許可權都不相同,所以要區分對待。

常見的有六種段,它們是大學課程裡面就介紹過的:cs、ss、ds、es、fs、gs。我們主要關注前三種段,它們分別是**段,堆疊段,資料段,這三種段對應了程序空間中的三塊位址空間。顧名思義,**段就是存放**的區域,該區域對使用者是唯讀的,堆疊段就是棧空間,主要用來儲存區域性變數,資料段主要用來存放靜態資料和全域性資料。

比段更細粒度的劃分是分頁,之後的章節會講到。

段選擇器

段暫存器

段暫存器用來存放段選擇器的內容,它的作用是為了更快地獲取段選擇器。

前面提到常見的六種記憶體段cs、ss、ds、es、fs、gs,對應這六種段有六種暫存器,它們的名字和它們所對應的段一樣。

段描述符

段描述符用來儲存每個段的資訊,它的長度為64位,其中包含了基位址資訊、段屬性、訪問許可權等資訊,我們重點關注的是它內部儲存的段基位址,這個基位址加上邏輯位址中的偏移就是虛擬位址(參考下圖)。

段描述符儲存在gdt(全域性描述符表)中,或者ldt(區域性描述符表)中,我們重點關注gdt。

前面提到常用的有三種段(cs、ss、ds),因此gdt中至少儲存了這三個段的描述符。通過gdt可以獲取到相應段的描述符,進而通過這個段描述符可以訪問具體的段空間。

看下圖標註數字地箭頭1、2、3、4,這就是邏輯位址到虛擬位址的轉換過程。

圖2-2 邏輯位址到虛擬位址的轉換

轉換過程主要有以下幾步:

1、取出邏輯位址中的段選擇器部分,根據ti(table indicator)判斷段描述符是儲存在gdt中還是ldt中。這裡我們重點關注gdt。

2、段選擇器中的index*8(左移三位)就是段描述符在gdt中的位置,加上gdt的基位址,就是段描述符的位址,從而取出段描述符。

3、段描述符中的儲存了該段的基位址(base), 該位址加上邏輯位址中的offset就是虛擬位址,即虛擬位址=base+offset。虛擬位址也叫做線性位址(linear address)。

深入理解Linux核心 核心同步

核心基本的同步機制 搶占核心的主要特點 乙個在核心態執行的程序,可能在執行核心函式期間被另外乙個程序取代。核心搶占 linux 2.6允許使用者在編譯核心的時候配置十分啟用 程序臨界區 每個程序中訪問臨界資源 一次僅允許乙個程序使用的共享資源 的那段 稱為臨界區。優化屏障 保證編譯程式不會混淆放在原...

深入理解linux核心手記

linux的段式管理是對應於程式結構的,是一種自然的想法,linux共有6個段暫存器,其中有3個專門的段暫存器 cs 段暫存器 ss 程式棧段暫存器 ds 資料段暫存器 程式需要6個段 bss 存放未初始化資料,只有名稱和大小 段 資料段 存放已初始化資料 棧段,堆段。段式管理段缺點 相比喻頁式管理...

深入理解Linux核心3

unix核心提供了應用程式可以執行的環境,因此,核心必須實現一組服務及相應的介面。應用程式使用這些介面而不會跟硬體資源直接互動。啟用核心例程的幾種方式 核心恢復乙個程序執行時,用程序描述符中的合適字段裝載cpu暫存器 等待狀態可能會有很多,有程序描述符佇列實現 自旋鎖 檢查訊號量耗時多,對於時間較短...