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

humjb_1983 发表于 2014-09-26 08:42

1、取决于是否进入了保护模式,进入保护模式后,就需要使用页表。
2、是的,但不可能没有用户进程,比如init
3、没看太明白。
4、应该是低端内存比较珍贵,这个好像说反了。。

鬼鬼一哈 发表于 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、应该是低端内存比较珍贵,这个好像说反了。
【疑问】如果说低端内存比较珍贵,内核大部分内存映射都是用的低端地址空间,为什么内核都不用高端内存呢?

humjb_1983 发表于 2014-09-29 08:46

鬼鬼一哈 发表于 2014-09-27 07:22 static/image/common/back.gif
回复 2# humjb_1983
3、没看太明白。
【疑问】我的意思是:用户态使用内存,页表应该是映射到normal区,该虚拟地址只是属于该进程的地址空间,用户态的内存最后向内核获取时,是通过vmalloc接口的么?
4、应该是低端内存比较珍贵,这个好像说反了。
【疑问】如果说低端内存比较珍贵,内核大部分内存映射都是用的低端地址空间,为什么内核都不用高端内存呢?

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

B_C_1024 发表于 2014-10-15 10:36

请问一个问题:
应用进程调用malloc时分配虚拟内存,当发生缺页异常时才调用alloc_pages()。
这里alloc_pages()是调用__alloc_pages()的,__alloc_pages()扫描zonelist中的每个内存管理区来分配物理页框。
这其中我有一个疑问:物理内存的前896MB被映射给了内核,但是这里的__alloc_pages()扫描所有的内存管理区,那岂不是用户进程也可以分配的物理内存的前896MB的页框了吗?
回复 4# humjb_1983


   

humjb_1983 发表于 2014-10-15 10:43

B_C_1024 发表于 2014-10-15 10:36 static/image/common/back.gif
请问一个问题:
应用进程调用malloc时分配虚拟内存,当发生缺页异常时才调用alloc_pages()。
这里alloc_p ...
是的,用户态进程也可以分配到低端内存。但是内存分配时,都有策略(由内存分配标记决定),每种策略有相应的内存区fall back顺序,对于用户态进程,默认是优先从高端内存分配,当高端内存不足时,才可能从低端内存分配。

B_C_1024 发表于 2014-10-16 09:31

还有一个问题问一下:
基于slab分配器的内存分配函数是不是只能得到低端内存的页框?那么slab里面的内存页框永远只能是低端内存的页框,得不到高端内存了?humjb_1983 发表于 2014-10-15 10:43 static/image/common/back.gif
是的,用户态进程也可以分配到低端内存。但是内存分配时,都有策略(由内存分配标记决定),每种策略有相应 ...

humjb_1983 发表于 2014-10-16 13:47

B_C_1024 发表于 2014-10-16 09:31 static/image/common/back.gif
还有一个问题问一下:
基于slab分配器的内存分配函数是不是只能得到低端内存的页框?那么slab里面的内存页 ...
内核中大部分情况下,slab分配都是用GFP_KERNEL或GFP_ATOMIC标记,所以,只能从低端内存中分配。

B_C_1024 发表于 2014-10-16 16:00

哦,多谢!回复 8# humjb_1983


   

Yiran_Linux 发表于 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)


   
页: [1] 2
查看完整版本: 内存管理的疑惑?