内存管理的疑惑?
本帖最后由 鬼鬼一哈 于 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.对于高端内存的疑惑,高端内存对于内核比较珍贵(能最大限度保证不失败),但为什么说用户态分内存优先使用高端内存的地址空间呢(那岂不是这些空间内容对所有应用可见了)?
1、取决于是否进入了保护模式,进入保护模式后,就需要使用页表。
2、是的,但不可能没有用户进程,比如init
3、没看太明白。
4、应该是低端内存比较珍贵,这个好像说反了。。 本帖最后由 鬼鬼一哈 于 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、应该是低端内存比较珍贵,这个好像说反了。
【疑问】如果说低端内存比较珍贵,内核大部分内存映射都是用的低端地址空间,为什么内核都不用高端内存呢? 鬼鬼一哈 发表于 2014-09-27 07:22 static/image/common/back.gif
回复 2# humjb_1983
3、没看太明白。
【疑问】我的意思是:用户态使用内存,页表应该是映射到normal区,该虚拟地址只是属于该进程的地址空间,用户态的内存最后向内核获取时,是通过vmalloc接口的么?
4、应该是低端内存比较珍贵,这个好像说反了。
【疑问】如果说低端内存比较珍贵,内核大部分内存映射都是用的低端地址空间,为什么内核都不用高端内存呢?
3、当然不是通过vmalloc,vmalloc是内核分配非连续内存和高端内存的主要方式,用户态进程当然不能使用。
对于用户态使用的内存,在内核中的实现通常为:malloc分配虚拟内存-->缺页异常分配物理内存(alloc_page之类的接口),然后修改页表建立映射。
4、内核使用低端内存的目的是为了提高效率,因为低端内存是线性映射,而且是提前映射好的,分配内存时无需通过缺页、映射的方式,效率更高。这也是低端内存存在的初衷。
请问一个问题:
应用进程调用malloc时分配虚拟内存,当发生缺页异常时才调用alloc_pages()。
这里alloc_pages()是调用__alloc_pages()的,__alloc_pages()扫描zonelist中的每个内存管理区来分配物理页框。
这其中我有一个疑问:物理内存的前896MB被映射给了内核,但是这里的__alloc_pages()扫描所有的内存管理区,那岂不是用户进程也可以分配的物理内存的前896MB的页框了吗?
回复 4# humjb_1983
B_C_1024 发表于 2014-10-15 10:36 static/image/common/back.gif
请问一个问题:
应用进程调用malloc时分配虚拟内存,当发生缺页异常时才调用alloc_pages()。
这里alloc_p ...
是的,用户态进程也可以分配到低端内存。但是内存分配时,都有策略(由内存分配标记决定),每种策略有相应的内存区fall back顺序,对于用户态进程,默认是优先从高端内存分配,当高端内存不足时,才可能从低端内存分配。 还有一个问题问一下:
基于slab分配器的内存分配函数是不是只能得到低端内存的页框?那么slab里面的内存页框永远只能是低端内存的页框,得不到高端内存了?humjb_1983 发表于 2014-10-15 10:43 static/image/common/back.gif
是的,用户态进程也可以分配到低端内存。但是内存分配时,都有策略(由内存分配标记决定),每种策略有相应 ... B_C_1024 发表于 2014-10-16 09:31 static/image/common/back.gif
还有一个问题问一下:
基于slab分配器的内存分配函数是不是只能得到低端内存的页框?那么slab里面的内存页 ...
内核中大部分情况下,slab分配都是用GFP_KERNEL或GFP_ATOMIC标记,所以,只能从低端内存中分配。 哦,多谢!回复 8# humjb_1983
回复 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