作者回复: 很有意思的问题:)我们课里也介绍了mmap的几个作用。其中私有匿名映射用于分配空间,这样分配的空间还是从映射区域里分配的,但是从功能上说呢,它和使用sbrk所得到的内存区域又是相同的。所以这一部分内存我们还是倾向于称呼它为堆。但你要知道的是,其实严格来说,这是从文件映射区“偷”来的。
作者回复: 不是。JVM把很多东西都托管了。它和linux进程布局很不相同。但是JVM仍然有很多设计深受传统的进程内存使用的影响。先学好Linux进程布局吧。JVM我们慢慢讲。
作者回复: bss段在磁盘上的时候,只记录了大小,比如100字节,在磁盘上不需要真的保留100字节,只要记下来就行了。加载进内存的时候要先为他分配100字节,然后这100字节再和data段合并到一起,成为内存里的data segment。带有初始值的变量,是放到data section的。这个文章里面有的。再仔细看一下~
作者回复: 很全面!思考得很深入!非常好
作者回复: 堆一般也是可写可读,要让他可执行,得用mmap或者mprotect接口主动去修改
作者回复: 好的。这个问题比较复杂,放在评论里篇幅太长了。我准备在最后开一个专题文章专门讲一下,就不在这里回答了。
作者回复: 是工作在不同层次上的。mmap其实只负责将文件与内存页对应起来。至于这个页是缺页状态,还是在Cache里,或者在swap区域,都是操作系统关心的,mmap不需要知道这些的。有很多开源组件使用mmap来加速IO,这是很常见的技巧。更常见的是驱动开发里使用这个技巧。因为这部分的资料比较多了,而且和我们这个专栏的主题关联度也不是那么强,所以我就没写这部分内容。
作者回复: 1. 不行的哦,这个是linux内核源码写死的,要改就得改linux的源代码再重新编译。2. 你的比喻很直观,非常好,页表就是管户口的,没在页表里注册的,就是黑户,👍
作者回复: 继续向后看,学习完第十课可以自己再思考一下。如果还是没能解答你的疑问,可以加入微信群继续提问。
作者回复: linux内核代码里的声明就是addr。形参就是个名字而已。