一、vm_mmap_pgoff 函数执行流程 在vm_mmap_pgoff函数中 , 首先, 以 " 写者 " 身份 , 向Linux内核申请 读写 " 信号量 " 权限 ; 然后, 如果 读写 " 信号量 " 权限 申请通过 , 那么调用do_mmap_pgoff函数 , 执行 创建 "内存映射" 的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 ,...
vm_pgoff和vm_file:处理具有后备文件的内存映射的情况。vm_pgoff表示了该映射在文件中的页偏移量,而vm_file则包含了打开文件file实例的相关信息,以便在需要时能够正确地定位和操作对应的文件数据。 这些字段的信息使得vm_area_struct能够全面描述用户进程的虚拟内存区域,包括区域的边界、访问权限、关联文件信息以及共享...
随后MMU 就会触发缺页异常(page fault),进程切换到内核态,在内核缺页中断处理程序中会发现引起缺页的这段 VMA 是私有文件映射的,所以内核会首先通过 vm_area_struct->vm_pgoff 在文件 page cache 中查找是否有缓存相应的文件页(映射的磁盘块对应的文件页)。 struct vm_area_struct { unsigned long vm_pgoff; ...
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); return retval; } 接着看vm_mmap_pgoff函数,这里主要用信号量对进程地址空间做了一个保护,然后根据populate的值会prefault页表,如果是文件映射则会对文件进行预读。 // mm/util.c unsigned long vm_mmap_pgoff(struct file *file, unsigned ...
随后内核会对这段 VMA 进行相关的映射,如果是文件映射的话,内核会将我们要映射的文件,以及要映射的文件区域在文件中的 offset,与 VMA 结构中的 vm_file,vm_pgoff 关联映射起来,它们由 mmap 系统调用参数 fd,offset 决定。 代码语言:javascript 代码运行次数:0 ...
unsignedlongvm_pgoff;/* Offset (within vm_file) in PAGE_SIZE units */ structfile*vm_file;/* File we map to (can be NULL). */ void* vm_private_data;/* was vm_pte (shared mem) */ atomic_long_tswap_readahead_info; #ifndefCONFIG_MMU ...
随后MMU就会触发缺页异常(page fault),进程切换到内核态,在内核缺页中断处理程序中会发现引起缺页的这段 VMA 是私有文件映射的,所以内核会首先通过vm_area_struct->vm_pgoff在文件page cache中查找是否有缓存相应的文件页。 如果文件页不在page cache中,内核则会在物理内存中分配一个内存页,然后将新分配的内存页...
vma->vm_pgoff = pgoff; if (file) { ... vma->vm_file = file; /* 3. 此处是内存映射的关键点,调用文件对象的 mmap() 回调函数来设置vma结构的 fault() 回调函数。 * vma对象的 fault() 回调函数的作用是: * - 当访问的虚拟内存没有映射到物理内存时, ...
同私有文件映射的缺页处理一样,内核会首先通过 vm_area_struct->vm_pgoff 在文件 page cache 中查找是否有缓存相应的文件页(映射的磁盘块对应的文件页)。如果文件页不在 page cache 中,内核则会在物理内存中分配一个内存页,然后将新分配的内存页加入到 page cache 中。
一、vm_mmap_pgoff 函数执行流程 在vm_mmap_pgoff函数中 , 首先, 以" 写者 "身份 , 向 Linux 内核申请读写 " 信号量 " 权限 ; 然后, 如果读写 " 信号量 " 权限申请通过 , 那么调用do_mmap_pgoff函数 , 执行创建 " 内存映射 "的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 , 下...