免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-10 21:56 |只看该作者 |倒序浏览
在網上搜尋了很久,始終沒找到答案。無意中發現了這個強大的論壇,希望大牛們能指點迷津!!

我有很多問題的,請不要見怪

High memory
        1. 假設我有1G的記憶體,然後將virtual address 4G 分給 user/kernel  分別為 3G/1G,
        這時候我會有896MB 的normal Zone跟128的High zone? 為什麼?
        2. 我知道那128被vmalloc拿去用了,但為什麼vmalloc那塊區間不能放在normal zone裡面??
        3. 如果給 user/kernel  分別為 2.75G/1.25G,這時候normal zone就變成1G了,那vmalloc要怎麼運作??
        4. 如果vmalloc的空間是屬於high memory,那存取時要怎麼運作??

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嗎?
      
      
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,他要如何轉換?
               
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??

论坛徽章:
0
2 [报告]
发表于 2013-04-10 22:13 |只看该作者
看看                              

论坛徽章:
0
3 [报告]
发表于 2013-04-10 23:10 |只看该作者
帮顶下,希望大牛解答下,顺便学习学习。挺好奇的,楼主用繁体。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-04-11 08:55 |只看该作者
本帖最后由 chishanmingshen 于 2013-04-11 09:23 编辑

我一直觉得我的问题够多的了。看到楼主狂多的问号,我释然了。

感觉楼主没有看过ulk。。。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-04-11 09:25 |只看该作者
本帖最后由 瀚海书香 于 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的东西了。

论坛徽章:
0
6 [报告]
发表于 2013-04-11 11:23 |只看该作者
感謝 "瀚海书香" 大神的指點!!
多懂一點總是好的

我又有新的問題了

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




回復 chishanmingshen :
請問是指 understanding the linux kernel這本書嗎??
很遺憾的,我看的是 Linux kernel development 3rd...
但很多地方沒懂。。

论坛徽章:
0
7 [报告]
发表于 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
8 [报告]
发表于 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
9 [报告]
发表于 2013-04-11 14:14 |只看该作者
回复 7# xs3c


感謝 "xs3c"大神 指教!!   

不好意思,我又有新的問題,
下面這段,我想再理解的明白些


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

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


首先,假設一個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 ??

我講講我的想法,不知道對不對。
第一,透過vmalloc要memory,他會透過kmalloc不斷地要page,直到達到要求的100MB。
第二,透過kmalloc得到的page都會存在vmalloc_start 到 vmalloc 中一段符合需求的virtual address space,這些page會記錄physical address在哪
第三,vmalloc_start 到 vmalloc_end這段 與physical address 有one-one mapping的關係。
第四,上面指的"分配物理地址" 是為process要的,因此,若process要100MB的空間,實際上physical address會被用掉200MB (vmalloc 100MB + kmalloc 100MB) ???

Best Regards.
Thanks.
        

论坛徽章:
0
10 [报告]
发表于 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之间的映射。



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP