memory syscalls
内存相关的系统调用。
brk
内核提供的接口,意思是拓展堆以下数据段以上的边界。在某些时候 glibc 的实现会将 malloc 的小空间申请转化到这个上面。传入参数是一个地址,即想要最新拓展到的地址,返回值在成功时返回拓展后的边界地址,拓展失败就返回原来的地址。
这个系统调用的实现还是比较简单的,对传入的地址参数进行了判断,如果传入的参数收缩,就遍历vma,找到相应的vma,然后进行释放或者调整。如果是扩张,就创建新的vma,然后填入相关的数据,注意这时候只是把虚拟地址空间分配出来给进程了,但是物理地址空间还需要等进程对这个内存访问的时候进行缺页的分配。如果没有拿到锁,或者出现了相关的地址异常,比如说传入的地址超了 limit 等等,就会直接返回。
mprotect
主要是根据传入的标记,修改页表的权限标记,在修改完成之后有可能刷新 tlb。
mmap
两种功能,一种是将文件映射到虚拟内存进行读写,另一种是分配出指定长度的虚拟内存区域给内存,实际上也就是vma的创建和修改。到这里也就是分配出了用户虚拟地址空间,具体的物理地址分配等到缺页的时候才知道。
即使用户指定了虚拟地址的具体地址,操作系统也可能不固定分配在这个虚拟地址上,如果指定了 FIXED 的标志,就会固定到具体的地址。
tlb 的刷新在 mmu_gather 中管理。