news 2026/9/2 20:37:01

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[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=
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 1:30:39

MLIR模型编译加速实战

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 MLIR模型编译加速实战&#xff1a;解锁高效AI部署的编译引擎目录MLIR模型编译加速实战&#xff1a;解锁高效AI部署的编译引擎 引言&#xff1a;编译优化——AI落地的隐形瓶颈 维度一&am…

作者头像 李华
网站建设 2026/9/2 7:32:33

3.36 FasterRCNN算法详解:RPN网络,两阶段检测的巅峰之作

3.36 FasterRCNN算法详解:RPN网络,两阶段检测的巅峰之作 引言 Faster R-CNN是两阶段检测的巅峰之作,通过RPN网络实现端到端训练。本文将深入解析Faster R-CNN的架构。 一、Faster R-CNN架构 1.1 整体架构 Faster R-CNN = RPN + Fast R-CNN # Faster R-CNN架构 def fas…

作者头像 李华
网站建设 2026/9/1 23:13:21

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

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

作者头像 李华
网站建设 2026/9/2 21:55:26

《核心指南详解!提示工程架构师详解Agentic AI伦理道德核心指南》

《核心指南详解!提示工程架构师详解Agentic AI伦理道德核心指南》 元数据框架 标题:核心指南详解!提示工程架构师详解Agentic AI伦理道德核心指南 关键词:Agentic AI、伦理道德、提示工程、价值对齐、AI治理、道德决策框架、负责任AI 摘要:当AI从“工具”进化为“自主智能…

作者头像 李华
网站建设 2026/9/2 21:55:23

AO3镜像站终极指南:三步解锁同人创作宝库

AO3镜像站终极指南&#xff1a;三步解锁同人创作宝库 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site AO3镜像站是专为国内同人爱好者设计的开源解决方案&#xff0c;通过智能同步技术让用户稳定访问全球最大的同人作品…

作者头像 李华