一、概述處理器(cpu)
1.1 處理器位數
在intel處理器的
x86系列中,包含8086和8088的16位處理器,以及從80386(即i386)開始的32位處理器,而如今又有
x86-64
架構的64位處理器。
那這些16位,32位和64位又有什麼意義了?位數越高,處理器的定址能力越強,則可以支援越大的物理記憶體。具體如下表(可見對於64位處理器的定址範圍已經是非常之大):
處理器位數
可支援的物理記憶體大小
定址範圍
162^16 = 64k
0x0000 ~ 0xffff
322^32 = 4g
0x00000000 ~ 0xffffffff
642^64
在平時安裝作業系統時候,經常會問是要裝32位系統還是64位系統?對於32位處理器,只能安裝32位的系統,不能安裝64位系統。對於64位處理,既能夠安裝32位的系統,也可以安裝64位的系統。在linux下可以通過下面的方面查詢系統裝的是幾位的:
(1) 檢視根目錄下是否有有lib64目錄。32位系統只有/lib乙個目錄,64位的系統會有/lib64和/lib兩個目錄。
(2) 執行getconf long_bit命令檢視返回結果。32位的系統中long型別是4位元組(32位),64位的系統中long型別已變成了8位元組(64位)。
(3) 執行uname -i命令。32位的系統返回i386,64位的系統放回x86_64。
(4) 執行file /bin/ls命令。
32位系統返回如下結果:
/bin/ls: elf 32-bit lsb executable, intel 80386, version 1 (sysv), for gnu/linux 2.2.5,dynamically linked (uses shared libs), stripped
64位系統返回如下結果:
/bin/ls: elf 64-bit lsb executable, amd x86-64, version 1 (sysv), for gnu/linux 2.6.9,dynamically linked (uses shared libs), for gnu/linux 2.6.9, stripped
1.2 處理器的暫存器
暫存器是處理器的組成部分,是有限存貯容量的高速存貯部件,它們可用來暫存指令、資料和位址。暫存器的訪問速度在所有儲存階層(見下圖)是最快的。
那麼,mmu是怎麼將邏輯位址轉換成實體地址?
mmu是一種硬體電路,它包含兩個部件,乙個是分段部件,乙個是分頁部件,通過分段機制(把乙個邏輯位址轉換為線性位址,線性位址也是32位,其位址取值範圍為0x00000000~0xffffffff)和分頁機制(把乙個線性位址轉換為實體地址),最終將邏輯位址對映為實體地址。如下圖:
在linux中,主要設定了:核心**段,核心資料段,使用者**段,使用者資料段。而且每個段的基位址對應線性位址都是為0,而且都可以使用4g的位址空間,相當與繞過了邏輯位址和線性位址的對映,從而完全利用了分頁機制。另外,分段中怎樣使用段暫存器可以參考:
2.3 分頁機制
通過使用分頁機制可以很好的提高記憶體利用率。分頁機制把乙個線性位址轉換為實體地址。linux下乙個頁大小為4k,把線性位址(32位)和實體地址(32位,2^32=4g物理記憶體)都按照4k(2^12)頁大小來進行劃分,那麼,一共有4g/4k=1m的頁面,如果只是簡單的進行線性位址和實體地址一對一記錄對映的話,這樣在對映表建立的就會占用比較大的物理記憶體。這個時候就引入了頁表和頁目錄表,位址轉換過程見下圖:
(1) 通過對32位線性位址劃分:第31~22這10位(2^10=1024)定位頁目錄項,第21~12這10位定位頁表項,第11~0這12位(2^12=4k)為頁內偏移值。
(2) 對於頁目錄表,有1024個頁目錄項,每個頁目錄項(又含有1024個頁表項)指向下一級頁表的實體地址(32位=4個位元組),那麼一共需要1024*4(=4k)位元組,即只要分配一頁就可以完全存放。
(3) 對於頁表,原理和頁目錄表一樣,那麼一共需要1024(1024個頁目錄項)*1024(每個頁目錄項含有1024個頁表項)*4(=1m)位元組。
(4) 對於頁目錄的實體地址,就存放在cr3暫存器中。
所以,這樣可以定址1024*1024*4k=4g的物理記憶體。另外,在linux的x86架構引入了3級頁表機制(包括了頁全域性目錄、頁中間目錄和頁表)。
【參考】
1、深入分析linux核心原始碼
2、oreilly.understanding.the.linux.kernel.3rd.edition
3、ppt:
4、
核心頁表和程序頁表
初學核心時,經常被 核心頁表 和 程序頁表 搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係 核心頁表 程序頁表 每個程序自己的頁表,放在程序自身的頁目錄task struct.pgd中。在保護模式下,從硬體角度看,其執行的基本物件為 程序 或執行緒 而定址則依賴於 程序頁表 在程序排程而...
關於使用者程序頁表和核心頁表
普通使用者程序的頁表也是存在核心空間的。這很容易理解,畢竟頁表沒有vma來對應。在應用程序建立的時候,task struct m struct描述記憶體資訊,mm gpd指定頁表基位址。頁表的分配是通過呼叫核心夥伴演算法介面分配到物理記憶體,核心在啟動階段已經建立了核心頁表,使用者程序的頁表可以分為...
分頁和頁表
除了分段,空間管理的第二種常見方式是分頁。linux將虛擬記憶體劃分成固定大小的頁 linux中的頁大小是4kb 並且以頁作為操作記憶體的最小單元。例如一次性讀取一頁,虛擬記憶體中的頁稱為虛擬頁。對應的,物理記憶體也會劃分成固定大小的頁來管理,稱為物理頁,也常稱為頁框或頁幀 page frame 物...