- 論壇徽章:
- 0
|
VMALLOC_RESERVE和896M
LINUX 內(nèi)核虛擬地址空間到物理地址空間一般是固定連續(xù)影射的。
假定機(jī)器內(nèi)存為512M,
從3G開始,到3G + 512M 為連續(xù)固定影射區(qū)。zone_dma, zone_normal為這個(gè)區(qū)域的。固定影射的VADDR可以直接使用(get a free page, then use pfn_to_virt()等宏定義轉(zhuǎn)換得到vaddr)或用kmalloc等分配. 這樣的vaddr的物理頁是連續(xù)的。得到的地址也一定在固定影射區(qū)域內(nèi)。
如果內(nèi)存緊張,連續(xù)區(qū)域無法滿足,調(diào)用vmalloc分配是必須的,因?yàn)樗梢詫⑽锢聿贿B續(xù)的空間組合后分配,所以更能滿足分配要求。
但vmalloc分配的vaddr一定不能與固定影射區(qū)域的vaddr重合。因?yàn)関addr到物理頁的影射同時(shí)只能唯一。所以vmalloc得到的vaddr要在3G + 512m 以上才可以。也就是從VMALLOC_START開始分配。 VMALLOC_START比連續(xù)固定影射區(qū)大最大vaddr地址還多8-16M(2*VMALLOC_OFFSET)--有個(gè)鬼公式在
#define VMALLOC_OFFSET 8*1024
#define VMALLOC_START (high_memory - 2*VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)
high_memory 就是固定影射區(qū)域最高處。
空開8-16M做什么? 為了捕獲越界的mm_fault.
同樣,vmalloc每次得到的VADDR空間中間要留一個(gè)PAGE的空(空洞),目的和上面的空開一樣。你vmalloc(100)2次,得到的2個(gè)地址中間相距8K。
如果連續(xù)分配無空洞,那么比如
p1=vmalloc(4096);
p2=vmalloc(4096);
如果p1使用越界到p2中了,也不會(huì)mm_falut. 那不容易debug.
下面說明VMALLOC_RESERVE和896M的問題。
上面假設(shè)機(jī)器物理512M的case. 如果機(jī)器有1G物理內(nèi)存如何是好?那vmalloc()的vaddr是不是要在3G + 1G + 8M 空洞以上分配?超過尋址空間了嗎。
這時(shí),4G 下面保留的VMALLOC_RESERVER 128m 就派上用場了。
也就是說如果物理內(nèi)存超過896M, high_memory也只能在3G + 896地方。可尋址空間最高處要保留VMALLOC_RESREVER 128M給vmalloc用。
所以這128M的VADDR空間是為了vmalloc在物理超過了896M時(shí)候使用。如果物理僅僅有512M, 一般使用不到。因?yàn)閂MALLOC_START很低了。如果vmalloc太多了才會(huì)用到。
high_memory在arch/i386/kernel, mm的初始化中設(shè)置。根據(jù)物理內(nèi)存大小和VMALLOC_RESERVE得到數(shù)值.
所以說那128M僅僅是為了影射1G以上的物理內(nèi)存的不對的。如果物理內(nèi)存2G,1G以下的vmalloc也用那空間影射。
看vmalloc分配的東西可以用
- show_vmalloc()
- {
- struct vm_struct **p, *tmp;
- for(p = &vmlist; (tmp = *p); p = &tmp->next) {
- printk("%p %p %d\n", tmp, tmp->addr, tmp->size
- }
- }
復(fù)制代碼
看到。
不全面的地方我還有補(bǔ)充,歡迎討論
[ 本帖最后由 albcamus 于 2006-1-17 09:17 編輯 ] |
|