版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、linux中的物理地址和虛擬地址2010-05-27 09:54:35| 分類:Linux學(xué)習(xí)|標(biāo)簽:|字號(hào)大中小 訂閱在支持MMU的32位處理器平臺(tái)上,Linux系統(tǒng)中的物理存儲(chǔ)空間和虛擬存儲(chǔ)空間的地址范圍分別都是從0x00000000 到0XFFFFFFFF,共4GB,但物理存儲(chǔ)空間與虛擬存儲(chǔ)空間布局完全不同。Linux運(yùn)行在虛擬存儲(chǔ)空間,并負(fù)責(zé)把系統(tǒng)中實(shí)際存在的遠(yuǎn)小于4GB的物理內(nèi)存根據(jù)不同需求映射到整個(gè)4GB的虛擬存儲(chǔ)空間中。物理存儲(chǔ)空間布局Linux的物理存儲(chǔ)空間布局與處理器相關(guān),詳細(xì)情況可以從處理器用戶手冊(cè)的存儲(chǔ)空間分布表(memorymap )相關(guān)章節(jié)中查到,我們這里只列出嵌入式
2、處理器平臺(tái)Linux物理內(nèi)存空間的一般布局,如圖18-4所示。按肌科齊*_pi 肛0業(yè)JbajftBHBjlsfapj. _ HOdeJbOatuMmjiaFh fit Pt 時(shí)齊按直計(jì)捍一_j)i ncde JootiQ_iaa由-】_ nod Jjcottnonjaisi) )( jn(_ ndjr 按 P(對(duì)芥)+0X6000(_pi(_st*st) *0號(hào)3 的懇輛歿碼脅X員n-1號(hào)no住的很戟?dú)W碼表(X必)M決曲的內(nèi)拉丸耳所占愛憾+OidOOOL_P5WP1KB500)this.width=500;圖18-4 Linux物理內(nèi)存空間一般布局示意圖說(shuō)明:1) 最大 node 號(hào) n 不
3、能大于 MAX_NUMNODES-1 。2) MAX_NUMNODES 表示系統(tǒng)支持的最多 node數(shù)。在ARM系統(tǒng)中,Sharp芯片最多支持16個(gè)nodes, 其他芯片最多支持 4個(gè)nodes。3) numnodes是當(dāng)前系統(tǒng)中實(shí)際的內(nèi)存 node數(shù)。4) 在不支持 CONFIG_DISCONTIGMEM 選項(xiàng)的系統(tǒng)中,只有一個(gè)內(nèi)存node。5) 最大bank號(hào)m不能大于NR_BANKS-1。6) NR_BANKS表示系統(tǒng)中支持的最大內(nèi)存 bank數(shù),一般等于處理器的 RAM片選數(shù)。在ARM系統(tǒng)中,Sharp芯片最多支持 16個(gè)banks,其他芯片最多支持 8個(gè)banks。7) mem_in
4、it()函數(shù)會(huì)將所有節(jié)點(diǎn)的頁(yè)幀位碼表所占空間、孔洞頁(yè)描述符空間及空閑內(nèi)存頁(yè)都釋放掉。虛擬存儲(chǔ)空間布局在支持MMU的系統(tǒng)中,當(dāng)系統(tǒng)做完硬件初始化后就使能MMU功能,這樣整個(gè)系統(tǒng)就運(yùn)行在虛擬存儲(chǔ)空間中,實(shí)現(xiàn)虛擬存儲(chǔ)空間到物理存儲(chǔ)空間映射功能的是處理器的MMU,而虛擬存儲(chǔ)空間與 5路存儲(chǔ)空間的映射關(guān)系則是由Linux內(nèi)核來(lái)管理的。32位系統(tǒng)中物理存儲(chǔ)空間占 4GB空間,虛擬存儲(chǔ)空間同樣占 4GB 空間,Linux把物理空間中實(shí)際存在的遠(yuǎn)遠(yuǎn)小于4GB的內(nèi)存空間映射到整個(gè) 4GB虛擬存儲(chǔ)空間中除映射I/O空間之外的全部空間,所以虛擬內(nèi)存空間遠(yuǎn)遠(yuǎn)大于物理內(nèi)存空間,這就說(shuō)同一塊物理內(nèi)存可能映射到多處虛擬內(nèi)存
5、地址空間上,這正是Linux內(nèi)存管理職責(zé)所在。圖18-5列岀了 Linux內(nèi)核中虛擬內(nèi)存空間的一般布局(其實(shí)I/O空間也在其中,通常占用高端內(nèi)存空間,在此未標(biāo)岀)。高端內(nèi)存 國(guó)定映刖琵筒端內(nèi)存Ita.6KB皿皿:麾東分B?切JS 坯址業(yè)隹戦的內(nèi)存仝何VMALLOC_OFFSET C=$MB)OkHTFFPFFFECADDR STARTPKMAP_BASEVMALLCi 好 TftKTTTtTvinryPAGE CUTSET (lOjflCOOOaaOO) CIASKSEEJ()0000)00500)this.width=500;圖18-5 Linux系統(tǒng)虛擬內(nèi)存空間一般布局示意圖說(shuō)明:1) 線
6、性地址空間:是指 Linux系統(tǒng)中從0x00000000 到OxFFFFFFFF整個(gè)4GB虛擬存儲(chǔ)空間。2) 內(nèi)核空間:內(nèi)核空間表示運(yùn)行在處理器最高級(jí)別的超級(jí)用戶模式(supervisor mode )下的代碼或數(shù)據(jù),內(nèi)核空間占用從0xC0000000到0xFFFFFFFF的1GB線性地址空間,內(nèi)核線性地址空間由所有進(jìn)程共享,但只有運(yùn)行在內(nèi)核態(tài)的進(jìn)程才能訪問(wèn),用戶進(jìn)程可以通過(guò)系統(tǒng)調(diào)用切換到內(nèi)核態(tài)訪問(wèn)內(nèi)核空間,進(jìn)程運(yùn)行在內(nèi)核態(tài)時(shí)所產(chǎn)生的地址都屬于內(nèi)核空間。3) 用戶空間:用戶空間占用從 0x00000000到0xBFFFFFFF共3GB的線性地址空間,每個(gè)進(jìn)程都有一個(gè) 獨(dú)立的3GB用戶空間,所以
7、用戶空間由每個(gè)進(jìn)程獨(dú)有,但是內(nèi)核線程沒有用戶空間,因?yàn)樗划a(chǎn)生用戶空 間地址。另外子進(jìn)程共享(繼承)父進(jìn)程的用戶空間只是使用與父進(jìn)程相同的用戶線性地址到物理內(nèi)存地 址的映射關(guān)系,而不是共享父進(jìn)程用戶空間。運(yùn)行在用戶態(tài)和內(nèi)核態(tài)的進(jìn)程都可以訪問(wèn)用戶空間。4) 內(nèi)核邏輯地址空間:是指從 PAGE_OFFSET到high_memory 之間的線性地址空間,是系統(tǒng)物理內(nèi)存映射區(qū),它映射了全部或部分(如果系統(tǒng)包含高端內(nèi)存)物理內(nèi)存。內(nèi)核邏輯地址空間與圖18-4中的系統(tǒng)RAM內(nèi)存物理地址空間是對(duì)應(yīng)的(包括內(nèi)存孔洞也是對(duì)應(yīng)的),內(nèi)核邏輯地址空間中的地址與RAM內(nèi)存物理地址空間中對(duì)應(yīng)的地址只差一個(gè)固定偏移量,如
8、果RAM內(nèi)存物理地址空間從 0x00000000地址編址,那么這個(gè)偏移量就是PAGE_OFFSET。5) 低端內(nèi)存:內(nèi)核邏輯地址空間所映射物理內(nèi)存就是低端內(nèi)存,低端內(nèi)存在Linux線性地址空間中始終有 永久的一一對(duì)應(yīng)的內(nèi)核邏輯地址,系統(tǒng)初始化過(guò)程中將低端內(nèi)存永久映射到了內(nèi)核邏輯地址空間,為低端內(nèi)存建立了虛擬映射頁(yè)表。低端內(nèi)存內(nèi)物理內(nèi)存的物理地址與線性地址之間的轉(zhuǎn)換可以通過(guò)_pa(x)和_va(x)兩個(gè)宏來(lái)進(jìn)行,_pa(x)將內(nèi)核邏輯地址空間的地址x轉(zhuǎn)換成對(duì)應(yīng)的物理地址,相當(dāng)于_virt_to_phys(unsigned long)(x),_va(x)則相反,把低端物理內(nèi)存空間的地址轉(zhuǎn)換成對(duì)應(yīng)的
9、內(nèi)核邏輯地址,相當(dāng)于(void *)_phys_to_virt(unsigned long)(x)。6) 高端內(nèi)存:低端內(nèi)存地址之上的物理內(nèi)存是高端內(nèi)存,高端內(nèi)存在Linux線性地址空間中沒有沒有固定的一一對(duì)應(yīng)的內(nèi)核邏輯地址,系統(tǒng)初始化過(guò)程中不會(huì)為這些內(nèi)存建立映射頁(yè)表將其固定映射到Linux線性地址空間,而是需要使用高端內(nèi)存的時(shí)候才為分配的高端物理內(nèi)存建立映射頁(yè)表,使其能夠被內(nèi)核使用,否則不能被使用。高端內(nèi)存的物理地址于現(xiàn)行地址之間的轉(zhuǎn)換不能使用上面的_pa(x)和_va(x)宏。7) 高端內(nèi)存概念的由來(lái):如上所述,Linux將4GB的線性地址空間劃分成兩部分,從0x00000000至U0xB
10、FFFFFFF共3GB空間作為用戶空間由用戶進(jìn)程獨(dú)占,這部分線性地址空間并沒有固定映射到物理內(nèi)存空間上;從0xC0000000到0xFFFFFFFF的第4GB線性地址空間作為內(nèi)核空間,在嵌入式系統(tǒng)中,這 部分線性地址空間除了映射物理內(nèi)存空間之外還要映射處理器內(nèi)部外設(shè)寄存器空間等I/O空間。0xC0000000high_memory之間的內(nèi)核邏輯地址空間專用來(lái)固定映射系統(tǒng)中的物理內(nèi)存,也就是說(shuō)0xC0000000high_memory之間空間大小與系統(tǒng)的物理內(nèi)存空間大小是相同的(當(dāng)然在配置了CONFIG_DISCONTIGMEMD選項(xiàng)的非連續(xù)內(nèi)存系統(tǒng)中,內(nèi)核邏輯地址空間和物理內(nèi)存空間一樣可能存在
11、內(nèi)存孔洞),如果系統(tǒng)中的物理內(nèi)存容量遠(yuǎn)小于1GB,那么內(nèi)核現(xiàn)行地址空間中內(nèi)核邏輯地址空間之上的high_memory0xFFFFFFFF 之間還有足夠的空間來(lái)固定映射一些I/O空間。可是,如果系統(tǒng)中的物理內(nèi)存容量(包括內(nèi)存孔洞)大于1GB,那么就沒有足夠的內(nèi)核線性地址空間來(lái)固定映射系統(tǒng)全部物理內(nèi)存以及一些I/O空間了,為了解決這個(gè)問(wèn)題,在X86處理器平臺(tái)設(shè)置了一個(gè)經(jīng)驗(yàn)值:896MB,就是說(shuō),如果系 統(tǒng)中的物理內(nèi)存(包括內(nèi)存孔洞)大于 896MB,那么將前896MB物理內(nèi)存固定映射到內(nèi)核邏輯地址空間 OxCOOOOOOO0xC0000000+896MB ( =high_memory )上,而89
12、6MB之后的物理內(nèi)存則不建立到內(nèi)核線 性地址空間的固定映射,這部分內(nèi)存就叫高端物理內(nèi)存。此時(shí)內(nèi)核線性地址空間high_memoryOxFFFFFFFF 之間的128MB空間就稱為高端內(nèi)存線性地址空間,用來(lái)映射高端物理內(nèi)存和I/O空間。896MB是x86處理器平臺(tái)的經(jīng)驗(yàn)值,留了128MB線性地址空間來(lái)映射高端內(nèi)存以及I/O地址空間,我們?cè)谇度胧较到y(tǒng)中可以根據(jù)具體情況修改這個(gè)閾值,比如,MIPS中將這個(gè)值設(shè)置為 0X20000000B(512MB ),那么只有當(dāng)系統(tǒng)中的物理內(nèi)存空間容量大于0X20000000B 時(shí),內(nèi)核才需要配置CONFIG_HIGHMEM 選項(xiàng),使能內(nèi)核對(duì)高端內(nèi)存的分配和映射功
13、能。什么情況需要?jiǎng)澐殖龈叨宋锢韮?nèi)存以 及高端物理內(nèi)存閾值的設(shè)置原則見上面的內(nèi)存頁(yè)區(qū)(zone )概念說(shuō)明。8 )高端線性地址空間:從 high_memory到OxFFFFFFFF之間的線性地址空間屬于高端線性地址空間,其 中VMALLOC_STARTVMALLOC_END之間線性地址被vmalloc()函數(shù)用來(lái)分配物理上不連續(xù)但線性地址空間連續(xù)的高端物理內(nèi)存,或者被vmap()函數(shù)用來(lái)映射高端或低端物理內(nèi)存,或者由ioremap()函數(shù)來(lái)重新映射I/O物理空間。PKMAP_BASE 開始的LAST_PKMAP (一般等于1024 )頁(yè)線性地址空間被 kmap() 函數(shù)用來(lái)永久映射高端物理內(nèi)存。
14、FIXADDR_START開始的KM_TYPE_NR*NR_CPUS頁(yè)線性地址空間被kmap_atomic()函數(shù)用來(lái)臨時(shí)映射高端物理內(nèi)存,其他未用高端線性地址空間可以用來(lái)在系統(tǒng)初始化期 間永久映射I/O地址空間。Linux 2.6.10內(nèi)核中的ARM處理器平臺(tái)部分沒有對(duì)高端內(nèi)存的支持,圖18-6和圖18-7分別列出了 SA1100和IXP4XX處理器平臺(tái)的Linux線性地址空間布局。在嵌入式系統(tǒng)中如何訪問(wèn)I/O資源呢?幾乎每一種外設(shè)都是通過(guò)讀寫設(shè)備上的寄存器來(lái)進(jìn)行的,通常包括控制寄存器、狀態(tài)寄存器和數(shù)據(jù)寄存器 三大類,外設(shè)的寄存器通常被連續(xù)地編址。根據(jù)CPU體系結(jié)構(gòu)的不同,CPU對(duì)IO端口的
15、編址方式有兩種:(1)I/O 映射方式(I/O-mapped )典型地,如X86處理器為外設(shè)專門實(shí)現(xiàn)了一個(gè)單獨(dú)的地址空間,稱為I/O地址空間或者I/O 端口空間,CPU通過(guò)專門的I/O指令(如X86的IN和OUT指令)來(lái)訪問(wèn)這一空間中的地址單元。(2)內(nèi)存映射方式(Memory-mappedRISC指令系統(tǒng)的CPU(如 ARM PowerPC等)通常只實(shí)現(xiàn)一個(gè)物理地址空間,外設(shè)I/O端口成為內(nèi)存的一部分。此時(shí),CPU可以象訪問(wèn)一個(gè)內(nèi)存單元那樣訪問(wèn)外設(shè)I/O端口,而不需要設(shè)立專門的外設(shè)I/O指令。但是,這兩者在硬件實(shí)現(xiàn)上的差異對(duì)于軟件來(lái)說(shuō)是完全透明的,驅(qū)動(dòng)程序開發(fā)人員可以將內(nèi)存映射方式的I/O端
16、口和外設(shè)內(nèi)存統(tǒng)一看作是 I/O內(nèi)存資源。一般來(lái)說(shuō),在系統(tǒng)運(yùn)行時(shí),外設(shè)的 I/O內(nèi)存資源的物理地址是已知的,由硬件的設(shè)計(jì)決定。但是CPU通常并沒有為這些已知的外設(shè)I/O內(nèi)存資源的物理地址預(yù)定義虛擬地址范圍,驅(qū)動(dòng)程序并不能直接通過(guò)物理地址訪問(wèn)I/O內(nèi)存資源,而必須將它們映射到核心虛地址空間內(nèi)(通過(guò)頁(yè)表),然后才能根據(jù)映射所得 到的核心虛地址范圍,通過(guò)訪內(nèi)指令訪問(wèn)這些I/O內(nèi)存資源。Linux在io.h頭文件中聲明了函數(shù)ioremap(),用來(lái)將I/O內(nèi)存資源的物理地址映射到核心虛地址空間(3GB- 4GB中,原型如下: void * ioremap(unsigned long phys_addr,
17、 unsigned long size, unsigned long flags);iounmap函數(shù)用于取消ioremap ()所做的映射,原型如下:void iounmap(void * addr);這兩個(gè)函數(shù)都是實(shí)現(xiàn)在mm/ioremap.c文件中。在將I/O內(nèi)存資源的物理地址映射成核心虛地址后 ,理論上講我們就可以象讀寫 RAM那樣直接讀寫I/O 內(nèi)存資源了。為了保證驅(qū)動(dòng)程序的跨平臺(tái)的可移植性,我們應(yīng)該使用Linux中特定的函數(shù)來(lái)訪問(wèn)I/O內(nèi)存資源,而不應(yīng)該通過(guò)指向核心虛地址的指針來(lái)訪問(wèn)。如在x86平臺(tái)上,讀寫I/O的函數(shù)如下所示:#define readb(addr) (*(vola
18、tile unsigned char *) _io_virt(addr)#define readw(addr) (*(volatile unsigned short *) _io_virt(addr)#define readl(addr) (*(volatile unsigned int *) _io_virt(addr)#define writeb(b,addr) (*(volatile unsigned char *) _io_virt(addr) = (b)#define writew(b,addr) (*(volatile unsigned short *) _io_virt(addr) = (b)#define writel(b,addr) (*(volatile unsigne
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版建筑工程泥工施工勞務(wù)合同
- 二手商品房買賣合同范本2024年版(買賣雙方權(quán)益保障)
- 二零二五版廣東教育機(jī)構(gòu)勞務(wù)派遣服務(wù)協(xié)議3篇
- 二零二五年建筑公司項(xiàng)目管理團(tuán)隊(duì)勞動(dòng)合同3篇
- 2025年房產(chǎn)社交媒體營(yíng)銷合同3篇
- 二零二五年文化旅游產(chǎn)業(yè)PPP項(xiàng)目特許經(jīng)營(yíng)合同3篇
- 二零二五年度高效復(fù)合肥生產(chǎn)與銷售合作框架協(xié)議3篇
- 個(gè)性化2024版民間資金借貸擔(dān)保協(xié)議版B版
- 二零二五版光纖熔接項(xiàng)目融資服務(wù)合同范本3篇
- 2025年人工智能技術(shù)研發(fā)與應(yīng)用銷售合同書3篇
- 福建省廈門市2023-2024學(xué)年高二上學(xué)期期末考試語(yǔ)文試題(解析版)
- 三年級(jí)語(yǔ)文下冊(cè)教案-14 蜜蜂3-部編版
- 蘇教版小學(xué)數(shù)學(xué)四年級(jí)下冊(cè)全冊(cè)教案
- DB51T2939-2022 彩燈(自貢)制作工藝通用規(guī)范
- 押金收據(jù)條(通用版)
- 藥理治療中樞神經(jīng)系統(tǒng)退行性疾病藥.pptx
- 強(qiáng)三基反三違除隱患促安全百日專項(xiàng)行動(dòng)實(shí)施方案
- 新人教版七年級(jí)數(shù)學(xué)上冊(cè)全冊(cè)專項(xiàng)訓(xùn)練大全
- 標(biāo)準(zhǔn)預(yù)防--ppt課件
- 壓力管道氬電聯(lián)焊作業(yè)指導(dǎo)書
- 審計(jì)資料封面(共6頁(yè))
評(píng)論
0/150
提交評(píng)論