栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

编写设备驱动程序时linux中__iomem的用途是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

编写设备驱动程序时linux中__iomem的用途是什么?

许多类型强制转换只会“工作得很好”。但是,这不是很严格。没有什么可以阻止您将a强制转换

u32
为a
u32*
并取消对其的引用,但这并不遵循内核API,因此容易出错。

__iomem
是Sparse使用的cookie
,该工具用于在内核中查找可能的编码错误。如果您未在启用稀疏的情况下编译内核代码,
__iomem
则无论如何都会被忽略。

首先安装它,然后添加

C=1
到您的
make
通话中,以使用稀疏。例如,在构建模块时,请使用:

make -C $KPATH M=$PWD C=1 modules

__iomem
定义如下:

# define __iomem        __attribute__((noderef, address_space(2)))

__iomem
为所有I / O访问添加(并要求)cookie 是一种更严格的方法,可以避免编程错误。您不想使用具有绝对地址的I /
O内存区域进行读/写操作,因为您通常使用虚拟内存。从而,

void __iomem *ioremap(phys_addr_t offset, unsigned long size);

通常调用,以获取I /
O物理地址的虚拟地址

offset
,并
size
以字节为单位指定长度。
ioremap()
返回一个带有
__iomem
cookie 的指针,因此它
现在 可以与内联函​​数一起使用,例如
readl()
/
writel()
(尽管现在最好使用更明确的宏
ioread32()
/
iowrite32()
),这些函数接受
__iomem
地址。

同样,

noderef
稀疏使用该属性来确保您不取消引用
__iomem
指针。取消引用应该在I /
O确实是内存映射的某些体系结构上起作用,但是其他体系结构使用特殊的指令来访问I / O,在这种情况下,取消引用将不起作用。

让我们看一个例子:

void *io = ioremap(42, 4);

稀疏不开心:

warning: incorrect type in initializer (different address spaces)    expected void *io    got void [noderef] <asn:2>*

要么:

u32 __iomem* io = ioremap(42, 4);pr_info("%xn", *io);

稀疏也不高兴:

warning: dereference of noderef expression

在最后一个示例中,第一行是正确的,因为

ioremap()
将其值返回给
__iomem
变量。但是然后,我们尊重它,我们不应该这样做。

这使稀疏感到高兴:

void __iomem* io = ioremap(42, 4);pr_info("%xn", ioread32(io));

底线:请始终

__iomem
在需要的地方使用(作为返回类型或参数类型),并使用稀疏来确保已这样做。另外:不要取消引用
__iomem
指针。

编辑
:这是一篇有关LWN的起始

__iomem
和使用它的功能的LWN文章。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号