作业六
|Last edited: 2024-12-5

一、请阅读并总结Operating Systems: Three Easy Pieces中23 Complete VM Systems中的The Linux Address Space一段

 
The Linux Address Space简要介绍了Linux操作系统中进程的地址空间,并着重介绍了其中的内核地址空间。
 
和诸多现代操作系统一样,Linux的进程地址空间也是由用户地址空间和内核地址空间两部分构成,地址从低到高分别为:User Code —> User Heap —> User Stack —> Kernel (Logical) —> Kernel(Virtual)。
在32位Linux系统中,内核空间和用户空间的分界点在0xC0000000处,即内核所占空间与用户空间的比例为1:3。
经搜索相关资料,了解到在64位Linux系统中,基于四级页表的的机制,其只使用后47位地址,前17位只做拓展使用。故:
用户空间地址为:0x0000000000000000 ~ 0x00007FFFFFFFFFFF
内核空间地址为:0xFFFF800000000000 ~ 0xFFFFFFFFFFFFFFFF
分别占据地址空间的底端和顶端,其余地址空间均为Unused。
 
值得注意的是,在地址空间内,Linux会设置Page0,也就是从零地址开始的一页不可使用。通过这样设置,可以有效解决空指针检测问题,同时也可以避免一些安全性问题,如利用空指针写入非法数据。
对于内核空间,其还可以再细分为逻辑地址和虚拟地址。
对于逻辑地址,在地址空间内连续的地址也会映射到连续的物理地址,一方面,连续的地址很容易进行地址转换;另一方面,连续的地址可以为DMA机制提供实足的方便。
而对于虚拟地址,它和用户空间的虚拟地址类似:不一定连续,且需要较复杂的转换,但是较容易分配。
内核的虚拟地址空间最初是由于在32位操作系统中,内核空间较小,为了能够提供1GB以上的可用空间才进行了如此设置。而随着64位操作系统的推出,内核空间也随之变大,这个问题也不再明显,但由于虚拟地址灵活性大、内存利用率高等特点,在64位操作系统中并没有舍弃内核虚拟地址空间。
 

二、总结你对讨论mmap的理解。

 
mmap是一个系统调用,作用是将用户空间的一片虚拟地址与磁盘某个文件对应起来,即建立“映射”关系,以进行文件的读和写。
 
1、mmap的工作流程:
1)在调用mmap之后,会在进程的虚拟内存开辟一片地址空间,并使要映射的文件映射到这一片地址空间。
注意,在这里只是进行了虚拟地址的分配,而并没有将文件加载到物理内存中,也没有进行虚拟地址到物理地址的映射。
 
2)当读取或写入mmap进行映射的文件时,我们会开始虚拟地址到物理地址的转换:通过查页表,发现对应的物理地址没有被分配,产生缺页,通过缺页处理函数,分配相应的物理地址,再将文件读到物理地址中,更新页表。
此时,有数据流的映射关系才真正被建立起来,先前的映射关系只是“挂了名”
 
2、MAP_SHARED和MAP_PRIVATE的实现
在进程A对fileA进行了mmap映射之后,如果进程B又再次调用了mmap映射fileA,
那么MMU在发现缺页之后,会在内存进行相应页的查找(根据文件系统)
如果找到了对应页(先前进程A使用mmap的指针时分配的物理页面),那么就更新页表,使得进程B分配的虚拟地址也指向该物理页。
如果是MAP_SHARED,那么很简单,由于二者映射的是同一片物理页,所有修改都可见。
如果是MAP_PRIVATE,则进行Copy-On-Write,当触发写的时候,再分配一片物理页,修改虚拟地址指向的物理地址,更新页表,将内容复制后再修改新的物理页。
如果没有找对应页(可能是因为被替换出了内存),则处理方法与第一次调用mmap时发生缺页相同。
 
注意:如果映射的是匿名文件,则对应的物理页无法被替换出内存,如果出现内存不足的情况下,可能会因为Out Of Memory导致进程终止。
 
3、mmap的效率:
write系统调用:先将要写的user buffer 复制到 kernel buffer 中,再写入到物理页中。
(不同文件系统的实现不同,ext4文件系统是直接把user buffer写入到物理页中)
read系统调用:先将物理页/磁盘中内容复制到kernel buffer中,再复制到user buffer中。
mmap:不论读写,都是user buffer 与 物理页/磁盘 的直接交互,只会触发一次复制。
 
可以看到,read/write系统调用都触发了两次复制(假设write使用了kernel buffer),而mmap只有一次,mmap的效率显然更高。
但是假设write系统调用是按ext4文件系统的方式实现的,则write在一次写入的大小与mmap相同(即一页的大小)时,两者的效率应该差不多。
 
 
Loading...