《深入理解Linux核心3rd》學習筆記——第2章:記憶體定址

來源:互聯網
上載者:User

  基於80x86微處理器的電腦中,記憶體定址的轉換過程是:邏輯地址→線性地址(虛擬位址)→物理地址。參與記憶體定址的MMU(儲存空間嵌入式管理單元)中有兩個重要的部分——分段單元和分頁單元,前者負責將邏輯地址轉換為線性地址,後者負責將線性地址轉換為實際的物理地址。

 

硬體分段機制 

  每個邏輯地址包含兩個部分:一個段標識和一個段中位移offset。這個段標識就是段選擇子(Segment Selector),該資料結構中有3個域:index域、TI域、RPL域。TI=0表示該段儲存在通用描述元表GDT中,TI=1表示該段儲存在局部描述符表LDT中。一種寄存器叫段寄存器,儲存了這個段選擇子。
  每個段還有一個段描述符(Segment Descriptor)與之對應,該資料結構中儲存了段的基本屬性,比如存取權限和段長等。通過這個段描述符的Base域能夠定位到這個段所對應的線性地址。

  在Linux系統中,有兩種表,GDT和LDT,GDT是唯一的,這兩個資料結構中儲存了一些段的段描述符,通過它們可以在記憶體中找到某個段的段描述符。

  定址的過程是這樣的。從段寄存器中取出段選擇子,段選擇子的index域乘以8之後得到一個位移,該位移就是該段的段描述符在GDT或LDT中的索引,通過TI得到該段是在GDT還是LDT中,並從GDTR或LDTR寄存器中得到GDT或LDT的地址,然後與位移相加,即得到該段的段描述符地址,然後與邏輯地址中的段中位移相加,即得到了該邏輯地址對應的線性地址。即

  當TI=0時,linear addr = index * 8 + [GDTR] + offset,否則linear addr = index * 8 + [LDTR] + offset

  為了更快地進行邏輯地址到線性地址的轉換,80x86提供了一個不可程式化的寄存器,用來存放段描述符,這樣,當一個段的段選擇子被段寄存器載入的時候,不可程式化寄存器就從記憶體載入該段的段描述符地址,這樣,就可以通過不可程式化寄存器得到段描述符的地址,不需要通過GDT或LDT了,加速了地址轉換的過程。 

 

硬體分頁機制

  分頁單元是將線性地址轉換為物理地址。

  一個線性地址被劃分為固定長度的多個塊,每塊稱之為一個頁或頁面(page),在一個頁面上的連續的地址也被映射到連續的物理地址上。

  分頁單元認為RAM是被劃分為多個等長的頁框(page frame)的,每個頁框包含一個頁面。

  常規的分頁方法從80386開始,將32位線性地址劃分為3部分:目錄(高10位)、表(中間10位)、位移(低12位)。這樣,每個頁就有2的12次方,即4KB的大小。同時,CPU有一個CR3寄存器,儲存頁目錄的基地址,實際上CR3與進程關聯,不同進程的CR3中的值不同。

  常規的分頁採用了2級分頁,其定址過程是這樣的,1、CR3中的值(頁目錄基地址)+線性地址的目錄的值=頁表基地址;2、頁表基地址+線性地址中的表的值=頁框物理地址,該頁框物理地址包含了一個頁面的資料;3、頁框基地址+線性地址的位移=物理地址。其中,頁目錄資料結構包含了一些頁表的屬性位,而頁表資料結構包含了一些頁面的屬性。

  關於PAE(實體位址延伸)和64位地址的分頁,其原理和常規的分頁方式類似,且64位地址具有平台依賴性,本文不進行描述。

  為了降低CPU訪存帶來的負面的效率問題,在CPU和RAM中引入了快取,其依據是“局部性原理”。

  80x86中還包含了稱之為轉換後援緩衝器(TLB)的硬體,以此來加速線性地址的轉換,每個CPU都有一個自己的TLB,當一個線性地址被第一次使用時,計算其物理地址,並將物理地址存放在一個TLB表中,以後每次訪問同一個線性地址都能夠通過TLB快速地得到轉換。當CPU的CR3寄存器被修改時,該CPU的TLB所有項都會無效。

 

Linux的分頁機制

  從Linux 2.6.11開始,Linux根據不同的架構,將分頁機制統一為4級分頁機制,可以適應PAE和64位地址,其核心思想與常規分頁相同,僅僅是中間引入了Page Upper Directory和Page Middle Directory這兩個資料結構。

  Linux 2.6.11的核心源碼中,定義了很多宏和函數來操作Page Table、Page Middle Directory、Page Upper Directory和Page Global Directory,本文不進行詳細描述。

 

物理地址布局

  在Linux系統初始化的時候,核心必須建立一個物理地址映射,來指明哪些物理位址範圍能夠被核心使用。一般地,Linux核心被載入到物理地址為0x00100000的RAM上,前面空出了1MB的空間。這是因為一些空出的空間要被BIOS來使用。

  在系統引導的早期階段,核心請求BIOS並獲得物理地址的大小。在現代的電腦中,核心調用BIOS過程來建立一個物理位址範圍表,以及其對應的儲存類型。

  然後系統調用函數machine_specific_memory_setup(void)(include/asm-i386/mach-default/setup_arch_post.h),該函數建立物理地址映射,在該函數中,通過BIOS的E820表得到記憶體映射的資訊。如果沒法通過E820表來得到資訊,該函數按照預設的方式來建立記憶體映射表:從0x9F到0x100之間的頁框被標記為保留。

  setup_memory(void)函數在machine_specific_memory_setup之後被調用,用來分析物理地址地區並初始化一些資料來描述物理地址的布局。

進程頁表和核心頁表

  進程的線性地址分為兩個部分:0x00000000~0xbfffffff(3GB)的使用者態線性地址和0xc0000000~0xffffffff(1GB)的核心態線性地址。宏PAGE_OFFSET的值即為0xc0000000——核心空間的開始處。

  頁全域目錄表的前一部分映射的線性地址小於0xc000000(PAE未啟動時是前768項,PAE啟動後是前3項),其剩餘的表項對所有進程來說都是一樣的,等於主核心全域目錄相應的表項。

  核心維護著自己使用的頁表,稱之為主核心頁全域目錄。當核心映像剛剛被裝入記憶體後,CPU運行於實模式,此時分頁功能未啟用。核心初始化自己的頁表的過程分為兩個階段。

  第1個階段,核心建立一個有限的地址空間,包括核心程式碼片段和核心資料區段、初始頁表和用於存放動態資料結構的128KB的空間,該空間僅夠核心裝入RAM盒對其初始化的核心資料結構。

  第2個階段,核心充分利用剩餘的RAM來建立頁表(見“臨時核心頁表”)。

臨時核心頁表

  臨時頁全域目錄是在核心編譯過程中靜態地初始化,而臨時頁表則由函數startup_32函數(arch/i386/kernel/head.S)初始化的,此時的Page Upper Directory和Page Middle Directory等同於頁全域目錄項。

  臨時頁全域目錄存放在swapper_pg_dir變數中,臨時頁表在pg0變數處開始存放,緊接在核心為初始化的資料區段之後。這裡假設核心、臨時頁表和上文提到的128KB的空間能夠容納在RAM的前8MB空間裡。為了映射8MB空間,核心需要用到2個頁表項。

  分頁的第一個階段的目標是允許在實模式下和保護模式下都能很容易地對這8MB進行定址,因此,核心建立一個映射,把0x00000000~0x007fffff(8M)和0xc0000000~0xc07fffff(8M)的線性地址映射到0x00000000~0x007fffff的物理地址。

  然後,核心把swapper_pg_dir的所有項都填充為0來建立期望的映射,除了第0、1、0x300(768)和0x301(769)這四個表項。這4項初始化過程如下:

  • 0 項和0x300項的地址欄位設定為pg0的物理地址,而1項和0x301項的地址欄位設定為緊隨pg0後的頁框的物理地址。
  • 這4項的Present、Read/Write和User/Supervisor標誌置位。
  • 這4項的Accessed、Dirty、PCD、PWD和Page Size標誌清零。

  同時,在startup_32函數中也啟用了分頁單元,即向cr3寄存器中寫入swapper_pg_dir的地址,並設定cr0寄存器的PG標誌。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.