一、vm_mmap_pgoff 函数执行流程 在vm_mmap_pgoff函数中 , 首先, 以 " 写者 " 身份 , 向Linux内核申请 读写 " 信号量 " 权限 ; 然后, 如果 读写 " 信号量 " 权限 申请通过 , 那么调用do_mmap_pgoff函数 , 执行 创建 "内存映射" 的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 ,...
vm_pgoff和vm_file:处理具有后备文件的内存映射的情况。vm_pgoff表示了该映射在文件中的页偏移量,而vm_file则包含了打开文件file实例的相关信息,以便在需要时能够正确地定位和操作对应的文件数据。 这些字段的信息使得vm_area_struct能够全面描述用户进程的虚拟内存区域,包括区域的边界、访问权限、关联文件信息以及共享...
复制代码 结构体struct vm_area_struct *vma是我们在使用mmap系统调用的时候内核帮我们找到的虚拟地址区间,它的主要成员是: vma->vm_start: 映射后的用户态虚拟地址起始地址; vma->vm_end: 映射后的用户态虚拟地址结束地址; vma->vm_pgoff: 物理地址所在的页帧号,它的值由用户空间传进来的物理地址右移PAGE_S...
int (*mmap)(struct file *filp,struct vm_area_struct *vma) 结构体struct vm_area_struct *vma是我们在使用mmap系统调用的时候内核帮我们找到的虚拟地址区间,它的主要成员是: vma->vm_start: 映射后的用户态虚拟地址起始地址; vma->vm_end: 映射后的用户态虚拟地址结束地址; vma->vm_pgoff: 物理地址所在...
结构体struct vm_area_struct *vma是我们在使用mmap系统调用的时候内核帮我们找到的虚拟地址区间,它的主要成员是: vma->vm_start: 映射后的用户态虚拟地址起始地址; vma->vm_end: 映射后的用户态虚拟地址结束地址; vma->vm_pgoff: 物理地址所在的页帧号,它的值由用户空间传进来的物理地址右移PAGE_SHIFT位得到...
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 ...
随后内核会对这段 VMA 进行相关的映射,如果是文件映射的话,内核会将我们要映射的文件,以及要映射的文件区域在文件中的 offset,与 VMA 结构中的 vm_file,vm_pgoff 关联映射起来,它们由 mmap 系统调用参数 fd,offset 决定。 代码语言:javascript 复制
一、vm_mmap_pgoff 函数执行流程 在vm_mmap_pgoff函数中 , 首先, 以" 写者 "身份 , 向 Linux 内核申请读写 " 信号量 " 权限 ; 然后, 如果读写 " 信号量 " 权限申请通过 , 那么调用do_mmap_pgoff函数 , 执行创建 " 内存映射 "的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 , 下...
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE */ } 另外由 mmap 在文件映射与匿名映射区中映射出来的这一段虚拟内存区域同进程虚拟内存空间中的其他虚拟内存区域一样,也都是有权限控制的。 比如上图进程虚拟内存空间中的代码段,它是与磁盘上 ELF 格式可执行文件中的 .text section(磁...
vm_pgoff:文件映射文件偏移量,匿名映射无效。 vm_file:映射文件,匿名映射为NULL。 3.缺页中断 Linux缺页中断是指当进程访问尚未建立映射关系的虚拟内存时,系统会触发缺页中断,并根据页面的状态来分配物理页面并建立映射关系。 通过mmap创建VMA后,我们使用VMA内存映射区虚拟地址,但此时虚拟地址不能映射物理地址,原因是...