- 论坛徽章:
- 6
|
本帖最后由 瀚海书香 于 2013-04-11 09:26 编辑
回复 1# binbian9
High memory
1. 假設我有1G的記憶體,然後將virtual address 4G 分給 user/kernel 分別為 3G/1G,
這時候我會有896MB 的normal Zone跟128的High zone? 為什麼?
这是约定。所谓normal zone就是直接线性地址直接映射到物理地址的情况;对应high zone就是无法直接映射,需要通过页表等方法间接映射的地址
2. 我知道那128被vmalloc拿去用了,但為什麼vmalloc那塊區間不能放在normal zone裡面??
如果所有的1G空间都用来normal zone了,那么内核想访问1G以上的物理空间的时候,怎么办?所有留着这个128M用来映射访问超过1G的物理地址
3. 如果給 user/kernel 分別為 2.75G/1.25G,這時候normal zone就變成1G了,那vmalloc要怎麼運作??
至于留多少用作vmalloc,和映射高端内存,原则上都是可以设置的。在这种情况下,vmalloc操作跟之前没有任何区别,只不过分配的物理地址区间发生变化。
4. 如果vmalloc的空間是屬於high memory,那存取時要怎麼運作??
内核对vmalloc的页面通过页表进行映射相应的物理地址
Vmalloc 分配的address限於vmalloc_start到vmalloc_end
1. 這段空間放的是page table然後每個entry都對映到他所mapping的address ??
2. 還是一個個的page分別對應到相對應的page?
3. 如果是map到high memory,vmalloc存的是page frame number、physical address還是 virtual address??
4. 假設我要100MB的記憶體,透過vmalloc要到了,我會在vmalloc address space裡面佔100MB嗎?
通过vmalloc申请地址的时候,会返回一个连续的线性地址。同时为该区间内的每个地址调用kmalloc申请物理页面,这些物理页面可能是normal zone,也可能是high zone。为了描述high zone页面的情况,使用page结构指向相应的页面,而不是通过线性地址指向分配的页面。
如果通过vmalloc申请100M的空间,那么vmalloc address space的线性空间就会减少100M。
alloc_pages
1. 是基於buddy system申請來的memory?
a. 是的話,表示buddy system也管high memory?
i. 是的話,那buddy system管理的資料放在哪? Page Map 那區? 資料結構為何??
2. 透過alloc_pages拿到的page,一定要使用kmap 轉換?
a. 原因是??
b. 如果拿到的是在high memory,他要如何轉換?
alloc_pages使用的buddy system申请page页面。buddy system管理所有的物理内存。buddy system通过链表和bitmap管理所有的页面信息。
通过alloc_pages拿到的page,返回的是页描述符的地址。这些页面可能在normal也可能在high中。你可以做kmap也可以不做kmap。但是如果想通过线性地址访问页面的话,必须通过kmap转换出相应的线性地址。 如果是high的话,需要从kmap区拿出一个线性地址空间来映射高端内存页面。
Kmap
1. 存放kmap mapping 用的空間是在 kmap Address Space,大小為4M,也就是1024個page,
那表示如果我要使用high memory時,一定要把要用的page放在kmap address space裡面?
2. 這1024個page是用來map到high memory裡的某1024個page?
3. Alloc_pages拿到的page address是在high memory還是在 kmap address space ??
4. pkmap_page_table放在哪?? Struct page MAP??
如果通过alloc_pages(,GFP_HIGHMEM)和kmap的方式的话,那么page最后映射的地址必须在kmap address space里面。kmap区的page空间就是为了映射通过alloc_pages申请的高端页面的;alloc_pages申请高端内存得打的page address是在high memory中的物理页面;
话说,现在都是x64的平台了,就不要再纠结这些ugly的东西了。 |
|