Linux系统调用mmap

0 前言

    《Linux系统调用》整体介绍了系统调用,本文重点分析其中mmap的实现与使用方法。

1 定义

1.1 x86

(1)linux-2.6.31-

    采用老式定义方法:

asmlinkage long sys_mmap(unsigned long addr, unsigned long len,unsigned long prot, unsigned long flags,unsigned long fd, unsigned long off)
{long error;struct file *file;error = -EINVAL;if (off & ~PAGE_MASK)goto out;error = -EBADF;file = NULL;flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);if (!(flags & MAP_ANONYMOUS)) {file = fget(fd);if (!file)goto out;}   down_write(&current->mm->mmap_sem);error = do_mmap_pgoff(file, addr, len, prot, flags, off >> PAGE_SHIFT);up_write(&current->mm->mmap_sem);if (file)fput(file);
out:return error;
}
// @file: linux-2.6.31/arch/x86/kernel/sys_x86_64.c

(2) linux-2.6.32

    改用SYSCALL_DEFINE6宏进行定义:

SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, off)
{long error;struct file *file;error = -EINVAL;if (off & ~PAGE_MASK)goto out;error = -EBADF;file = NULL;flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);if (!(flags & MAP_ANONYMOUS)) {file = fget(fd);if (!file)goto out;}down_write(&current->mm->mmap_sem);error = do_mmap_pgoff(file, addr, len, prot, flags, off >> PAGE_SHIFT);up_write(&current->mm->mmap_sem);if (file)fput(file);
out:return error;
}
// @file: linux-2.6.32/arch/x86/kernel/sys_x86_64.c

(3)linux-2.6.33 ~ 4.16

    linux-2.6.33新增sys_mmap_pgoff()并将主要移致其中:

SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, off)
{long error;error = -EINVAL;if (off & ~PAGE_MASK)goto out;error = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
out:return error;
}
// @file: linux-2.6.33/arch/x86/kernel/sys_x86_64.c

(4)linux-4.17+

    sys_mmap_pgoff更名为ksys_mmap_pgoff:

SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, off)
{long error;error = -EINVAL;if (off & ~PAGE_MASK)goto out;error = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
out:return error;
}
// @file: linux-4.17/arch/x86/kernel/sys_x86_64.c

1.2 arm

    旧内核采用汇编定义,后面逐渐改用C定义:

(1)linux-2.6.12 ~ 2.6.32

/** Note: off_4k (r5) is always units of 4K.  If we can't do the requested* offset, we return EINVAL.*/
sys_mmap2:
#if PAGE_SHIFT > 12tst r5, #PGOFF_MASKmoveq   r5, r5, lsr #PAGE_SHIFT - 12streq   r5, [sp, #4]beq do_mmap2mov r0, #-EINVALRETINSTR(mov,pc, lr)
#elsestr r5, [sp, #4]b   do_mmap2
#endif
// @file: linux-2.6.12/arch/arm/kernel/entry-common.S

    可见具体实现为do_mmap2,它是一个C函数:

/* common code for old and new mmaps */
inline long do_mmap2(unsigned long addr, unsigned long len,unsigned long prot, unsigned long flags,unsigned long fd, unsigned long pgoff)
{int error = -EINVAL;struct file * file = NULL;flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);if (flags & MAP_FIXED && addr < FIRST_USER_ADDRESS)goto out;error = -EBADF;if (!(flags & MAP_ANONYMOUS)) {file = fget(fd);if (!file)goto out;}down_write(&current->mm->mmap_sem);error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);up_write(&current->mm->mmap_sem);if (file)fput(file);
out:return error;
}
// @file: linux-2.6.12/arch/arm/kernel/sys_arm.c

(2)linux-2.6.33+

    将具体实现由do_mmap2改为sys_mmap_pgoff:

/** Note: off_4k (r5) is always units of 4K.  If we can't do the requested* offset, we return EINVAL.*/
sys_mmap2:
#if PAGE_SHIFT > 12tst r5, #PGOFF_MASKmoveq   r5, r5, lsr #PAGE_SHIFT - 12streq   r5, [sp, #4]beq sys_mmap_pgoffmov r0, #-EINVALmov pc, lr
#elsestr r5, [sp, #4]b   sys_mmap_pgoff
#endif
ENDPROC(sys_mmap2)
// @file: linux-2.6.33/arch/arm/kernel/entry-common.S

1.3 arm64 

(1)linux-4.18

    采用老式定义方法:

asmlinkage long sys_mmap(unsigned long addr, unsigned long len,unsigned long prot, unsigned long flags,unsigned long fd, off_t off)
{if (offset_in_page(off) != 0)return -EINVAL;return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
}
// @file: linux-4.18/arch/arm64/kernel/sys.c

(2)linux-4.19+

    改用SYSCALL_DEFINE6宏定义:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录解决问题--redis ssl连接

1.问题场景 springboot连接redis启动报错&#xff0c;感觉是没连上redis&#xff0c;本地是正常启动的&#xff0c;但是本地不是ssl连接。 2.redis ssl连接知识 ①一般不开启ssl的连接&#xff0c;直接连接即可&#xff0c;有密码输密码。 ②不受信的ssl连接&#xff0c;也就…

unity基础(二)

debug方法 Debug.Log(" 一般日志 ");Debug.LogWarning(" 警告日志 ");Debug.LogError(" 错误日志 ");// Player Informationstring strPlayerName "Peter";int iPlayerHpValue 32500;short shPlayerLevel 10;long lAdvantureExp 1…

越秀城投·星汇城 | 看得再多,都不如实景现房更安心

对于大多数家庭而言&#xff0c;买房是人生大事。经历了前几年房企暴雷、楼盘停工烂尾的风波&#xff0c;“现房”成为买房人心中最安心的代名词。无需再等待&#xff0c;所见即所得。 越秀城投星汇城位于平度南部新城核芯片区&#xff0c;不仅享受区域发展的利好&#xff0c;…

vs2019 里 C++ 20规范的 string 类的源码注释

&#xff08;1&#xff09;读源码&#xff0c;可以让我们更好的使用这个类&#xff0c;掌握这个类&#xff0c;知道咱们使用了库代码以后&#xff0c;程序大致具体是怎么执行的。而不用担心程序出不知名的意外的问题。也便于随后的代码调试。 string 类实际是 库中 basic_strin…

使用zdppy_amauth开发获取用户列表接口

服务端代码&#xff1a; 1、创建数据库连接对象2、初始化数据库3、声明一个上下文4、挂载用户相关的路由&#xff0c;这里主要由&#xff1a;登录&#xff0c;注册&#xff0c;获取用户列表5、启动服务 import mcrud import api import amauth import env import contextlibe…

【C#】与cpp异同总结

1.类外部调用类内的静态变量和静态成员 C#中类内定义的静态变量和静态方法&#xff0c;在类外访问是用类名.变量 或者 类名.方法 public class MyClass {public static int MyStaticVariable 10;public static void MyStaticMethod(){Console.WriteLine("This is a sta…

基于JAVAEE的停车场管理系统(论文 + 源码)

【免费】基于JAVAEE的停车场管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89292324 基于JAVAEE的停车场管理系统 摘 要 如今&#xff0c;我国现代化发展迅速&#xff0c;人口比例急剧上升&#xff0c;在一些大型的商场&#xff0c;显得就格外拥挤&…

elasticsearch脚本更新文档

模板 {"saleIncludeCustomers": [{"center": "分公司","code": "34234","launchId": "规则id"}],"centerIncludeCustomers": {"center1": [{"code": "1234567&quo…

每日两题 / 24. 两两交换链表中的节点 25. K 个一组翻转链表(LeetCode热题100)

24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 定义三个指针&#xff0c;交换前先保存ntnt指针为next->next&#xff0c;cur和next两个节点&#xff0c;然后将pre->next指向next 若pre为空&#xff0c;说明当前交换的节点为头两个节点&#xff0c;…

VM虚拟机安装调试(步骤如下图)

VM虚拟机安装调试 随着一顿安装操作&#xff0c;还有enter键敲下&#xff0c;出现如下界面。

实现MYSQL8.3.0 版本流量抓取

实现MYSQL8.3.0 版本流量抓取 根据测试需求&#xff0c;需要抓取MYSQL8.3.0流量包&#xff0c;使用wireshark 数据库客户端实现 安装数据库服务端 这里就不给详细操作方法&#xff0c; 网上教程一大堆&#xff0c;小编这里是最新的MYSQL 8.3.0版本 安装成功后&#xff0c;创…

【吴恩达机器学习-week2】Python、NumPy、向量化

文章目录 1.1 目标1.2 有用的参考资料2 Python 和 NumPy 3 向量3.1 概要3.2 NumPy数组**3.3 向量构造**3.4 向量的操作3.4.1 索引3.4.2 切片**3.4.3 单向量操作**3.4.4 向量与向量的逐元素操作3.4.5 标量与向量的运算3.4.6 向量的点积运算3.4.7 速度需求&#xff1a;向量化与fo…

Omnity 进展月报 | 2024.4.1-4.30

Omnity 大事摘要 1、Octopus 官宣升级为 Omnity。 2、Omnity 4月28号正式上线&#xff0c;实现BTC 和 ICP 之间跨链转账 Runes 资产。 3、为庆祝上线&#xff0c;以符文 HOPE•YOU•GET•RICH 为资产&#xff0c;发红包快速触达大量用户&#xff0c;体验跨链服务。 4、Omni…

【前端】前端数据本地化的多种实现方式及其优劣对比

前端数据本地化的多种实现方式及其优劣对比 在现代Web开发中&#xff0c;提高页面响应速度和改善用户体验是核心目标之一。数据本地化是其中一种实现方式&#xff0c;它通过在客户端存储数据来减少服务器请求&#xff0c;从而加快数据载入速度和改善用户的体验。本文将介绍前端…

26、Qt使用QFontDatabase类加载ttf文件更改图标颜色

一、图标下载 iconfont-阿里巴巴矢量图标库 点击上面的链接&#xff0c;在打开的网页中搜索自己要使用的图标&#xff0c;如&#xff1a;最大化 找到一个自己想用图标&#xff0c;选择“添加入库” 点击“购物车”图标 能看到刚才添加的图标&#xff0c;点击“下载代码”(需要…

4000字超详解Linux权限

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 在Linux当中权限的体现主要有两种 普通用户 超…

图片无损压缩工具-VIKY

一、前言 Viky v3.4是一款功能强大的图片压缩工具&#xff0c;它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法&#xff0c;该软件在显著减小图片文件大小的同时&#xff0c;还保持了图像的清晰度和色彩饱和度&#xff0c;确保了图像质量的优异表现。 二、软件特点…

CAPL如何实现TLS握手认证

CAPL有专门的章节介绍如何实现TLS握手认证的函数: CAPL调用哪些函数实现TLS握手认证,需要了解TLS在整个通信过程的哪个阶段。 首先TCP需要建立连接,这是TLS握手的前提。当TLS握手认证完成后,可以传输数据。 所以TLS握手开始前需要确保TCP建立连接,TCP传输数据前需要确保…

泰迪科技2024中职大数据实训室方案解读

中职在大数据专业建设所遇到的困难 数据、信息安全、人工智能等新信息技术产业发展迅猛&#xff0c;人才极其匮乏&#xff0c;各个中职院校纷纷开设相应的专业方向。但是&#xff0c;绝大多数院校因为师资和积累问题&#xff0c;在专业建设规划、办学特色提炼、创新教学模…

基础I/O:C文件、系统文件I/O

C语言文件操作 文件 内容 属性访问文件之前&#xff0c;都i需要先打开&#xff0c;修改文件&#xff0c;都是i通过执行代码的方式完成修改&#xff0c;文件都必须被加载到内存中进程打开文件一个进程可以打开多个文件进程和文件的关系系统中不是所有的文件都被进程打开了&am…