内核中访问物理寄存器

在内核编程中,由于不能直接使用物理地址,需要将物理寄存器地址映射到高1G的虚拟地址进行操作。通过ioremap函数将GPIO的物理基地址映射为虚拟地址,然后配合寄存器偏移进行读写。当完成操作后,使用iounmap释放映射。内核提供了一系列寄存器访问函数,驱动开发者应遵循这些函数进行寄存器操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有过裸板驱动程序编写经历的都清楚,在编写裸板驱动程序时我们是通过访问物理地址来操作寄存器的。但是在内核中根本不可能使用物理地址,只可以使用4G虚拟地址的高1G。这就需要我们把物理地址映射到虚拟地址。

下面是一个例子:

#include <linux/ioport.h>//io端口头文件

//GPIO物理基地址和偏移

#define GPIO+BASE 0x7F008000

#define GPIO_SIZE 0x28c

/* 将物理地址转换为虚拟地址(一定在3G以上的内核空间) */
void __iomem *vir_base;
vir_base = ioremap(GPIO_BASE, GPIO_SIZE);
if (!vir_base)
    return -EIO;
...
/* 使用虚拟基地址和寄存器偏移,来访问物理寄存器 */
...

/* 释放虚拟地址的映射 */
iounmap(vir_base);


(2)寄存器的访问函数
内核根据寄存器的宽度,定义了一系列寄存器的访问函数,要求驱动开发人员使用:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值