22 | 进程空间管理:项目组还可以自行布置会议室
该思维导图由 AI 生成,仅供参考
用户态和内核态的划分
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了进程的虚拟内存空间管理,包括32位和64位系统的内存布局、task_struct结构和mm_struct结构的解析,以及对TASK_SIZE的定义和设置过程。在32位系统中,进程的虚拟地址空间为4GB,其中3GB用于用户态,1GB用于内核态;而在64位系统中,虚拟地址空间为128T,同样分为用户空间和内核空间。文章详细描述了用户态虚拟空间的布局,包括代码、全局变量、堆、栈、内存映射区等,并解释了struct mm_struct中各变量的作用。此外,文章还介绍了vm_area_struct结构,描述了虚拟内存区域的属性和映射关系。在加载ELF二进制程序时,文章阐述了建立内存映射的过程,并详细解释了brk系统调用的实现原理。总体而言,本文通过深入的技术分析,帮助读者全面了解了进程的内存管理原理和细节,以及不同系统下的内存布局差异,对于理解进程的内存管理具有重要帮助。文章还介绍了32位和64位系统下的内核态虚拟空间布局,以及内核动态映射空间、持久内核映射等概念。通过对比分析,读者可以更清晰地理解不同系统下的内核内存布局特点。
《趣谈 Linux 操作系统》,新⼈⾸单¥68
全部留言(55)
- 最新
- 精选
- 有铭老师,之前你说过,内核态对于所有进程都是相同的,那时我就问过,这话的意思是不是说内核态内存在真实的物理内存里其实只有1份?
作者回复: 是的,内核对于所有的进程,不但物理内存只有一份,虚拟内存也是只有一份。也就是说A进程用户态访问x虚拟地址和B进程用户态访问x虚拟地址是不同的虚拟地址,也即A进程用户态在x虚拟地址里面放了一个数值w,B进程用户态的x虚拟地址看不到w,对应的也是不同的物理地址。A进程内核态访问的y虚拟地址,和B进程内核态访问的y虚拟地址,是通一个虚拟地址,也对应相同的物理地址。也即A进程内核态在y虚拟地址方一个数值n,B进程的内核态如果能够访问y虚拟地址的话,也能看到n
2019-05-17654 - Rainbow越来越看不懂了,有什么好办法吗?
作者回复: 多看几遍哈,重点关注机制和流程
2019-05-28842 - G.S.K老师好,vm_area_struct描述内存区域,内存区域有text,data,bss,堆,mmap映射,栈区域,一个进程的vm_area_struct个数只有这6个吗?
作者回复: 不是的,堆就不一定连续
2019-06-12710 - tuyu看到这里, 我觉得我们不能太关注code问题, 应该多关注数据结构和数据结构的关系, 这样就有目标了
作者回复: 是的,重点关注数据结构和流程,代码作为参考
2019-08-149 - Geek_49fbe5老师,如果一台X86的物理机的内存只有1G,那是不是意味着这台机子装不了linux操作系统呢,因为内核就得用1G的内存?
作者回复: 要区分虚拟地址空间和物理地址空间,可以虚拟的大,物理的小
2019-06-0126 - 幸运的🐴刘老师,为什么内核在load用户空间的内存映射到物理页的时候要自己在内核的持久映射区也建议一个映射呢,不能使用用户空间的映射吗?这样的话,持久映射区会不会有空间不够的情况?因为这块的虚拟空间很小(<1G),如果我mmap一个很大的文件到用户空间,那很明显没办法把这个文件映射到内核的虚拟空间来呀,这块它是怎么做的呢?另外,这个过程跟load elf不是类似的么?对于用户空间的进程的代码区,数据区等,还是需要把磁盘上的页读进内存吧?这个过程也需要在内核先映射,读完之后再解除映射?
作者回复: 在内核里面,得使用虚拟地址将内容读取到内存来。读一部分,映射一部分。load_elf_binary会最终调用do_mmap_pgoff,一样的
2019-06-1635 - 🍀吴昊我请问下最后两张图没有看明白 1 32位直接映射区为什么还保存了堆信息?不是存在vmalloc来直接分配内存的嘛? 2 64位512M 用于存放内核代码段、全局变量、BSS 等。为什么图中却只映射到代码,而是由直接映射区去映射?
作者回复: 可能是图有些误解,堆在High memory区域。图中指的是数据结构都保存在直接映射区。但是vmalloc分配出来是给内核用的。 内核代码,全局变量,bss都是在代码段的。其他动态生成的变量都是在直接映射区的
2019-06-1424 - 小松松请问下,像slab、伙伴系统这些工具跟用户空间和内核空间的虚拟内存、物理内存有什么关系呢? 一直很迷惑,请老师解答下。
作者回复: 伙伴系统是物理内存的分配,slub是划分为更小,但是都要变成虚拟地址才能被访问。
2019-05-204 - book尾汁问个问题,假如我创建一个只有512M内存的32位的虚拟机,那岂不是所有的物理内存都是对应内核的直接映射区,用户态程序还怎么通过mmap申请内存?
作者回复: 直接映射区是一个区域的名称,不代表直接映射的部分把整个区域都用完,如果用不完,mmap也是可以放在这个区域里面的,只不过不是直接映射的方式访问,就像客厅叫客厅,也可以摆个床睡觉
2020-04-183 - 南瓜具体实现细节太多,这里一个指针、那里一个结构,是否应该更多考虑,这背后的思想,以及如何理解?毕竟不常接触这块儿,总不能去背诵。
作者回复: 不要背诵,如果对着总结图能说出大概原理就可以啦
2020-06-012