天天看點

讀《深入了解Linux核心》筆記:第零篇 [author: linkrain]讀《深入了解Linux核心》筆記:第零篇 [author: linkrain]

讀《深入了解Linux核心》筆記:第零篇 [author: linkrain]

80x86微處理器中的位址

在80x86微處理器中,存在三種不同的位址概念:

  1. 邏輯位址
  2. 線性位址(虛拟位址)
  3. 實體位址

邏輯位址:

在機器語言中用來指定操作數或者指令的位址。邏輯位址由兩部分構成,分别是段以及段内偏移量。(16位的段選擇符與32位的段内偏移量)

線性位址(虛拟位址):

以連續的二進制數方式組織的位址表示形式,以連續的方式對實體位址進行映射。線性位址通常是一個32位無符号整數,總共可以表示4GB個位址,通常使用8位16進制數來表示,其範圍為0x00000000至0xFFFFFFFF。

實體位址:

用于記憶體晶片級記憶體單元尋址。它們與從微處理器晶片上的位址引腳發送到記憶體總線上的電信号相對應。實體位址由32位或者36位無符号整數表示。

位址轉換:

記憶體控制單元-MMU通過叫分段單元-segmentation unit的硬體電路把邏輯位址轉換成線性位址,接着通過叫分頁單元-paging unit的硬體電路把線性位址轉換成實體位址。

記憶體仲裁器-memory arbiter:

在RAM晶片上,讀或寫操作必須串行執行,是以同一時間RAM隻能為一個目标提供服務。

在多處理器系統中,多個CPU可以并發通路RAM晶片;在單處理器系統中,存在DMA能夠和CPU同時通路RAM。是以,為了避免多個目标同時通路RAM晶片造成的沖突,在RAM晶片前面存在一個硬體子產品用于進行通路沖突處理,這個硬體子產品就是記憶體仲裁器。

段選擇符與段描述符:

邏輯位址由16位的段選擇符與32位的段内偏移量組成。其中段選擇符共有三個字段,索引号-index、表訓示器-TI、請求者特權級-RPL。

其中索引号占高13位,請求者特權級占低2位,表訓示器占剩餘的1位。

請求者特權級占2位意味着存在4種不同的特權級,但在Linux中,隻用到特權級3與特權級0,分别對應使用者态與核心态。

段描述符存儲于描述符表中,描述符表共有兩種,GDT-全局描述符表、LDT-局部描述符表。段描述符共有8位元組長度,即64位。

由于段選擇符中用于表示段描述符在描述符表中的位置的索引号-index字段隻占13位,是以GDT或LDT中總共能夠存儲213個段描述符。**在GDT中,第一個段描述符總是全0**,這用來確定空段選擇符會被認為是無效的。是以,在GDT中,最多隻能存儲213-1個段描述符。

段的查找路徑是這樣的:

  1. 從邏輯位址中拿到段選擇符,将段選擇符存入段寄存器,通過段選擇符中的表訓示器-TI字段判斷是從全局描述符表-GDT還是從局部描述符表-LDT中查找對應段
  2. 确定從GDT或是LDT中查找對應段後,通過段選擇符中的索引号字段去相應的描述符表中查找對應段的段描述符,GDT從gdtr-全局描述符表寄存器中獲得GDT的基線性位址,LDT的基線性位址則從ldtr-局部描述符表寄存器中獲得
  3. 之後将對應段的段描述符存入對應段寄存器的一個非程式設計寄存器中,這樣如果該段寄存器中的段選擇符沒有改變,就不需要再重複地去描述符表中查找對應的段描述符了

段寄存器:

存在6個段寄存器,其中三個為特殊用途段寄存器,剩餘三個為通用段寄存器。

  • cs(代碼段寄存器)
  • ds(資料段寄存器)
  • ss(棧段寄存器)
  • es
  • fs
  • gs

cs-代碼段寄存器含有一個2位的字段CPL-目前特權級,用以指明CPU的目前特權級,同RPL類似,Linux中隻用到了3與0,對應使用者态與核心态。

同一個段寄存器可以通過寄存器内容暫存的方式用于不同的用途,即将寄存器的内容暫時存入記憶體,待寄存器用完後再從記憶體恢複其内容。

段的大小:

在段描述符中,有一個粒度标志-G字段,占1位,當此字段置0時,那麼段的容量機關以1位元組計,當此字段置1時,段的容量機關以4KB計;

在段描述符中,還有一個段末偏移量-Limit字段,用來表示段的最後一位元組的偏移量,當G字段為0時,此偏移量範圍在1B~1MB之間;當G字段為1時,此偏移量範圍在4KB~4GB之間。