亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: VMALLOC_RESERVE 和 896M [打印本頁]

作者: 思一克    時間: 2006-01-16 13:57
標題: VMALLOC_RESERVE 和 896M
VMALLOC_RESERVE和896M

LINUX 內核虛擬地址空間到物理地址空間一般是固定連續(xù)影射的。

假定機器內存為512M,
從3G開始,到3G + 512M 為連續(xù)固定影射區(qū)。zone_dma, zone_normal為這個區(qū)域的。固定影射的VADDR可以直接使用(get a free page, then use pfn_to_virt()等宏定義轉換得到vaddr)或用kmalloc等分配. 這樣的vaddr的物理頁是連續(xù)的。得到的地址也一定在固定影射區(qū)域內。

如果內存緊張,連續(xù)區(qū)域無法滿足,調用vmalloc分配是必須的,因為它可以將物理不連續(xù)的空間組合后分配,所以更能滿足分配要求。

但vmalloc分配的vaddr一定不能與固定影射區(qū)域的vaddr重合。因為vaddr到物理頁的影射同時只能唯一。所以vmalloc得到的vaddr要在3G + 512m 以上才可以。也就是從VMALLOC_START開始分配。 VMALLOC_START比連續(xù)固定影射區(qū)大最大vaddr地址還多8-16M(2*VMALLOC_OFFSET)--有個鬼公式在

#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空間中間要留一個PAGE的空(空洞),目的和上面的空開一樣。你vmalloc(100)2次,得到的2個地址中間相距8K。
如果連續(xù)分配無空洞,那么比如
p1=vmalloc(4096);
p2=vmalloc(4096);
如果p1使用越界到p2中了,也不會mm_falut. 那不容易debug.

下面說明VMALLOC_RESERVE和896M的問題。

上面假設機器物理512M的case. 如果機器有1G物理內存如何是好?那vmalloc()的vaddr是不是要在3G + 1G + 8M 空洞以上分配?超過尋址空間了嗎。
這時,4G 下面保留的VMALLOC_RESERVER 128m 就派上用場了。
也就是說如果物理內存超過896M, high_memory也只能在3G + 896地方?蓪ぶ房臻g最高處要保留VMALLOC_RESREVER 128M給vmalloc用。

所以這128M的VADDR空間是為了vmalloc在物理超過了896M時候使用。如果物理僅僅有512M, 一般使用不到。因為VMALLOC_START很低了。如果vmalloc太多了才會用到。

high_memory在arch/i386/kernel, mm的初始化中設置。根據(jù)物理內存大小和VMALLOC_RESERVE得到數(shù)值.

所以說那128M僅僅是為了影射1G以上的物理內存的不對的。如果物理內存2G,1G以下的vmalloc也用那空間影射。

看vmalloc分配的東西可以用


  1. show_vmalloc()
  2. {
  3. struct vm_struct **p, *tmp;

  4.     for(p = &vmlist; (tmp = *p); p = &tmp->next) {
  5.        printk("%p %p %d\n", tmp, tmp->addr, tmp->size

  6.    }
  7. }
復制代碼


看到。

不全面的地方我還有補充,歡迎討論

[ 本帖最后由 albcamus 于 2006-1-17 09:17 編輯 ]
作者: yjh777    時間: 2006-01-16 16:52
糾正一下:
2.4.21內核 i386 平臺上的定義:
#define VMALLOC_OFFSET  (8*1024*1024)
#define VMALLOC_START   (((unsigned long) high_memory + 2*VMALLOC_OFFSET-1) & \
                                                ~(VMALLOC_OFFSET-1))
#define VMALLOC_VMADDR(x) ((unsigned long)(x))
#if CONFIG_HIGHMEM
# define VMALLOC_END    (PKMAP_BASE-2*PAGE_SIZE)
#else
# define VMALLOC_END    (FIXADDR_START-2*PAGE_SIZE)
#endif


2.6.9內核 i386 平臺上的定義:
#define VMALLOC_OFFSET        (8*1024*1024)
#define VMALLOC_START        (((unsigned long) high_memory + vmalloc_earlyreserve + \
                        2*VMALLOC_OFFSET-1) & ~(VMALLOC_OFFSET-1))
#ifdef CONFIG_HIGHMEM
# define VMALLOC_END        (PKMAP_BASE-2*PAGE_SIZE)
#else
# define VMALLOC_END        (FIXADDR_START-2*PAGE_SIZE)
#endif

可以看一下ULK 2nd(中文版) 的圖7-7。 英文版就是 Figure 7-7 了
2.6內核的對應 ULK 3rd 的Figure 8-7

[ 本帖最后由 yjh777 于 2006-1-16 17:42 編輯 ]
作者: 思一克    時間: 2006-01-16 16:55
to yjh777.

謝謝。我沒仔細打字,所以。。。
KMALLOC_RESERVER 應該是VMALLOC_RESERVE

本帖子就是針對你的帖子和幾個人的疑問寫的。對你的理解是否有幫助?
作者: 思一克    時間: 2006-01-16 17:00
to albcamus,

請幫助將題目改了,KMALLOC_RESERVE 應該為VMALLOC_RESERVE

謝謝
作者: yjh777    時間: 2006-01-16 17:02
原帖由 思一克 于 2006-1-16 16:55 發(fā)表
to yjh777.

謝謝。我沒仔細打字,所以。。。
KMALLOC_RESERVER 應該是VMALLOC_RESERVE

本帖子就是針對你的帖子和幾個人的疑問寫的。對你的理解是否有幫助?


8錯, 解釋的很透徹。 謝謝

還有一個問題:就是用戶空間程序,可不可以使用高端內存,有幾種方法。
作者: 思一克    時間: 2006-01-16 17:10
我在看。因為我機器僅僅512M,所以無法實驗



還有一個問題:就是用戶空間程序,可不可以使用高端內存,有幾種方法!
作者: albcamus    時間: 2006-01-16 17:37
我印象里用戶空間是可以使用高端內存的, 只不過不可能超過4G的空間范圍 per 進程。
至于如何為用戶進程分配高端內存則不懂, 這兩天補一下VM。
to 思兄:那個公式也有筆誤嗎? 我不確定,還是您自個兒編輯一下吧, 我怕編輯錯了
作者: snow_insky    時間: 2006-01-16 17:54
用戶空間當然可以使用了,而且是正常的使用,內核在分配那些不經常使用的內存時,都用高端內存空間(如果有),所謂不經常使用是相對來說的,比如內核的一些數(shù)據(jù)結構就屬于經常使用的,而用戶的一些數(shù)據(jù)就屬于不經常使用的。

用戶在啟動一個應用程序時,是需要內存的,而每個應用程序都有3G的線性地址,給這些地址映射頁表時就可以直接使用高端內存。

而且還要糾正一點的是:那128M內存的功能不僅僅是用在這些地方的,如果你要加載一個設備,而這個設備需要映射內存到內核中,它也需要使用這段線性地址空間來完成,否則內核就不能訪問設備上的內存空間了。
作者: albcamus    時間: 2006-01-16 18:40
>> 那128M內存的功能不僅僅是用在這些地方的,如果你要加載一個設備,而這個設備需要映射內存到內核中,它也需要使用這段線性地址空間來完成,否則內核就不能訪問設備上的內存空間了。

這個曾經在某個版本的內核代碼的__VMALLOC_RESERVE宏的注釋中見過,呵呵,可是現(xiàn)在在2.6.14找不到了
作者: snow_insky    時間: 2006-01-16 19:21
那 能告訴我現(xiàn)在的那些內存是怎么映射的嗎?它不會不需要線性地址就可以被使用了吧!
作者: 思一克    時間: 2006-01-17 08:19
to albcamus,

標題我自己不能改吧。KMALLOC_RESERVE 應該是 VMALLOC_RESERVE

我認為應用程序可以使用高端MEM。但我機器內存太小無法實驗。
作者: yjh777    時間: 2006-01-17 08:43
>> 那128M內存的功能不僅僅是用在這些地方的,如果你要加載一個設備,而這個設備需要映射內存到內核中,它也需要使用這段線性地址空間來完成,否則內核就不能訪問設備上的內存空間了。

用詞不當:
不是128M內存, 是128M線性地址!
而且,設備內存可以通過MMAP映射到用戶地址空間直接使用.
我們還是先討論高端內存吧.聽說2.4和2.6處理有所不同,.......

[ 本帖最后由 yjh777 于 2006-1-17 08:55 編輯 ]
作者: snow_insky    時間: 2006-01-17 11:01
For devices connected to the PCI bus

The I/O shared memory is mapped into 32-bit physical addresses near the 4 GB boundary. This kind of device is much simpler to handle.

這是ULK-3rd中的原話,我想現(xiàn)在這部分空間還是需要用來映射設備的I/O內存的。
作者: snow_insky    時間: 2006-01-17 11:04
原帖由 yjh777 于 2006-1-17 08:43 發(fā)表
>> 那128M內存的功能不僅僅是用在這些地方的,如果你要加載一個設備,而這個設備需要映射內存到內核中,它也需要使用這段線性地址空間來完成,否則內核就不能訪問設備上的內存空間了。

用詞不當:
不是1 ...


這是搞笑,難道這不是那128M的線性地址空間的用途嗎?
作者: yjh777    時間: 2006-01-17 11:45
原帖由 snow_insky 于 2006-1-17 11:04 發(fā)表


這是搞笑,難道這不是那128M的線性地址空間的用途嗎?


我說的是方法,你說的是用途。 不沖突的。
我沒有搞笑,是你生氣了。sorry!
作者: 思一克    時間: 2006-01-18 16:52
to albcamus,

謝謝你幫我改好了。 并且凈化了。
作者: guotie    時間: 2006-06-09 15:00
in arch/i386/mm/init.c:

#ifdef CONFIG_HIGHMEM
        high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
#else
        high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
#endif

in arch/i386/mm/discontig.c
        system_max_low_pfn = max_low_pfn = find_max_low_pfn() - reserve_pages;




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2