基本概念
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映象...