25 | 用户态内存映射:如何找到正确的会议室?
刘超

前面几节,我们既看了虚拟内存空间如何组织的,也看了物理页面如何管理的。现在我们需要一些数据结构,将二者关联起来。
mmap 的原理
在虚拟地址空间那一节,我们知道,每一个进程都有一个列表 vm_area_struct,指向虚拟地址空间的不同的内存块,这个变量的名字叫 mmap。
其实内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。

前面咱们讲堆的时候讲过,如果我们要申请小块内存,就用 brk。brk 函数之前已经解析过了,这里就不多说了。如果申请一大块内存,就要用 mmap。对于堆的申请来讲,mmap 是映射内存空间到物理内存。
另外,如果一个进程想映射一个文件到自己的虚拟内存空间,也要通过 mmap 系统调用。这个时候 mmap 是映射内存空间到物理内存再到文件。可见 mmap 这个系统调用是核心,我们现在来看 mmap 这个系统调用。
如果要映射到文件,fd 会传进来一个文件描述符,并且 mmap_pgoff 里面通过 fget 函数,根据文件描述符获得 struct file。struct file 表示打开的一个文件。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》,新⼈⾸单¥68
《趣谈 Linux 操作系统》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(43)
- 最新
- 精选
- 活的潇洒比起《深入浅出计算机组成原理》和《Linux性能优化实战》的篇幅 本节花了三天,每天不少于2小时,才把笔记做完,估计老师也花费不少时间 day25笔记:https://www.cnblogs.com/luoahong/p/10916458.html
作者回复: 是啊是啊,理解万岁
323 - zzuse我感觉学得很吃力,调用链太长了
作者回复: 忽略调用链,记住重点节点,调用链就是为了证明的确这样过去的
216 - LDxy请问老师,内核里面这些复杂的机制的实现,在当初软件开发开始前有详细的设计文档的吗?分布在全球各地的开发者是如何能达成这种复杂设计的共识的呢?这些内核里的函数相互依赖又和底层硬件相关,是如何进行单元测试的呢?
作者回复: 可以参考一下开源软件的运作模式,要写设计,大牛review,通过后写代码,大牛组成委员会,看够不够资格合并进去,要合并进去就要有相应的测试用例,覆盖率等,有邮件列表,实时对话工具
27 - 啦啦啦这篇看了四五遍,都是看了一半就没看了,这是第一次全部看完这篇文章,发现后半部分比前面好理解
作者回复: 还是要坚持,一遍不行,再来一遍
5 - mooneal难道堆中数据也是通过匿名映射来获取具体的物理地址?
作者回复: 对的
22 - 玉剑冰锋分配全局页目录项,赋值给mm_struct的pdg成员变量。这里应该是pgd吧老师?
作者回复: Page Global Directory,PGD,是的,老是倒
1 - 一笔一画请教下老师,内核线程的task struct上的mm为什么为空?另外看代码还有个active_mm,这个设计上有什么考虑吗?
作者回复: 内核线程没有用户地址空间。 如果是用户进程,则两者一样。如果是内核线程,没有mm,active_mm指向此时用户态的地址空间。
21 - youyuimmap可以将文件映射到内核态的虚拟内存空间吗?(据说NIO直接内存就是这么实现的)
作者回复: 内核就不是mmap了
- skye请问老师,malloc调用的也是mmap 吗?
作者回复: 大内存是的
- Geek_49fbe5老师,我们平时说的pss应该是指已经分配给进程的物理页面大小的总和吧?那如果运行中有部分页面被swap到了硬盘,此时的pss还把这部分大小算进去吗?
作者回复: 算进去了。
收起评论