Linux应用与驱动开发:mmap和内存映射

学习笔记:Linux 驱动开发之mmap与内存映射

1. 核心概念:什么是mmap

mmap(Memory Map) 是一种内存映射文件的方法。在嵌入式 Linux 驱动开发中,它主要用于将外设的物理地址(如 GPIO 寄存器)映射到用户进程的虚拟地址空间

  • 传统方式:用户态read/write<–> 内核态拷贝数据 <–> 驱动操作寄存器。
  • mmap 方式:用户态指针 <–> MMU 直接转换 <–> 硬件寄存器。(零拷贝,速度极快

2. 核心难点:用户虚拟地址 vs 内核虚拟地址

这是理解 Linux 内存管理的关键分水岭。

2.1 对比图表

特性用户虚拟地址 (UVA)内核虚拟地址 (KVA)
定义应用程序看到的地址。操作系统内核驱动看到的地址。
地址范围 (32位)0x00000000~0xBFFFFFFF(0~3G)0xC0000000~0xFFFFFFFF(3G~4G)
可见性私有。进程A和进程B的0x1000互不相干。全局共享。所有进程进入内核态后看到的都是同一份。
映射工具mmap()ioremap()
访问权限仅当前进程有效,进程结束即销毁。系统启动即存在,只有内核代码可读写。
物理对应通常不连续,按需分配(缺页中断)。逻辑地址线性映射,vmalloc/ioremap非线性。

2.2 它们与物理地址的关系

假设 i.MX6ULL 的一个 LED 寄存器物理地址是0x0209C000

  1. CPU/MMU:只认物理地址0x0209C000
  2. 驱动程序 (KVA):通过ioremap拿到一个地址(如0xF0001000)。驱动写0xF0001000-> MMU 查表 -> 写入物理地址。
  3. 应用程序 (UVA):通过mmap拿到一个地址(如0xB7001000)。应用写0xB7001000-> MMU 查表 -> 写入物理地址。

结论:UVA 和 KVA 就像是通往同一个房间(物理地址)的两扇不同的门。一扇门开在“用户公寓”(0-3G),另一扇门开在“管理员办公室”(3-4G)。


3.mmap的实现流程(驱动与应用配合)

3.1 应用程序做了什么?

应用程序中的mmap最终会调用驱动中实现的.mmap接口(即下面的my_driver_mmap函数)

int fd = open("/dev/my_led", O_RDWR); // 申请映射:从 offset 0 开始,映射 4096 字节 unsigned char *addr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); // 直接操作硬件! *addr = 0x01; // 点灯

3.2 驱动程序做了什么? (fops.mmap)

驱动的核心任务是构建页表

  1. 获取物理地址:知道你要操作哪个寄存器(例如0x0209C000)。
  2. 计算页帧号 (PFN):Linux 内存管理以“页”为单位(通常 4KB)。
    • PFN = 物理地址 >> PAGE_SHIFT(即除以 4096)。
  3. 调用remap_pfn_range:这是核心函数。它负责修改当前进程的页表,建立 UVA 到 物理地址 的映射。
// 驱动代码示例 static int my_driver_mmap(struct file *file, struct vm_area_struct *vma) { unsigned long phy_addr = 0x0209C000; // 硬件物理地址 // 关键:设置为不使用缓存 (Nocache)!否则寄存器读写会出错 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); // 建立映射:把 vma->vm_start (应用层的UVA) 映射到 phy_addr (物理地址) if (remap_pfn_range(vma, vma->vm_start, // 用户虚拟地址起始 phy_addr >> PAGE_SHIFT, // 物理地址页帧号 vma->vm_end - vma->vm_start, // 映射大小 vma->vm_page_prot)) // 属性:无缓存 { return -EAGAIN; } return 0; }

4. 关键细节与注意事项

4.1 为什么要pgprot_noncached

  • 原因:对于硬件寄存器,必须禁止 CPU 缓存 (Cache)
  • 后果:如果不加这一行,应用程序写数据可能只写到了 Cache 里,LED 灯根本不会亮,或者读取的状态是旧的。

4.2 为什么映射大小通常是 4KB (4096)?

  • MMU 管理内存的最小单位是一页 (Page),ARM Linux 默认页大小是 4096 字节。
  • 即使你只需要操作 4 个字节的寄存器,mmap也会映射整整一页(4096 字节)。因此,你在计算偏移量时要小心。

4.3ioremapmmap的关系

  • 驱动程序自己要访问寄存器 -> 用ioremap
  • 驱动程序想让应用程序直接访问寄存器 -> 实现.mmap接口(内部调用remap_pfn_range)。
  • 通常一个驱动里这两个都会用到。

5. 总结

  1. 物理地址是唯一的真理,但被 CPU 藏在了 MMU 后面。
  2. KVA (内核虚拟地址)是驱动在内核态用的,通过ioremap映射。
  3. UVA (用户虚拟地址)是应用在用户态用的,通过mmap系统调用请求,由驱动协助映射。
  4. remap_pfn_range是连接 UVA 和 物理地址 的桥梁。

下一步实践建议:

在韦东山的开发板上,你可以写一个简单的程序,利用 /dev/mem 这个系统自带的驱动节点。它已经实现了 mmap 功能。你可以尝试用 mmap 映射 GPIO 的物理基地址,然后在应用层直接点亮 LED,这将是你理解这一概念最直观的实验。

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

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

相关文章

Day 34:【99天精通Python】单元测试 (Unittest) - 给代码上个保险

Day 34&#xff1a;【99天精通Python】单元测试 (Unittest) - 给代码上个保险 前言 欢迎来到第34天&#xff01; 在之前的开发中&#xff0c;我们通常是怎么验证代码对不对的&#xff1f; —— 写完代码&#xff0c;手动运行一下&#xff0c;输入几个参数&#xff0c;看看打印结…

Day 35:【99天精通Python】综合实战 - 爬虫与数据分析可视化(上) - 数据采集与入库

Day 35&#xff1a;【99天精通Python】综合实战 - 爬虫与数据分析可视化(上) - 数据采集与入库 前言 欢迎来到第35天&#xff01; 经过前两周的学习&#xff0c;我们已经掌握了网络请求&#xff08;Requests&#xff09;、网页解析&#xff08;BeautifulSoup&#xff09;、数…

多FDCAN接口同步配置实战:双通道并行通信实现

多FDCAN接口实战&#xff1a;双通道并行通信如何突破带宽瓶颈你有没有遇到过这样的情况&#xff1f;在开发一个高实时性的车载控制模块时&#xff0c;CAN总线突然“卡顿”——数据延迟飙升、报文丢失频发。排查一圈后发现&#xff0c;并不是硬件故障&#xff0c;而是单条CAN通道…

强烈安利10个AI论文软件,MBA毕业论文轻松搞定!

强烈安利10个AI论文软件&#xff0c;MBA毕业论文轻松搞定&#xff01; AI 工具如何让论文写作更高效&#xff1f; 在当前的学术环境中&#xff0c;MBA 学生和研究者们正面临越来越多的挑战。从选题到撰写&#xff0c;再到查重与修改&#xff0c;每一个环节都可能成为耗时费力的…

Figma中文界面本地化:设计师专属的语言解决方案

Figma中文界面本地化&#xff1a;设计师专属的语言解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 语言障碍的痛点与解决方案 对于国内设计从业者而言&#xff0c;Figma作为专…

Day 36:【99天精通Python】综合实战 - 爬虫与数据分析可视化(下) - 让数据“说话“

Day 36&#xff1a;【99天精通Python】综合实战 - 爬虫与数据分析可视化(下) - 让数据"说话" 前言 欢迎来到第36天&#xff01; 在昨天&#xff08;Day 35&#xff09;的课程中&#xff0c;我们化身为"数据采集员"&#xff0c;成功编写爬虫抓取了豆瓣 Top2…

导师推荐!8个AI论文平台测评:研究生开题报告全攻略

导师推荐&#xff01;8个AI论文平台测评&#xff1a;研究生开题报告全攻略 学术写作工具测评&#xff1a;为什么需要一份精准的AI论文平台榜单 在研究生阶段&#xff0c;开题报告和论文撰写是科研工作的核心环节&#xff0c;而高效、专业的写作工具能显著提升研究效率与成果质…

Intel平台嵌入式SPI通信:新手教程

Intel平台嵌入式SPI通信&#xff1a;从零理解eSPI的实战指南你有没有遇到过这样的情况&#xff1f;在调试一块工业主板时&#xff0c;发现电源键按下后系统无法唤醒&#xff1b;或者在做低功耗设计时&#xff0c;明明进入了S3睡眠&#xff0c;传感器数据却断了传输。这些问题的…

Doris与Trino集成:统一SQL大数据查询引擎

Doris与Trino集成:统一SQL大数据查询引擎 关键词:Doris、Trino、SQL查询引擎、大数据分析、数据仓库、联邦查询、OLAP 摘要:本文深入探讨了Apache Doris与Trino两大流行SQL查询引擎的集成方案,旨在构建统一的大数据查询平台。文章首先分析了两者的架构特点和互补优势,然后…

Day 38:【99天精通Python】线程池与进程池 - 优雅地管理并发

Day 38&#xff1a;【99天精通Python】线程池与进程池 - 优雅地管理并发 前言 欢迎来到第38天&#xff01; 在 Day 24 和 Day 25 中&#xff0c;我们学习了如何手动创建线程 (threading.Thread) 和进程 (multiprocessing.Process)。虽然原理都懂了&#xff0c;但在实际工程中&a…

“死了么”App爆火,我发现了个安卓版,代码开源!

最近看到一个特别搞笑的评论&#xff1a; 当代年轻人日常&#xff1a;用「饿了么」填饱肚子&#xff0c;「死了么」证明还活着 &#x1f602; 随着前几天「死了么」APP 爆火&#xff0c;网上的段子手们就没停下来过&#xff0c;哈哈哈哈哈 iPhone版 「死了么」是iPhone手机上…

Figma中文插件完全配置指南:告别英文界面困扰

Figma中文插件完全配置指南&#xff1a;告别英文界面困扰 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而头疼吗&#xff1f;面对专业设计工具&#xff0c;…

基于YOLOv8的小麦田间病害识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

基于YOLOv8的小麦田间病害识别项目&#xff5c;完整源码数据集PyQt5界面完整训练流程开箱即用&#xff01; 源码包含&#xff1a;完整YOLOv8训练代码数据集(带标注)权重文件直接可允许检测的yolo检测程序直接部署教程/训练教程 基本功能演示 源码在文末哔哩哔哩视频简介处获…

基于Simulink的混合PO与INC切换MPPT策略仿真

目录 手把手教你学Simulink 一、引言&#xff1a;为什么需要“混合P&O与INC”&#xff1f; 二、系统整体架构 控制流程&#xff1a; 三、核心算法详解 1. P&O 算法&#xff08;扰动观察法&#xff09; 2. INC 算法&#xff08;电导增量法&#xff09; 3. 光照突…

多语言界面在screen中的实现:项目应用

用 GNU Screen 构建轻量级多语言终端界面&#xff1a;从原理到实战你有没有遇到过这样的场景&#xff1f;一位中国工程师深夜远程连接非洲基站的工控设备&#xff0c;刚准备执行配置命令时断网了。几小时后重新登录&#xff0c;发现之前的调试流程全中断了——日志没了、上下文…

学长亲荐8个一键生成论文工具,专科生毕业论文必备!

学长亲荐8个一键生成论文工具&#xff0c;专科生毕业论文必备&#xff01; AI 工具让论文写作不再难 在当前的学术环境中&#xff0c;AI 工具已经成为许多学生和研究者不可或缺的助手。尤其是对于专科生而言&#xff0c;面对繁重的毕业论文任务&#xff0c;如何高效地完成内容撰…

Figma中文界面终极解决方案:5分钟完成专业设计工具全面汉化

Figma中文界面终极解决方案&#xff1a;5分钟完成专业设计工具全面汉化 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文操作界面而困扰&#xff1f;想要快速掌握这款国际…

基于Simulink的多时间常数储能配置优化仿真

手把手教你学Simulink--基础储能管理场景实例&#xff1a;基于Simulink的多时间常数储能配置优化仿真 手把手教你学Simulink ——基础储能管理场景实例&#xff1a;基于Simulink的多时间常数储能配置优化仿真 一、引言&#xff1a;为什么需要“多时间常数储能”&#xff1f; …

大模型微调技术详解:从全参数微调到RLHF的演进与应用

文章系统介绍了大模型微调技术的发展历程&#xff0c;从2018年全参数微调到2023年的偏好对齐技术&#xff0c;包括特征提取、Adapter、LoRA、提示微调、指令微调等方法。分析了各种微调技术的原理、特点和适用场景&#xff0c;解释了微调为何在大模型时代取代从零训练&#xff…

大模型微调技术详解:从全参数微调到RLHF的演进与应用

文章系统介绍了大模型微调技术的发展历程&#xff0c;从2018年全参数微调到2023年的偏好对齐技术&#xff0c;包括特征提取、Adapter、LoRA、提示微调、指令微调等方法。分析了各种微调技术的原理、特点和适用场景&#xff0c;解释了微调为何在大模型时代取代从零训练&#xff…