Linux記憶體管理 二 位址對映

2021-08-01 12:13:50 字數 2645 閱讀 2704

基本概念

cpu位數:alu位數;

匯流排:可作為位址匯流排或資料匯流排或控制匯流排使用,具體視傳送指令而定;

位址匯流排:cpu通過位址匯流排來指定儲存單元;

資料匯流排:cpu與記憶體或其他器件之間的資料傳送的通道,位數與cpu位數一樣;

cpu定址:cpu發出相應指令到位址匯流排上,尋找主存相應位址;

mmu:記憶體管理單元,轉換成實體地址,之後傳送到位址匯流排上;

定址方式的變化

遠古:

16位cpu,16位資料匯流排、20位位址匯流排;定址能力2^20=1mb

因為16位資料匯流排與20位位址匯流排的不匹配,故設計段暫存器(如cs)+段偏移暫存器(如ip)來完成20位的位址的合成。具體:段暫存器》4+段偏移暫存器=20位位址

但易出現問題:1、段暫存器+段偏移暫存器得到的實際位址,沒有保護的話,使用者很容易修改相應內容,造成計算機的破壞;2、定址能力的不夠,只有1mb

80386使用者空間:

32位cpu,32位資料匯流排,32位位址匯流排;定址能力2^32=4gb

明顯,直接傳送32位位址到位址匯流排上是最清晰的

但為了相容之前的cpu,以及防止直接篡改暫存器內容而任意訪問記憶體

設計保護模式:(之前直接得到實體地址-實模式)

設計gdt, ldt兩個位址表,表項中內容如下:

b0-b31即所指段基位址;

新添gdtr, ldtr兩個暫存器指向位址表所在位址

段暫存器仍為16位,但含義發生改變:

總結一下:

指令性質->段暫存器->gdtr/ldtr->gdt/ldt+段暫存器中index

->具體描述符->基位址+段偏移暫存器32位(如eip)->線性位址

但是,由於段的長度可變,盤區交換操作很容易不便,同時程序劃分為多段,需要頻繁改變段暫存器內容

頁式管理

如果將之前基位址都設定為0,那麼邏輯位址即偏移位址=線性位址=虛擬位址,這樣再經過一步頁式轉換得到實體地址,送到位址匯流排中。

具體,增設cr3暫存器,pgd、pmd、pt三個表

設定pgd、pmd、pt三個表主要是為了64位cpu等的擴充套件。

在32位cpu中pmd**中只有1項,所以3層對映實際即2層對映。

位址對映分為使用者空間—物理記憶體,核心空間—物理記憶體兩部分,以page_offset為界。

使用者空間:

intel為了相容之前系列產品,設計段暫存器->+gdtr\ldtr->gtd/ldt->+段暫存器index->基位址(都設為0)->+eip/程式計數器->線性位址->+cr3->三層頁面對映->實體地址

核心空間

核心的虛擬位址和實體地址,大部分只差乙個線性偏移量。

由於核心的虛擬和實體地址只差乙個偏移量:實體地址 = 邏輯位址 – 0xc0000000。所以如果1g核心空間完全用來線性對映,顯然物理記憶體也只能訪問到1g區間,這顯然是不合理的。highmem就是為了解決這個問題,專門開闢的一塊不必線性對映,可以靈活定製對映,以便訪問1g以上物理記憶體的區域。

在x86結構中,linux核心虛擬位址空間劃分0~3g為使用者空間,3~4g為核心空間(注意,核心可以使用的線性位址只有1g)。核心虛擬空間(3g~4g)又劃分為三種型別的區:

1. zone_dma 3g之後起始的16mb

2. zone_normal 16mb~896mb

3. zone_highmem 896mb ~1g 高階記憶體

高階記憶體的基本思想:借一段位址空間,建立臨時位址對映,用完後釋放,達到這段位址空間可以迴圈使用,訪問所有物理記憶體。

核心直接對映空間 page_offset~vmalloc_start:

kmalloc和__get_free_page()分配的是這裡的頁面。二者是借助slab分配器,直接分配物理頁再轉換為邏輯位址(實體地址連續)。適合分配小段記憶體。此區域 包含了核心映象、物理頁框表mem_map等資源。

核心動態對映空間 vmalloc_start~vmalloc_end:

被vmalloc用到,可表示的空間大。

核心永久對映空間 pkmap_base ~ fixaddr_start:

kmap

核心臨時對映空間 fixaddr_start~fixaddr_top:

kmap_atomic

虛擬記憶體管理是共性,x86的gdt和ldt是特性,但其實也只是走個過場。

Linux位址對映 3 位址轉換

部落格 fireaxe.blog.chinaunix.net 三 位址轉換 上圖揭示了程序空間 核心空間與實體地址之間的轉換關係。在linux中,實體地址用page結構表示,物理內存在初始化時已經生成了page結構管理,其他位址空間則需要生成page再進行管理 ioremap 實體地址可以被對映到核...

s3c6410位址對映

arm處理器為32bit處理器,內部32bit位址匯流排理論定址空間為4gb,對於6410來說,定址空間的高2gb在內部為保留 reserved 低2gb 0x0 0x7fffffff 可劃分為2部分 主儲存區 main memory area 和外設區 peripheral area 6410核心...

s3c6410位址對映

arm處理器為32bit處理器,內部32bit位址匯流排理論定址空間為4gb,對於6410來說,定址空間的高2gb在內部為保留 reserved 低2gb 0x0 0x7fffffff 可劃分為2部分 主儲存區 main memory area 和外設區 peripheral area boot映象...