1. 文件映射 当我们使用mmap()系统调用对文件进行映射时,将会触发调用do_mmap_pgoff()内核函数来完成工作,我们来看看do_mmap_pgoff()函数的实现(经过精简后): unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long ...
unsigned long len, unsigned long prot, unsigned long flag, unsigned long pgoff) { unsigned long ret; struct mm_struct *mm = current->mm; // 获取进程虚拟内存空间 // 是否需要为映射的 vma,提前分配物理内存页,避免后续的缺页 // 取决于 flag 是否设置了 MAP_POPULATE 或者 MAP_LOCKED,这里的 pop...
1. 文件映射 当我们使用 mmap() 系统调用对文件进行映射时,将会触发调用 do_mmap_pgoff() 内核函数来完成工作,我们来看看 do_mmap_pgoff() 函数的实现(经过精简后): unsigned longdo_mmap_pgoff(struct file*file,unsigned long addr,unsigned long len,unsigned long prot,unsigned long flags,unsigned long p...
一、sys_mmap_pgoff 系统调用函数执行流程 在sys_mmap_pgoff 函数中 , 首先, 进行 " 文件映射 " , 进程 中 维护了一个 打开文件 列表 , 根据 " 文件描述符 " 在上述列表 中查找 文件实例 ; 然后, 执行 " 匿名巨型页映射 " , 在 hugetlbfs 文件系统中 , 创建文件 ...
随后MMU 就会触发缺页异常(page fault),进程切换到内核态,在内核缺页中断处理程序中会发现引起缺页的这段 VMA 是私有文件映射的,所以内核会首先通过 vm_area_struct->vm_pgoff 在文件 page cache 中查找是否有缓存相应的文件页(映射的磁盘块对应的文件页)。 struct vm_area_struct { unsigned long vm_pgoff;...
随后内核会对这段 VMA 进行相关的映射,如果是文件映射的话,内核会将我们要映射的文件,以及要映射的文件区域在文件中的 offset,与 VMA 结构中的 vm_file,vm_pgoff 关联映射起来,它们由 mmap 系统调用参数 fd,offset 决定。 代码语言:javascript 复制
随后内核会对这段 VMA 进行相关的映射,如果是文件映射的话,内核会将我们要映射的文件,以及要映射的文件区域在文件中的 offset,与 VMA 结构中的 vm_file,vm_pgoff 关联映射起来,它们由 mmap 系统调用参数 fd,offset 决定。 structvm_area_struct{structfile*vm_file;/* File we map to (can be NULL). *...
不得不说,mmap的函数实现非常复杂,首先会调用到do_mmap_pgoff进行平台无关的代码分支,然后会调用到do_mmap里面,这个函数非常长!!! 我们挑几个关键的步骤: 先检查要映射的文件是否定义了mmap文件操作,(如果是目录就不存在mmap文件操作了)如果没有的话就直接调用失败 ...
一、vm_mmap_pgoff 函数执行流程 在vm_mmap_pgoff函数中 , 首先, 以" 写者 "身份 , 向 Linux 内核申请读写 " 信号量 " 权限 ; 然后, 如果读写 " 信号量 " 权限申请通过 , 那么调用do_mmap_pgoff函数 , 执行创建 " 内存映射 "的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 , 下...
sys_mmap_pgoff只是通过flags判断是否是匿名映射,如果不是则获取对应的struct file结构,然后再将其转发给do_mmap_pgoff函数,而该函数和它调用的mmap_region就是发挥主要作用的两个函数。 do_mmap_pgoff位于mmap.c文件中: copy 1 2 3 4 5 6 7 8