Linux内核--内核地址空间分布和进程地址空间
內(nèi)核地址空間分布
直接映射區(qū):線性空間中從3G開始最大896M的區(qū)間,為直接內(nèi)存映射區(qū),該區(qū)域的線性地址和物理地址存在線性轉(zhuǎn)換關(guān)系:線性地址=3G+物理地址。
動(dòng)態(tài)內(nèi)存映射區(qū):該區(qū)域由內(nèi)核函數(shù)vmalloc來分配,特點(diǎn)是:線性空間連續(xù),但是對(duì)應(yīng)的物理空間不一定連續(xù)。vmalloc分配的線性地址所對(duì)應(yīng)的物理頁可能處于低端內(nèi)存,也可能處于高端內(nèi)存。
永久內(nèi)存映射區(qū):該區(qū)域可訪問高端內(nèi)存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內(nèi)存頁或者使用kmap函數(shù)將分配到的高端內(nèi)存映射到該區(qū)域。
固定映射區(qū):該區(qū)域和4G的頂端只有4k的隔離帶,其每個(gè)地址項(xiàng)都服務(wù)于特定的用途,如ACPI_BASE等。
進(jìn)程的地址空間
??? linux采用虛擬內(nèi)存管理技術(shù),每一個(gè)進(jìn)程都有一個(gè)3G大小的獨(dú)立的進(jìn)程地址空間,這個(gè)地址空間就是用戶空間。每個(gè)進(jìn)程的用戶空間都是完全獨(dú)立、互補(bǔ)相干的。進(jìn)程訪問內(nèi)核空間的方式:系統(tǒng)調(diào)用和中斷。?
??? 創(chuàng)建進(jìn)程等進(jìn)程相關(guān)操作都需要分配內(nèi)存給進(jìn)程。這時(shí)進(jìn)程申請(qǐng)和獲得的不是物理地址,僅僅是虛擬地址。?
實(shí) 際的物理內(nèi)存只有當(dāng)進(jìn)程真的去訪問新獲取的虛擬地址時(shí),才會(huì)由“請(qǐng)頁機(jī)制”產(chǎn)生“缺頁”異常,從而進(jìn)入分配實(shí)際葉框的程序。該異常是虛擬內(nèi)存機(jī)制賴以存在 的基本保證---它會(huì)告訴內(nèi)核去為進(jìn)程分配物理頁,并建立對(duì)應(yīng)的頁表,這之后虛擬地址才實(shí)實(shí)在在的映射到了物理地址上。
?
vmalloc和kmalloc區(qū)別?
1,kmalloc對(duì)應(yīng)于kfree,分配的內(nèi)存處于3GB~high_memory之間,這段內(nèi)核空間與物理內(nèi)存的映射一一對(duì)應(yīng),可以分配連續(xù)的物理內(nèi)存;?
vmalloc對(duì)應(yīng)于vfree,分配的內(nèi)存在VMALLOC_START~4GB之間,分配連續(xù)的虛擬內(nèi)存,但是物理上不一定連續(xù)。
2,vmalloc() 分配的物理地址無需連續(xù),而kmalloc() 確保頁在物理上是連續(xù)的?
3,kmalloc分配內(nèi)存是基于slab,因此slab的一些特性包括著色,對(duì)齊等都具備,性能較好。物理地址和邏輯地址都是連續(xù)的。?
4,最主要的區(qū)別是分配大小的問題,比如你需要28個(gè)字節(jié),那一定用KMALLOC,如果用VMALLOC,分配不多次機(jī)器就over了。?
??? 盡管僅僅在某些情況下才需要物理上連續(xù)的內(nèi)存塊,但是,很多內(nèi)核代碼都調(diào)用kmalloc(),而不是用vmalloc()獲得內(nèi)存。這主要是出于性能的 考慮。vmalloc()函數(shù)為了把物理上不連續(xù)的頁面轉(zhuǎn)換為虛擬地址空間上連續(xù)的頁,必須專門建立頁表項(xiàng)。還有,通過 vmalloc()獲得的頁必須一個(gè)一個(gè)的進(jìn)行映射(因?yàn)樗鼈兾锢砩喜皇沁B續(xù)的),這就會(huì)導(dǎo)致比直接內(nèi)存映射大得多的緩沖區(qū)刷新。因?yàn)檫@些原 因,vmalloc()僅在絕對(duì)必要時(shí)才會(huì)使用——典型的就是為了獲得大塊內(nèi)存時(shí),例如,當(dāng)模塊被動(dòng)態(tài)插入到內(nèi)核中時(shí),就把模塊裝載到由 vmalloc()分配的內(nèi)存上。
總結(jié)
以上是生活随笔為你收集整理的Linux内核--内核地址空间分布和进程地址空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Linux 2.6设备管理机制)kob
- 下一篇: 浅谈linux字符设备注册