• êwěn
    2021-11-02
    老师,文章里说mmap也可以修改堆大小,那映射的区域为啥不属于堆呢?

    作者回复: 很有意思的问题:)我们课里也介绍了mmap的几个作用。其中私有匿名映射用于分配空间,这样分配的空间还是从映射区域里分配的,但是从功能上说呢,它和使用sbrk所得到的内存区域又是相同的。所以这一部分内存我们还是倾向于称呼它为堆。但你要知道的是,其实严格来说,这是从文件映射区“偷”来的。

    共 3 条评论
    12
  • 大脑壳
    2021-11-17
    您这里所描述的linux进程的内存布局,和JVM的内存布局是一个维度吗?JVM内部的堆栈和linxu系统的堆栈是一个什么样的关系?请老师指教

    作者回复: 不是。JVM把很多东西都托管了。它和linux进程布局很不相同。但是JVM仍然有很多设计深受传统的进程内存使用的影响。先学好Linux进程布局吧。JVM我们慢慢讲。

    
    5
  • 慢动作
    2021-10-29
    从执行视角那张图,代码段是可读可执行,数据段是可读可写,把链接器视角的.bss对应为数据段了,后面的图又把bss单独列出来,这是为什么?bss存了未初始化的数据,只有大小,那初始化后数据放哪里?

    作者回复: bss段在磁盘上的时候,只记录了大小,比如100字节,在磁盘上不需要真的保留100字节,只要记下来就行了。加载进内存的时候要先为他分配100字节,然后这100字节再和data段合并到一起,成为内存里的data segment。带有初始值的变量,是放到data section的。这个文章里面有的。再仔细看一下~

    共 2 条评论
    5
  • 送过快递的码农
    2021-10-29
    我说下我的猜想,代码段,可读可执行,数据段:可读可写。至于堆:这个我猜想所在,如果单从我们写一个Hello World程序的时候,堆看起来有读写权限就行。但是,由于我们有实时编译技术,就从我知道的Java来说,有jit。虽然我从来没接触过这个大神,但是它本质上无非就是把一个动态字符穿实时编译成一个可执行字节码。由于通常字符串是在堆中的,所以编译成的可执行字节码是存在堆里面的。所以我猜想,堆里面肯定是有执行权限的。这个技术像Java可以进行字节码技术进行动态代理,大大增加了程序的灵活性,但是,也让程序有了被攻击的可能性,比如很多反序列化技术比如阿里巴巴的fastjson的bug应该和即时编译是有关系的。 老师我有个问题,就是之前在别的专栏里看的内容,说Linux进程和线程是在内核里面是一样的数据结构,那么进程的子进程和线程应该也是可区分的把,至少进程之前,内存除了共享内存,彼此之间是不能通讯的吧,但是线程是无条件使用进程的内存权限吧。内核还是能够区分这个任务是进程还是线程的吧

    作者回复: 很全面!思考得很深入!非常好

    共 2 条评论
    3
  • =
    2022-01-10
    代码段:可读可执行 数据段:可读可写 堆:可读可写可执行

    作者回复: 堆一般也是可写可读,要让他可执行,得用mmap或者mprotect接口主动去修改

    
    2
  • 坚定的抢手
    2021-12-13
    打开随机化的模式,会让内核在加载的过程中,对这些区域的起始地址增加一些随机的偏移值,这能增加缓冲区溢出的难度。 这个地方不太明白,为什么增加随机便宜值之后会增加缓冲区溢出的难度。希望老师能抽空解答一下。 网上查了一下关于随机化的作用,一般性的回答都是说,提高程序的安全防止攻击。

    作者回复: 好的。这个问题比较复杂,放在评论里篇幅太长了。我准备在最后开一个专题文章专门讲一下,就不在这里回答了。

    
    2
  • 姑射仙人
    2021-11-07
    老师,mmap和Page Cache的使用有关系吗?像RocketMQ中写文件使用的内存映射文件。

    作者回复: 是工作在不同层次上的。mmap其实只负责将文件与内存页对应起来。至于这个页是缺页状态,还是在Cache里,或者在swap区域,都是操作系统关心的,mmap不需要知道这些的。有很多开源组件使用mmap来加速IO,这是很常见的技巧。更常见的是驱动开发里使用这个技巧。因为这部分的资料比较多了,而且和我们这个专栏的主题关联度也不是那么强,所以我就没写这部分内容。

    
    2
  • 我是内存
    2021-11-02
    请问下: 1.IA-32的内存布局中kernel占1G,用户空间占3G,这个比例是可以随意调整的吗? 2.64bit的内存布局中,深色的空洞部分是表示它占着地方,但是没把它占据的空间添加到虚拟地址空间里面吧,相当于是一个黑户?

    作者回复: 1. 不行的哦,这个是linux内核源码写死的,要改就得改linux的源代码再重新编译。2. 你的比喻很直观,非常好,页表就是管户口的,没在页表里注册的,就是黑户,👍

    共 2 条评论
    2
  • WA自动机
    2021-12-20
    老师,前面的文章提到过:通过虚拟内存,每个进程有独立的页表。用fork创建父子进程应该都是有自己独立的页表啊,他们是怎么做到共享内存的呢

    作者回复: 继续向后看,学习完第十课可以自己再思考一下。如果还是没能解答你的疑问,可以加入微信群继续提问。

    共 4 条评论
    1
  • 柒
    2021-11-02
    void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset); 第一个形参名是start,而不是addr, 形参名 见名知意。

    作者回复: linux内核代码里的声明就是addr。形参就是个名字而已。

    
    1