通过(一)、(二)、(三)三部分算是比较混乱的把mmap内核代码给梳理了一遍,确实写得比较混乱,因此这里再做一个总结,总结一下mmap具体的实现。
1、系统调用陷入内核
1)用户态调用mmap函数,陷入内核
mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
2)系统调用sys_mmap2函数被执行
sys_mmap2(unsigned long addr, size_t len,unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff)
3)sys_mmap2中调用do_mmap2
do_mmap2(unsigned long addr, size_t len, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long off, int shift)
4)do_mmap2中调用sys_mmap_pgoff
sys_mmap_pgoff(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff);
5)sys_mmap_pgoff调用do_mmap_pgoff