当前位置: 首页 > 面试题库 >

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

戈建白
2023-03-14
问题内容

我已经看到它__iomem用于存储的返回类型ioremap(),但是我已经u32在ARM体系结构中使用了它,并且效果很好。

那么,这有什么不同__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()返回一个带有__iomemcookie 的指针,因此它
现在 可以与内联函​​数一起使用,例如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("%x\n", *io);

稀疏也不高兴:

warning: dereference of noderef expression

在最后一个示例中,第一行是正确的,因为ioremap()将其值返回给__iomem变量。但是然后,我们尊重它,我们不应该这样做。

这使稀疏感到高兴:

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

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

编辑
:这是一篇有关LWN的起始__iomem和使用它的功能的LWN文章。



 类似资料:
  • 问题内容: 我需要从头开始为omap4编写SPI Linux字符设备驱动程序。我知道编写设备驱动程序的一些基础知识。但是,我不知道如何从头开始编写平台特定的设备驱动程序。 我已经编写了一些基本的char驱动程序,并且我认为编写SPI设备驱动程序将与此类似。Char驱动程序的结构包含在驱动程序中实现的功能。 现在,我将以spi-omap2-mcspi.c代码作为参考,以获取从零开始开发SPI驱动程序

  • 问题内容: 介绍 我听说过一些有关用Java编写设备驱动程序的信息(听说是“用我的耳朵”,而不是通过互联网),我想知道…我一直认为设备驱动程序在操作系统级别上运行,因此必须以相同的语言编写作为操作系统(因此大多是CI假设) 问题 我通常会对此假设有误吗?(看起来是这样) OS中如何使用“外来”语言的驱动程序? 无论如何(从编程语言的角度)对设备驱动程序有什么要求? 谢谢阅读 问题答案: 有两种方法

  • 问题内容: 谁能解释我, 什么啊 这有什么用途? 如何使用? 为什么我不能定义与之功能相同的新功能? 问题答案: 一个,表示“输入- 输出控制”是一种特定于设备的系统调用。Linux(300-400)中只有几个系统调用,不足以表示设备可能具有的所有独特功能。因此,驱动程序可以定义一个ioctl,它允许用户空间应用程序向其发送订单。但是,ioctl并不是很灵活,并且会变得有些混乱(数十个“魔术数字”

  • 问题内容: 如何使用打开,关闭,ioctl等功能为i2c设备制作字符设备?最近两周我一直在寻找有关它的信息,找不到任何有效的方法。我在Essential LinuxDevice Drivers中找到了一些信息,但是它是针对2.6内核编写的,我使用3.4.79(我正尝试在cubian distr上为cubieboard2编写此驱动程序),因此本书有许多不推荐使用的功能,我试图在那里写我的驱动程序,但

  • 9.1. 简介 本章简要介绍了如何为FreeBSD编写设备驱动程序。术语设备在 这儿的上下文中多用于指代系统中硬件相关的东西,如磁盘,打印机, 图形显式器及其键盘。设备驱动程序是操作系统中用于控制特定设备的 软件组件。也有所谓的伪设备,即设备驱动程序用软件模拟设备的行为, 而没有特定的底层硬件。设备驱动程序可以被静态地编译进系统,或者 通过动态内核链接工具‘kld’在需要时加载。 类UNIX®操作

  • 问题内容: 之前我曾假设: 平台驱动程序适用于片上设备。 普通设备驱动程序用于与处理器芯片接口的设备。 在遇到一个i2c驱动程序之前…但是在这里,我正在阅读定义为平台驱动程序的多功能i2c驱动程序。我经历了https://www.kernel.org/doc/Documentation/driver- model/platform.txt 。但是对于如何定义驱动程序(如片上和接口设备),仍然没有一