作者回复: 多看几遍哈,重点关注机制和流程
作者回复: 是的,内核对于所有的进程,不但物理内存只有一份,虚拟内存也是只有一份。也就是说A进程用户态访问x虚拟地址和B进程用户态访问x虚拟地址是不同的虚拟地址,也即A进程用户态在x虚拟地址里面放了一个数值w,B进程用户态的x虚拟地址看不到w,对应的也是不同的物理地址。A进程内核态访问的y虚拟地址,和B进程内核态访问的y虚拟地址,是通一个虚拟地址,也对应相同的物理地址。也即A进程内核态在y虚拟地址方一个数值n,B进程的内核态如果能够访问y虚拟地址的话,也能看到n
作者回复: 不是的,堆就不一定连续
作者回复: 要区分虚拟地址空间和物理地址空间,可以虚拟的大,物理的小
作者回复: 伙伴系统是物理内存的分配,slub是划分为更小,但是都要变成虚拟地址才能被访问。
作者回复: 是的,重点关注数据结构和流程,代码作为参考
作者回复: 在内核里面,得使用虚拟地址将内容读取到内存来。读一部分,映射一部分。load_elf_binary会最终调用do_mmap_pgoff,一样的
作者回复: 可能是图有些误解,堆在High memory区域。图中指的是数据结构都保存在直接映射区。但是vmalloc分配出来是给内核用的。
内核代码,全局变量,bss都是在代码段的。其他动态生成的变量都是在直接映射区的
作者回复: 设计的时候就预留的呀。如果分配堆有高端内存是会优先使用的