linux驱动里映射物理地址怎么查
linux驱动里映射物理地址怎么查详细介绍
在 Linux 驱动开发中,物理地址映射是访问硬件寄存器或设备内存的关键步骤。若要查询或验证物理地址的映射情况,可通过以下方法操作:
一、核心函数:ioremap
Linux 内核中,将物理地址映射到内核虚拟地址的核心函数是 ioremap,其原型为:
c
__iomem phys_addr size
phys_addr:待映射的物理地址(如硬件手册中给出的寄存器基址)。size:需要映射的物理地址空间大小(需与硬件实际占用空间匹配)。- 返回值:映射后的内核虚拟地址(类型为
__iomem,表示这是 I/O 内存,需通过readl/writel等函数访问)。
二、查询已映射的物理地址
若需查看系统中已映射的物理地址范围(包括驱动已申请的映射),可通过以下方式:
1. 查看
/proc/iomem 文件
/proc/iomem 是 Linux 系统记录物理内存资源分配的文件,包含各设备 / 驱动占用的物理地址范围。
操作示例:
bash
/proc/iomem
输出类似:
plaintext
40007000-40007fff : 50007000.gpio # 表示物理地址 0x40007000~0x40007fff 被 GPIO 驱动占用
2. 内核日志(
dmesg)
驱动在调用 ioremap 时,若映射成功或失败,通常会通过 printk 输出调试信息(需驱动开发者在代码中添加)。
示例日志:
plaintext
[ 123.456789] my_driver: ioremap success: phy=0x40007000, size=0x1000, virt=0xf8000000
三、验证映射是否成功
映射完成后,需验证虚拟地址是否可正常访问硬件寄存器,常用方法:
1. 读取 / 写入测试
通过 readl/writel 等函数操作映射后的虚拟地址,检查硬件响应是否符合预期。
c
__iomem virt_addrvirt_addr
KERN_ERR
ENOMEM
u32 reg_value virt_addr
virt_addr
2. 检查
virt_addr 是否为
NULL
ioremap 失败时返回 NULL,可通过判断返回值确认映射是否成功。
四、注意事项
- 映射范围:需确保
size不超过硬件实际占用的物理地址空间,避免与其他设备地址冲突。 - 及时释放:不再使用映射时,需调用
iounmap(virt_addr)释放虚拟地址,避免内存泄漏。 - 权限问题:物理地址需属于可映射的 I/O 内存区域(如硬件寄存器),普通 RAM 内存通常使用
kmap或vmalloc映射。
通过以上方法,可有效查询和验证 Linux 驱动中物理地址的映射情况。实际开发中需结合硬件手册、/proc/iomem 和驱动日志综合分析。