I / O内存区域的主要原因是对该内存进行读/写任何操作。 如果给出寄存器地址,我们可以使用readx / writex(x代表b / l / w)。
那么为什么我们必须使用io_remap返回的地址,该地址与数据表中给出的特定寄存器的地址相同?
答案 0 :(得分:0)
request_mem_region
返回的内容是struct resource *
,您不使用它来访问I / O内存,除了检查它之外,您不必对它做任何事情。为NULL
。 request_mem_region
不是您访问I / O所需的映射的一部分,并且您的驱动程序实际上(可能)可以在没有它的情况下工作,但通过调用它,您可以在内核数据结构中提供一些信息,以及确保两个驱动程序没有尝试使用重叠的内存范围。
答案 1 :(得分:0)
ioremap
是特定于体系结构的函数/宏。在某些体系结构上,它不会做任何事情,只是基本上返回指定为参数的地址。但是,它可能比其他架构做得更多。以arm或x86为例 - ioremap
会在让你使用内存区域之前做很多检查。
比这些检查更重要的是,ioremap
可以设置虚拟地址(从vmalloc
区域)到请求的物理映射的映射,并确保禁用缓存对于您要使用的地址。因此,在大多数情况下,ioremap
返回的指针与数据表中的数字地址不同。
您希望禁用缓存,因为I / O寄存器由某些外部(从CPU角度来看)设备控制。这意味着处理器无法知道其内容何时发生更改,从而使缓存内容无效。