Linux的Virtual Memory Areas(VMA)
看了 Linux的Virtual Memory Areas(VMA)的介绍后,仍然存在一个疑问。用户的进程空间的内存到实际的物理内存的分配是通过什么机制实现的,具体是有哪些系统调用完成的,会用到slab层吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
最底层是Buddy System,Slab是建立在Buddy System之上的。进程的虚拟地址也是一种资源,VMA就是用来描述这种资源的。至于虚拟地址下面有没有物理内存就看情况了。有时分配了虚拟地址就向Buddy System要内存并且在页表将两者联系上,有时则只分区虚拟地址段,等到访问这段空间时再分配内存。可以认为分配虚拟地址段和分配物理内存是独立的。
你的意思是如果需要分配物理地址的情况下,会使用Buddy System来完成。是吗?
回复 2# tempname2
回复 3# gulang2004xy
情况很多,不敢说绝对,一般要page frame就是向Buddy System索取。
用户空间申请内存的主要通过几个系统调用, execute,fork,brk,等系统调用可能会引起内核创建vma,然后申请内存页,并把对应关系放到页目录,页表中去。
不会用到slab
其实,很多时候我们都是太多关注内核空间与用户空间的概念定义了。本质上他们都是地址空间,甚至在从内核太看来他们是“一样的”。不然大名鼎鼎的copy_from_user实现怎么会就是简简单单的循环拷贝+fix area。只不过用户态是被多个进程复用的,所以页表处理和地址空间分配上有所不同。具体说就是用户态页表每个进程有一个,并且分配地址空间是以VMA大块大块的分配。
不知道偶的理解是否有偏差?CU 内存大牛们
赞一个
回复 7# 懂医术的厨师
不想懂医术的厨师,不是好程序员。呵呵。好像用户空间的页表在映射内核的部分都是一样的。
本帖最后由 omycle 于 2011-08-29 20:19 编辑
回复 1# gulang2004xy
看了 Linux的Virtual Memory Areas(VMA)的介绍后,仍然存在一个疑问。用户的进程空间的内存到实际的物理内存的分配是通过什么机制实现的,具体是有哪些系统调用完成的,会用到slab层吗?
有啊,比如brk.
分配大数据是通过伙伴算法云云
分配小数据结构对象,是通过slab. 当然slab是以伙伴算法为基础的。