深入理解linux內核之(一)內存尋址
深入理解linux內核之內存尋址
基於80x86微內核處理器,我們將地址分為三類:
- 邏輯地址,也就是我們在匯編語言中使用的,由段和偏移量組成。例如指定操作數地址,這些都是邏輯地址,邏輯地址也就是我們寫程序的時候用到的地址。
- 線性地址, 也就是虛擬地址,32位機器,虛擬地址最高可以訪問4G
- 物理地址
MMU內存管理單元電路,將邏輯地址通過分段單元(Segmentation UNIT)轉換成線性地址,將線性地址通過分頁單元(Page UNIT)轉換為物理地址
Linux除了特定的8086構架以外,Linux一般不適用分段的方式,用這種尋址相對簡單,而且在各個平台之間具有可移植性,目前除了我們熟悉的i386外,大部分處理器都支持分頁機製。
了解分頁機製,需要理解兩個概念:
- 頁:固定長度的一段間隔,對於32位機器來說,一般是4k.。頁內部連續的線性地址映射連續的物理地址。頁是可以包含數據的一係列的線性地址組,也可以叫集合。
- 頁框(page framework):分頁單元(page UNIT)把RAM看做是若幹有固定長度的頁框,RAM由若幹頁框構成(理論上的劃分)。那麼,頁框其實就是物理內存中塊的概念,RAM可以被分成很多塊。頁框內部就是內存塊。頁框和頁結合起來看,那麼頁就是水,頁框就是杯子,水可以放到任何一個杯子裏麵。也即是說,某個頁和某個頁框之間不是綁定的。固定的是頁框,可以移動的是頁。
- 頁表:也表示將虛擬地址映射到物理地址的數據結構。
Linux使用多級分頁的機製。
對於32位機器來說,2級分頁就足夠了。對於6使用4級分頁。
下麵針對32位機器的2級分頁進行講解Linux的多級分頁機製
32位地址通常劃分為3部分:
- 0~11:OFFSET
- 12~21:TABLE
- 22~31:DIRECTORY
具體劃分情況可以看下圖:
從上麵這個圖我們就可以看的很明白了。
當前正在使用的Page Directory的物理地址是被保存在在一個叫cr3的寄存器中。我們假設cr3中的值是m。那麼對於一個特定的32位地址(線性地址)來說,m加上DIRECTORY的值就是Page Table的地址,此地址指向一個Page frame的地址,這個Page frame地址加上OFFSET偏移量,就可以對該Page內的數據進行訪問。可以見,由於OFFSET是12位的,那麼一個Page內部的偏移量可以從達到4k。這也就是為什麼32位機器,一般一個Page是4k的原因了。DIRECTORY有10位,TABLE有10位,OFFSET有12位,1024 x 1024 x 4096 = 4G 。由此,32位線性地址就可以訪問4G的內容了。
理論上,4G都是可以訪問的,但是對於一個進程來說,需要對這4G空間重新劃分,用戶空間可以訪問0~3G的3G的空間,內核空間隻能訪問3~4G的1G空間。
在linux啟動過程中,linux內核鏡像文件是在0x00100000開始被裝載的,之前的1M空間被用來運行BIOS一起相關初始化工作。
版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/09/13/5880239.aspx
最後更新:2017-04-02 06:51:24