一、vm_mmap_pgoff 函数执行流程 在vm_mmap_pgoff函数中 , 首先, 以 " 写者 " 身份 , 向Linux内核申请 读写 " 信号量 " 权限 ; 然后, 如果 读写 " 信号量 " 权限 申请通过 , 那么调用do_mmap_pgoff函数 , 执行 创建 "内存映射" 的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 ,...
len, unsigned long, prot, unsigned long, flags, unsigned long, fd, unsigned long, off) { if (offset_in_page(off) != 0) return -EINVAL; return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); }
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); if (file) fput(file); out: return retval; } 该函数主要功能由vm_mmap_pgoff来实现,而vm_mmap_pgoff主要逻辑就是调用了do_mmap_pgoff。下面我们看vm_mmap_pgoff的实现。 l do_mmap_pgoff unsigned long do_mmap_pgoff(struct file *...
在vm_mmap_pgoff函数中 , 首先, 以" 写者 "身份 , 向 Linux 内核申请读写 " 信号量 " 权限 ; 然后, 如果读写 " 信号量 " 权限申请通过 , 那么调用do_mmap_pgoff函数 , 执行创建 " 内存映射 "的过程 , 特别注意 , 这是 创建 " 内存映射 " 的 核心函数 , 下一篇博客着重讲该函数 ; 再后, 创...
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE */ } 另外由 mmap 在文件映射与匿名映射区中映射出来的这一段虚拟内存区域同进程虚拟内存空间中的其他虚拟内存区域一样,也都是有权限控制的。 比如上图进程虚拟内存空间中的代码段,它是与磁盘上 ELF 格式可执行文件中的 .text section(磁...
随后内核会对这段 VMA 进行相关的映射,如果是文件映射的话,内核会将我们要映射的文件,以及要映射的文件区域在文件中的 offset,与 VMA 结构中的 vm_file,vm_pgoff 关联映射起来,它们由 mmap 系统调用参数 fd,offset 决定。 struct vm_area_struct { struct file * vm_file; /* File we map to (can be ...
retval=vm_mmap_pgoff(file,addr,len,prot,flags,pgoff);out_fput:if(file)fput(file);returnretval;} 进入vm_mmap_pgoff函数,再到do_mmap函数,linux代码嵌套是很深的。 /* * 这个函数完成了file->vma的绑定。 */unsignedlongdo_mmap(structfile*file,unsignedlongaddr,unsignedlonglen,unsignedlongprot,unsigne...
在vm_mmap_pgoff 函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建的主要函数逻辑 ; 在do_mmap 函数中 , 调用了 mmap_region 函数 , 创建 " 虚拟内存区域 " ; ...
vm_ops:文件映射操作集合,匿名映射为NULL。vm_pgoff:文件映射文件偏移量,匿名映射无效。vm_file:...
vma->vm_pgoff = pgoff; 如果是文件映射的话,内核还会额外做一项工作,就是将分配出来的这段虚拟内存区域 vma 与映射文件关联映射起来。 vma->vm_file = get_file(file); error = call_mmap(file, vma); 映射的核心就是将虚拟内存区域 vm_area_struct 相关的内存操作vma->vm_ops设置为文件系统的相关操作...