arm64的ioremap_今日面试题 / Linux操作寄存器前为什么要ioremap?

在Linux内核驱动开发中,ioremap用于将设备的物理地址映射为内核虚拟地址,以便安全访问硬件寄存器。不使用ioremap直接访问物理地址会导致内核崩溃。通过一个在Allwinner H3平台上进行的实验,展示了使用和不使用ioremap的不同结果,未使用ioremap时会触发内核错误。ioremap的实现涉及内存管理和页表修改,它在vmalloc区分配虚拟地址并映射到I/O地址空间,而不涉及物理内存分配。
摘要由CSDN通过智能技术生成

1. 原因这里只考虑有 MMU 的芯片,Linux 为了实现进程虚拟地址空间,在启用 MMU 后,在内核中操作的都是虚拟地址,内核访问不到物理地址。

如果在驱动里直接访问物理地址,等于访问了一个非法地址,会导致内核崩溃,下面会有一个相关的小实验。

通过 ioremap() 将物理地址映射为虚拟地址后,内核就能通过 ioremap() 返回的虚拟地址,以 虚拟地址->mmu页表映射-> 物理地址 的形式正确地访问到物理地址了。

ARM Linux 引入设备树特性后,一些支持设备树的设备驱动不再使用直接 ioremap(),改用 drivers/of/address.c/of_iomap(),of_iomap() 的内部仍然会调用 ioremap(),例如:

clk-rk3288.c (drivers\clk\rockchip)

static void rk3288_clk_init(struct device_node *np) {

rk3288_cru_base = of_iomap(np, 0);

[...]

}

2. ioremap() 实验

实验环境:Linux-4.14 + Allwinner/H3。

实验代码:

#include #include #include #include

#define USE_IOREMAP

#define H3_GPIO_BASE (0x01C20800)

static volatile unsigned long *gpio_regs = NULL;

static int __init

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值