[Linux外设驱动详解]7. 内存管理与 I/O 访问

7. 内存管理与 I/O 访问

基于 Linux 内核源码分析 | 硬件平台:瑞芯微 RK3588 (ARM64)


目录

  • 7.1 ioremap / iounmap
  • 7.2 readl/writel 等寄存器访问宏
  • 7.3 DMA 缓冲区分配
  • 7.4 内存屏障简介

7.1 ioremap / iounmap

7.1.1 概述

在 Linux 驱动开发中,硬件设备的寄存器通常位于物理地址空间。内核代码使用的是虚拟地址,因此需要一种机制将物理地址映射到内核虚拟地址空间。ioremap就是为此而设计的接口。

核心源码位置:

  • ARM64 架构实现:kernel/arch/arm64/mm/ioremap.c
  • 通用页表映射:kernel/mm/ioremap.c
  • 接口定义:kernel/arch/arm64/include/asm/io.h

7.1.2 ioremap 映射流程

地址无效

有效

是 RAM

非 RAM

失败

成功

驱动调用 ioremap

ioremap phys_addr size

__ioremap_caller
设置 PROT_DEVICE_nGnRE 属性

参数检查

返回 NULL

页对齐处理

是否为 RAM 区域?

返回 NULL
禁止映射 RAM

get_vm_area_caller
分配虚拟地址空间

ioremap_page_range
建立页表映射

映射成功?

vunmap 释放资源

返回虚拟地址

7.1.3 核心实现分析

__ioremap_caller 函数

源码位置:kernel/arch/arm64/mm/ioremap.c:21-63

staticvoid__iomem*__ioremap_caller(phys_addr_tphys_addr,size_tsize,pgprot_tprot,void*caller){unsignedlonglast_addr;unsignedlongoffset=phys_addr&~PAGE_MASK;interr;unsignedlongaddr;structvm_struct*area;/* 1. 页对齐处理 */phys_addr&=PAGE_MASK;size=PAGE_ALIGN(size+offset);/* 2. 检查地址范围有效性 */last_addr=phys_addr+size-1;if(!size||last_addr<phys_addr||(last_addr&~PHYS_MASK))returnNULL;/* 3. 禁止映射 RAM 区域 */if(WARN_ON(pfn_valid(__phys_to_pfn(phys_addr))))returnNULL;/* 4. 分配内核虚拟地址空间 */area=get_vm_area_caller(size,VM_IOREMAP,caller);if(!area)returnNULL;addr=(unsignedlong)area->addr;area->phys_addr=phys_addr;/* 5. 建立页表映射 */err=ioremap_page_range(addr,addr+size,phys_addr,prot);if(err){vunmap((void*)addr);returnNULL;}/* 6. 返回带偏移的虚拟地址 */return(void__iomem*)(offset+addr);}
ioremap_page_range 页表建立

源码位置:kernel/mm/ioremap.c:222-250

页表层级遍历:

PGD (Page Global Directory) ↓ P4D (Page 4th Directory) ↓ PUD (Page Upper Directory) ↓ PMD (Page Middle Directory) ↓ PTE (Page Table Entry) → 物理页面

支持巨页映射优化:

页表级别映射粒度条件
P4D 级别512GB地址和大小都要 512GB 对齐
PUD 级别1GB地址和大小都要 1GB 对齐
PMD 级别2MB地址和大小都要 2MB 对齐
PTE 级别4KB常规页面映射

7.1.4 内存类型属性

源码位置:kernel/arch/arm64/include/asm/pgtable-prot.h:55-60

ARM64 定义了多种设备内存属性:

/* 设备内存属性 - 不可缓存 */#definePROT_DEVICE_nGnRnE/* non-Gathering, non-Reordering, No Early acknowledge */#definePROT_DEVICE_nGnRE/* non-Gathering, non-Reordering, Early acknowledge *//* 正常内存属性 */#definePROT_NORMAL_NC/* Normal Non-Cacheable */#definePROT_NORMAL/* Normal Cacheable */
属性缩写含义说明
nGnon-Gathering读写操作不会合并
nRnon-Reordering读写操作不会重排序
RnERead No Early读操作不提前返回
REEarly写操作可提前返回确认
NCNon-Cacheable不使用缓存

常用 ioremap 变体:

/* 标准 ioremap - 设备内存,不可缓存 */void__iomem*ioremap(phys_addr_taddr,size_tsize);/* 写合并模式 - 正常非缓存内存 */void__iomem*ioremap_wc(phys_addr_taddr,size_tsize);/* 可缓存模式 - 用于正常 RAM 区域 */void__iomem*ioremap_cache(phys_addr_taddr,size_tsize);/* PCI 配置空间 - nGnRnE 属性 */void__iomem*pci_remap_cfgspace(phys_addr_taddr,size_tsize);

7.1.5 iounmap 解除映射

源码位置:kernel/arch/arm64/mm/ioremap.c:72-83

voidiounmap(volatilevoid__iomem*io_addr){unsignedlongaddr=(unsignedlong)io_addr&PAGE_MASK;/* * 某些情况下(如 ioremap_cache 复用 RAM 映射), * 地址可能不在 vmalloc 范围内,需要检查。 */if(is_vmalloc_addr((void*)addr))vunmap((void*)addr);}

7.1.6 使用示例

/* 假设 RK3588 GPIO 控制器物理基址为 0xFD820000 */#defineGPIO_BASE_PHYS0xFD820000void__iomem*gpio_base;/* 1. 映射设备寄存器 */gpio_base=ioremap(GPIO_BASE_PHYS,0x1000);if(!gpio_base){pr_err("Failed to ioremap GPIO registers\n");return-ENOMEM;}/* 2. 访问寄存器 */u32 value=

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

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

相关文章

【光学】基于matlab FLASH核进行投影k空间MRI采集的二维布洛赫模拟【含Matlab源码 14902期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

RPG Maker资源提取终极秘籍:轻松解锁游戏素材宝库

RPG Maker资源提取终极秘籍&#xff1a;轻松解锁游戏素材宝库 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://gitcode.com…

ReactPage页面编辑器:从内容创作到专业演示文稿的完整指南

ReactPage页面编辑器&#xff1a;从内容创作到专业演示文稿的完整指南 【免费下载链接】react-page 项目地址: https://gitcode.com/gh_mirrors/ed/editor ReactPage是一个功能强大的React页面编辑器&#xff0c;它让开发者能够轻松创建复杂的页面内容并转换为专业演示…

3.42 Pulp工具实战:Python线性规划求解器,5分钟上手运筹优化

3.42 Pulp工具实战:Python线性规划求解器,5分钟上手运筹优化 引言 PuLP是Python的线性规划求解器,简单易用。本文将演示如何使用PuLP解决优化问题。 一、PuLP安装 1.1 安装方法 # PuLP安装 # pip install pulp print("安装命令: pip install pulp")二、基础使…

小米运动智能刷步神器:轻松同步微信支付宝步数全攻略

小米运动智能刷步神器&#xff1a;轻松同步微信支付宝步数全攻略 【免费下载链接】mimotion 小米运动刷步数&#xff08;微信支付宝&#xff09;支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 还在为每天运动步数太少而发愁吗&#xff1f;想不想…

【光学】FLASH核进行投影k空间MRI采集的二维布洛赫模拟【含Matlab源码 14902期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

[Linux外设驱动详解]8. GPIO子系统

8. GPIO子系统 8.1 概述 GPIO(General Purpose Input/Output,通用输入输出)是嵌入式系统中最基础、最常用的外设接口之一。Linux 内核通过 GPIO 子系统为驱动开发者提供了一套统一的 API,屏蔽了不同 SoC 硬件实现的差异。 什么是 GPIO? 简单来说,GPIO 就是芯片引脚的软…

【电动机】液压伺服电动机的状态空间设计与仿真【含Matlab源码 14900期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

工作流自动化方法论:从业务流程优化到零代码配置实战

工作流自动化方法论&#xff1a;从业务流程优化到零代码配置实战 【免费下载链接】n8n n8n 是一个工作流自动化平台&#xff0c;它结合了代码的灵活性和无代码的高效性。支持 400 集成、原生 AI 功能以及公平开源许可&#xff0c;n8n 能让你在完全掌控数据和部署的前提下&#…

导师严选8个论文写作工具,一键生成论文工具推荐!

导师严选8个论文写作工具&#xff0c;一键生成论文工具推荐&#xff01; AI 工具如何助力论文写作&#xff1f; 在研究生阶段&#xff0c;论文写作是一项既重要又充满挑战的任务。随着人工智能技术的不断发展&#xff0c;越来越多的 AI 工具被应用于学术写作中&#xff0c;帮助…

【API渗透】crAPI 靶场的环境搭建与漏洞复现详解

目录 环境搭建 漏洞复现 挑战1:找到泄露其它用户敏感信息的API接口 挑战2:找到泄露视频内部属性的API接口 挑战3:访问其它用户车辆的详细信息 挑战4:访问其它用户的机械报告 挑战5:重置其它用户的密码 挑战6:删除另一个用户的视频 挑战7:免费获得一件物品 挑战…

2026必备!8个AI论文写作软件,专科生搞定毕业论文+格式规范!

2026必备&#xff01;8个AI论文写作软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI工具助力论文写作&#xff0c;专科生也能轻松应对 随着人工智能技术的不断进步&#xff0c;越来越多的AI工具开始进入学术领域&#xff0c;为学生提供高效、便捷的写作支持。尤其是…

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习 引言 工业缺陷检测是视觉算法的重要应用,本文通过实战案例演示从图像处理到深度学习的完整流程。 一、缺陷检测概述 1.1 任务定义 # 缺陷检测任务 def defect_detection_task():"""缺陷检…

2026 中专大数据管理与应用专业证书含金量怎么样?

在数字化浪潮席卷各行各业的2026年&#xff0c;“大数据”已从一个前沿概念&#xff0c;沉淀为驱动产业升级的日常燃料。对于即将毕业或刚刚步入职场的中专大数据管理与应用专业学子而言&#xff0c;你们正站在一个充满机遇的十字路口&#xff1a;专业背景赋予了你们进入赛道的…

3.43 Google OR-Tools详解:企业级运筹优化工具,功能强大的规划求解器

3.43 Google OR-Tools详解:企业级运筹优化工具,功能强大的规划求解器 引言 OR-Tools是Google开发的企业级运筹优化工具,功能强大。本文将深入解析OR-Tools的使用方法。 一、OR-Tools概述 1.1 工具特点 # OR-Tools概述 def ortools_overview():"""OR-Too…

DOL-CHS-MODS汉化美化包:终极配置方案与使用指南

DOL-CHS-MODS汉化美化包&#xff1a;终极配置方案与使用指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 想要获得完美的Degrees of Lewdity中文游戏体验吗&#xff1f;DOL-CHS-MODS整合包为您提…

5个实战级n8n工作流:解决企业自动化核心痛点

5个实战级n8n工作流&#xff1a;解决企业自动化核心痛点 【免费下载链接】n8n n8n 是一个工作流自动化平台&#xff0c;它结合了代码的灵活性和无代码的高效性。支持 400 集成、原生 AI 功能以及公平开源许可&#xff0c;n8n 能让你在完全掌控数据和部署的前提下&#xff0c;构…

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码 引言 相机标定和角点检测是工业视觉的基础技术。本文将深入解析这些技术的原理和实现。 一、相机标定 1.1 标定原理 相机标定用于确定相机的内参和外参。 # 相机标定 import cv2 import numpy as npdef camera_…

数字签名伪装:安全边界的重新定义

数字签名伪装&#xff1a;安全边界的重新定义 【免费下载链接】Sign-Sacker 项目地址: https://gitcode.com/gh_mirrors/si/Sign-Sacker 想象这样一个场景&#xff1a;一个看似普通的可执行文件&#xff0c;却拥有微软官方签名的"身份证"。这不是天方夜谭&am…

2026 大专计算机专业证书含金量对比怎么样?

进入2026年&#xff0c;数字化与智能化已如水银泻地般渗透至各行各业。对于即将踏入职场的大专计算机专业学子而言&#xff0c;你们掌握着这个时代最基础、也最具可塑性的工具技能。然而&#xff0c;一个不容忽视的现实是&#xff1a;人才供给的“规模化”与技术需求的“专精化…