I / O内存区域重新映射

时间:2014-04-14 13:58:52

标签: c memory-management linux-device-driver uart

I / O内存区域的主要原因是对该内存进行读/写任何操作。 如果给出寄存器地址,我们可以使用readx / writex(x代表b / l / w)。

那么为什么我们必须使用io_remap返回的地址,该地址与数据表中给出的特定寄存器的地址相同?

2 个答案:

答案 0 :(得分:0)

request_mem_region返回的内容是struct resource *,您不使用它来访问I / O内存,除了检查它之外,您不必对它做任何事情。为NULLrequest_mem_region不是您访问I / O所需的映射的一部分,并且您的驱动程序实际上(可能)可以在没有它的情况下工作,但通过调用它,您可以在内核数据结构中提供一些信息,以及确保两个驱动程序没有尝试使用重叠的内存范围。

答案 1 :(得分:0)

ioremap是特定于体系结构的函数/宏。在某些体系结构上,它不会做任何事情,只是基本上返回指定为参数的地址。但是,它可能比其他架构做得更多。以arm或x86为例 - ioremap会在让你使用内存区域之前做很多检查。

比这些检查更重要的是,ioremap可以设置虚拟地址(从vmalloc区域)到请求的物理映射的映射,并确保禁用缓存对于您要使用的地址。因此,在大多数情况下,ioremap返回的指针与数据表中的数字地址不同。

您希望禁用缓存,因为I / O寄存器由某些外部(从CPU角度来看)设备控制。这意味着处理器无法知道其内容何时发生更改,从而使缓存内容无效。