【Linux 内核 内存管理】mmap 系统调用源码分析 ② ( sys_mmap_pgoff 系统调用函数执行流程 | sys_mmap_pgoff 函数源码 )
2023-09-14 09:07:26 时间
调用 mmap
系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff
函数 , 继续向下执行 ;
一、sys_mmap_pgoff 系统调用函数执行流程
在 sys_mmap_pgoff
函数中 ,
首先 , 进行 " 文件映射 " , 进程 中 维护了一个 打开文件 列表 , 根据 " 文件描述符 " 在上述列表 中查找 文件实例 ;
然后 , 执行 " 匿名巨型页映射 " , 在 hugetlbfs
文件系统中 , 创建文件 " 巨型页 " , 即 anon_hugepage
;
最后 , 调用了 vm_mmap_pgoff
函数 , 继续向后执行 ;
二、sys_mmap_pgoff 系统调用函数源码
该 sys_mmap_pgoff
系统调用函数源码 , 定义在 Linux 内核源码的 linux-4.12\mm\mmap.c#1475 位置 ;
sys_mmap_pgoff
函数源码如下 :
SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags,
unsigned long, fd, unsigned long, pgoff)
{
struct file *file = NULL;
unsigned long retval;
if (!(flags & MAP_ANONYMOUS)) {
audit_mmap_fd(fd, flags);
file = fget(fd);
if (!file)
return -EBADF;
if (is_file_hugepages(file))
len = ALIGN(len, huge_page_size(hstate_file(file)));
retval = -EINVAL;
if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file)))
goto out_fput;
} else if (flags & MAP_HUGETLB) {
struct user_struct *user = NULL;
struct hstate *hs;
hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);
if (!hs)
return -EINVAL;
len = ALIGN(len, huge_page_size(hs));
/*
* VM_NORESERVE is used because the reservations will be
* taken when vm_ops->mmap() is called
* A dummy user value is used because we are not locking
* memory so no accounting is necessary
*/
file = hugetlb_file_setup(HUGETLB_ANON_FILE, len,
VM_NORESERVE,
&user, HUGETLB_ANONHUGE_INODE,
(flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);
if (IS_ERR(file))
return PTR_ERR(file);
}
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
out_fput:
if (file)
fput(file);
return retval;
}
源码路径 : linux-4.12\mm\mmap.c#1475
相关文章
- Linux服务器:内存紧张,求解救!(linux服务器内存不足)
- 优化优化Linux程序的内存占用(linux程序内存占用)
- Linux获取IP地址的简易指南(获取linux的ip)
- 配置Linux查看网络配置:一步搞定(linux查看网络)
- Linux内存管理:分页机制与性能优化(linux分页机制)
- 检测Linux环境下内存泄漏检测实践(linux下内存泄露)
- 探索Linux系统内存硬件信息(linux内存硬件信息)
- 查看Linux内存命令:简单明了(查看linux内存命令)
- Linux工程师职业发展前景(linux职位)
- Linux读取内存的简易指南(linux读内存)
- Linux内存管理:基于分页的实现(linux内存分页管理)
- 深入浅出:Linux内存占用优化技巧(linux内存占用)
- 一步步教你如何在Linux系统中安装.sh文件(linux.sh安装)
- 凯立德Linux:开启一段技术革新之旅(凯立德linux)
- Linux系统启动过程与步骤详解(linux启动流程)
- 调整Linux系统时间:完美掌控计时规则(linux修改时间)
- 初学Linux:自学之路如何起航(怎么自学linux)
- 增强PS性能:Linux内存管理技巧(ps内存linux)
- Linux内核:精准内存分配(linux内核分配内存)
- 如何优化Linux系统的Swap使用?(linux系统的swap)
- 轻松掌握!Linux下如何正确退出软件(linux退出软件)
- Linux职场:把您的技能升级(linux就业需要)
- 查看Linux系统版本的简单方法(查看linux系统的版本)
- Linux 流程操作:一步一步掌握(linux流程图)
- 如何在Linux上保护只读系统文件?(linux只读系统文件)
- Linux 内存管理法 Slab 实现更有效的资源使用(linux slab)
- 快速定位进程——Linux端口号查询技巧(linux根据端口号查进程)
- 深入Linux:编写程序的入门指南(怎么用linux写程序)
- Linux系统:选择最优质的操作系统(比较好的linux系统)
- Linux下查看文件的最佳实践(查看文件 linux)