mmap 和 内存管理初步
以 x86 体系结构为例。函数调用层级太多,内核实在太复杂了。
内核地址空间
不需要特别的记忆,内核的地址空间主要关注 pa
和 va
两个宏,其中定义了内核从内核的虚拟地址空间到物理地址的转换。x86 内核空间是从虚拟地址的高地址开始将自己映射到物理地址的低地址。为什么映射到的是物理地址的低地址,我想因为是由于物理地址的大小是不确定的,可能大可能小,但是物理地址的低地址永远是在的。
物理内存区域的初始化
paging_init
像是在划分物理内存的一些区域init_mem_mapping
像是对内核页表做一些初始化。
mmap
内核系统调用由 entry64.S
中定义。调用 do_syscall_64
进行调用。绑定到 9 号调用上,实际绑定 sys_mmap 调用。实际调用 ksys_mmap_pgoff
调用。然后进行了系统调用的相关功能和实现。
对于匿名的 mmap,实际上就是从用户虚拟空间里面找一个地址,然后合适的分配出去。分配实际上就是创建了一个 vma。
这里实际上只分配出一个地址和 vma,实际分配物理内存要等到缺页。
缺页异常
直接按匿名的一条路走下来,注意考虑多线程的环境。