免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5882 | 回复: 3
打印 上一主题 下一主题

[内存管理] 關於high memory, alloc_pages, kmap, vmalloc的一些問題 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2013-04-11 13:13 |显示全部楼层
回复 1# binbian9
High memory
        1. 假設我有1G的記憶體,然後將virtual address 4G 分給 user/kernel  分別為 3G/1G,

        這時候我會有896MB 的normal Zone跟128的High zone? 為什麼?

有high memory 是因为在32位CPU上,kernel所能用的虚拟地址范围只有1G也就是说要都采用直接映射(paddr-->0xc000_0000+paddr)这样的话 内核最多只能用1G的物理地址。这里分出一部分high memory 然后在需要的时候在可以动态的修改页表来映射更多的内存。

        2. 我知道那128被vmalloc拿去用了,但為什麼vmalloc那塊區間不能放在normal zone裡面??

vmalloc这段保留只是虚拟地址空间范围,而normal zone和high zone都是物理地址范围。这是两个概念。

        3. 如果給 user/kernel  分別為 2.75G/1.25G,這時候normal zone就變成1G了,那vmalloc要怎麼運作??

我不确定改变划分后是否 vmalloc_start 到vmalloc_end的范围也会变。具体的要再看下代码。vmalloc分配机制不会变化

        4. 如果vmalloc的空間是屬於high memory,那存取時要怎麼運作??

vmalloc如果是从high zone里面找到page。需要先map即修改页表让内核能够找到这个high zone的page。

Vmalloc 分配的address限於vmalloc_start到vmalloc_end

        1. 這段空間放的是page table然後每個entry都對映到他所mapping的address ??
        2. 還是一個個的page分別對應到相對應的page?

page table里面的一项就对应一个page的address 范围

        3. 如果是map到high memory,vmalloc存的是page frame number、physical address還是 virtual address??

没太明白啥意思,vmalloc_start 到vmalloc_end这段就是虚拟地址。分配到物理地址。然后修改页表将对应的虚拟地址和物理地址进行映射。

        4. 假設我要100MB的記憶體,透過vmalloc要到了,我會在vmalloc address space裡面佔100MB嗎?

你会用掉这100MB的地址。

              
alloc_pages
        1. 是基於buddy system申請來的memory?
                a. 是的話,表示buddy system也管high memory?
                        i. 是的話,那buddy system管理的資料放在哪? Page Map 那區? 資料結構為何??
        2. 透過alloc_pages拿到的page,一定要使用kmap 轉換?
                a. 原因是??
不一定,如果是normal zone应该就不会 因为内核已经建立了相差0xc000_0000的映射。 从high memory里面取得需要
使用kmap。
                b. 如果拿到的是在high memory,他要如何轉換?

修改页表。

               
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??

kmap是你从high memory分配了page。 你在kernel里面需要用到这些page你需要kmap来建立映射。


   

论坛徽章:
0
2 [报告]
发表于 2013-04-11 13:16 |显示全部楼层
回复 6# binbian9

1. 是不是透過vmalloc 拿到的memory就不用kmap了?

是的

2. 如果不用vmalloc,而用alloc_pages的話,我頂多"同時"只能用到high memory的1024個page?
    其他page都閒著??

是,kernel用到话最大只能这么多了。因为虚拟地址空间不够。 high memory应该其他也会用,可能也会分给进程来使用。而不是给kernel。


   

论坛徽章:
0
3 [报告]
发表于 2013-04-11 15:26 |显示全部楼层
回复 9# binbian9

首先,假設一個process要100MB的空間,我知道若透過vmalloc要到的話,vmalloc的空間會少100MB,
問題如下:

1. 要到的vmalloc 的virtual address space = physical address space = 100MB??

对。

2. vmalloc_start 到 vmalloc_end 這段沒有與 physical address one-one mapping ??



3. 沒有的話,vmalloc還要透過kmalloc申請 100MB ??

通过alloc_page从high memory里面分配。

我講講我的想法,不知道對不對。
第一,透過vmalloc要memory,他會透過kmalloc不斷地要page,直到達到要求的100MB。

恩。应该alloc_page

第二,透過kmalloc得到的page都會存在vmalloc_start 到 vmalloc 中一段符合需求的virtual address space,這些page會記錄physical address在哪

alloc_page后应该会修改页表建立vm_area与物理地址页映射关系。

第三,vmalloc_start 到 vmalloc_end這段 與physical address 有one-one mapping的關係。
第四,上面指的"分配物理地址" 是為process要的,因此,若process要100MB的空間,實際上physical address會被用掉200MB (vmalloc 100MB + kmalloc 100MB) ???

你看下vmalloc的代码应该能了解,过程大致是你用vmalloc申请100MB的空间,kernel会去找看看vmalloc_start 到vmalloc_end是否有足够的虚拟地址空间。如果有就调用alloc_page从high memory分配物理page。然后修改页表建立虚拟地址与物理page之间的映射。



   

论坛徽章:
0
4 [报告]
发表于 2013-04-11 16:17 |显示全部楼层
回复 11# binbian9


    from "xs3c"大神

离大婶还远着呢。大家学习交流而已。

1.   Q: "2. vmalloc_start 到 vmalloc_end 這段沒有與 physical address one-one mapping ??"

      A:  " 对  "
2.   Q: "2. 我知道那128被vmalloc拿去用了,但為什麼vmalloc那塊區間不能放在normal zone裡面??"

      A: "vmalloc这段保留只是虚拟地址空间范围,而normal zone和high zone都是物理地址范围。这是两个概念。"
from "瀚海书香" 大神
Q: "2. 我知道那128被vmalloc拿去用了,但為什麼vmalloc那塊區間不能放在normal zone裡面??"
A: "如果所有的1G空间都用来normal zone了,那么内核想访问1G以上的物理空间的时候,怎么办?所有留着这个128M用来映射访问超过1G的物理地址"

首先我说的one-one mapping是指phy address -->phy address + 0xc000_0000的映射。我没看出瀚海书香的暗示说vmalloc 空间也是这么映射的。他只是说要留着这128M的空间来访问超过1G的物理地址。如果 one-one mapping 那也最大能访问128M. 怎么能访问超过1G的物理地址呢。

兩位大神的說法似乎有些矛盾?
"瀚海书香" 大神的說法似乎imply vmalloc空間與physical address是 1-1 mapping
但 "xs3c"大神則是明確的說沒有@@?
真是把我搞糊塗了 T_T

如果vmalloc_start 到 vmalloc_end這段沒有與physical address one-one mapping,
那為什麼將virtual address 4G 分給 user/kernel  分別為 3G/1G時,


在你的机器上实际是你在kernel和user程序同时在跑,需要虚拟地址把他们隔离开来,不然页表映射不乱套了。

linux 要Default 設成896MB 的normal Zone跟128的High zone??

各个架构不一样,x86是这样, ppc是768MB 的normal Zone 和256的high Zone.

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP