免费注册 查看新帖 |

Chinaunix

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

[内存管理] 内存管理的疑惑? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-26 07:31 |只看该作者 |倒序浏览
本帖最后由 鬼鬼一哈 于 2014-09-26 07:41 编辑

环境:32bit  +  2GB RAM
疑问如下:
1.系统启动时,bios,kernel的code,data,bss都会消耗部分内存,此时是否建立页表?(貌似此处建立页表好像用处不大)
  如果此时不建立页表,那是不是这个内存将会对内存管理透明,实际可以建立page的内存应该要减去上面使用的物理内存?
  初始化内存单元好像也是boot memory allocator之后的吧?

2.对于内核而言,页表都是从3G空间开始映射,假设系统没有任何用户进程,则2G内存的前896M空间会映射到3G~3G+896M,之后的(2G-896M)只有映射在高端地址空间的128M中使用了?

3.内核毕竟是给应用服务的,页表也是按需进行映射的,如果用户态需要内存,在将其映射到该进程的地址空间即可,别的进程将无法使用该物理page,所以用户态应用进程间才实现了隔离?

4.对于高端内存的疑惑,高端内存对于内核比较珍贵(能最大限度保证不失败),但为什么说用户态分内存优先使用高端内存的地址空间呢(那岂不是这些空间内容对所有应用可见了)?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-09-26 08:42 |只看该作者
1、取决于是否进入了保护模式,进入保护模式后,就需要使用页表。
2、是的,但不可能没有用户进程,比如init
3、没看太明白。
4、应该是低端内存比较珍贵,这个好像说反了。。

论坛徽章:
0
3 [报告]
发表于 2014-09-27 07:22 |只看该作者
本帖最后由 鬼鬼一哈 于 2014-09-27 07:22 编辑

回复 2# humjb_1983

1、取决于是否进入了保护模式,进入保护模式后,就需要使用页表。
【疑问】进入保护模式前,cpu只能访问前1M内存,从start_kernel中看到,此时boot memory allcotor之后,才有paging_inti的初始化动作,是否认为paging_init后才能用页表?
2、是的,但不可能没有用户进程,比如init
3、没看太明白。
【疑问】我的意思是:用户态使用内存,页表应该是映射到normal区,该虚拟地址只是属于该进程的地址空间,用户态的内存最后向内核获取时,是通过vmalloc接口的么?
4、应该是低端内存比较珍贵,这个好像说反了。
【疑问】如果说低端内存比较珍贵,内核大部分内存映射都是用的低端地址空间,为什么内核都不用高端内存呢?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-09-29 08:46 |只看该作者
鬼鬼一哈 发表于 2014-09-27 07:22
回复 2# humjb_1983
3、没看太明白。
【疑问】我的意思是:用户态使用内存,页表应该是映射到normal区,该虚拟地址只是属于该进程的地址空间,用户态的内存最后向内核获取时,是通过vmalloc接口的么?
4、应该是低端内存比较珍贵,这个好像说反了。
【疑问】如果说低端内存比较珍贵,内核大部分内存映射都是用的低端地址空间,为什么内核都不用高端内存呢?

3、当然不是通过vmalloc,vmalloc是内核分配非连续内存和高端内存的主要方式,用户态进程当然不能使用。
对于用户态使用的内存,在内核中的实现通常为:malloc分配虚拟内存-->缺页异常分配物理内存(alloc_page之类的接口),然后修改页表建立映射。
4、内核使用低端内存的目的是为了提高效率,因为低端内存是线性映射,而且是提前映射好的,分配内存时无需通过缺页、映射的方式,效率更高。这也是低端内存存在的初衷。

论坛徽章:
0
5 [报告]
发表于 2014-10-15 10:36 |只看该作者
请问一个问题:
应用进程调用malloc时分配虚拟内存,当发生缺页异常时才调用alloc_pages()。
这里alloc_pages()是调用__alloc_pages()的,__alloc_pages()扫描zonelist中的每个内存管理区来分配物理页框。
这其中我有一个疑问:物理内存的前896MB被映射给了内核,但是这里的__alloc_pages()扫描所有的内存管理区,那岂不是用户进程也可以分配的物理内存的前896MB的页框了吗?
回复 4# humjb_1983


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-10-15 10:43 |只看该作者
B_C_1024 发表于 2014-10-15 10:36
请问一个问题:
应用进程调用malloc时分配虚拟内存,当发生缺页异常时才调用alloc_pages()。
这里alloc_p ...

是的,用户态进程也可以分配到低端内存。但是内存分配时,都有策略(由内存分配标记决定),每种策略有相应的内存区fall back顺序,对于用户态进程,默认是优先从高端内存分配,当高端内存不足时,才可能从低端内存分配。

论坛徽章:
0
7 [报告]
发表于 2014-10-16 09:31 |只看该作者
还有一个问题问一下:
基于slab分配器的内存分配函数是不是只能得到低端内存的页框?那么slab里面的内存页框永远只能是低端内存的页框,得不到高端内存了?
humjb_1983 发表于 2014-10-15 10:43
是的,用户态进程也可以分配到低端内存。但是内存分配时,都有策略(由内存分配标记决定),每种策略有相应 ...

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2014-10-16 13:47 |只看该作者
B_C_1024 发表于 2014-10-16 09:31
还有一个问题问一下:
基于slab分配器的内存分配函数是不是只能得到低端内存的页框?那么slab里面的内存页 ...

内核中大部分情况下,slab分配都是用GFP_KERNEL或GFP_ATOMIC标记,所以,只能从低端内存中分配。

论坛徽章:
0
9 [报告]
发表于 2014-10-16 16:00 |只看该作者
哦,多谢!回复 8# humjb_1983


   

论坛徽章:
0
10 [报告]
发表于 2014-12-09 14:31 |只看该作者
回复 5# B_C_1024


malloc发生缺页中断的过程
static int __kprobes do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
   fault = __do_page_fault(mm, addr, fsr, flags, tsk);
   return handle_mm_fault(mm, vma, addr & PAGE_MASK, flags);
      return handle_pte_fault(mm, vma, address, pte, pmd, flags);
         return do_anonymous_page(mm, vma, address,pte, pmd, flags);
            page = alloc_zeroed_user_highpage_movable(vma, address);
               struct page *page = alloc_page_vma(GFP_HIGHUSER | movableflags,vma, vaddr);
                  alloc_pages(gfp_mask, order)


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP