![ioremap和文件操作mmap有什么区别?](https://linux22.com/image/76144/ioremap%E5%92%8C%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9Cmmap%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我目前正在为 Ubuntu 开发 PCI 设备驱动程序。我有一些关于 PCI 驱动程序的示例代码,但我很难理解 ioremap 和 file_operation.mmap。
文件操作mmap说明:
内存映射是现代 Unix 系统最有趣的功能之一。就驱动程序而言,可以实现内存映射,为用户程序提供对设备内存的直接访问。映射设备意味着将一系列用户空间地址与设备内存相关联。每当程序在指定的地址范围内读取或写入时,它实际上是在访问设备。
ioremap的说明:
在许多系统上,I/O 内存根本无法通过这种方式直接访问。因此必须首先建立映射。这就是ioremap函数的作用。该函数是专门为I/O内存区域分配虚拟地址而设计的。
以上描述均来自“makelinux”。但我仍然不确定我是否正确理解了这两个函数之间的区别。目前,我是这样理解的:(fops.mmap
文件操作 mmap)将一系列用户空间地址与设备内存相关联。这意味着对于 PCI 设备,我们BAR
使用fops.mmap
.通过ioremap
,我们为从 获得的这些“真实地址”进行虚拟地址映射fops.mmap
。
有人可以告诉我我是否错了?谢谢~
附言。我也在 Ubuntu 社区发布了这个,希望我没有违反任何规则。
答案1
我建议你看看LDD3 书, 这是免费的。它在第 9 章第 249 页中解释了 ioremap。另请参阅APIU第三版,第 14.8 章,第 525 页。让我尽我所能总结一下:
映射是一个内核函数,允许通过称为 I/O 映射内存的机制访问硬件。内存中的某些地址会被主板在 CPU 和 RAM 之间截取并重定向到其他硬件,例如磁盘或键盘。不确定是否可以通过指针或其他一些内核函数使用通常的寻址。
I/O 内存只是一个类似于 RAM 的位置区域,设备通过总线向处理器提供该区域。该存储器可用于多种用途,例如保存视频数据或以太网数据包,以及实现与 I/O 端口类似的设备寄存器(即,它们具有与读写相关的副作用)。
映射是用户空间中可用的系统调用,它将进程内存区域映射到文件内容,而不是 RAM。当您访问内存的映射区域时,通过通常的指针取消引用,内核将其转换为文件操作。本质上写入内存就是写入文件。这只是调用 write() 的一种更奇特的方式。
内存映射 I/O 允许我们将磁盘上的文件映射到内存中的缓冲区,这样,当我们从缓冲区获取字节时,就会读取文件的相应字节。同样,当我们在缓冲区中存储数据时,相应的字节会自动写入文件中。这让我们可以在不使用读或写的情况下执行 I/O。
(边注)我认为第一个称为“IO映射内存”,第二个称为“内存映射IO”。难怪你会感到困惑。
答案2
用户空间内存访问仅限于用户空间地址。除了将文件映射到内存之外,mmap 还可用于访问物理内存,例如 IO 寄存器。您需要超级用户打开“/dev/mem”,然后使用 mmap 来映射所需的物理内存区域。然后就可以读写IO寄存器了。在大多数系统上,要映射的物理地址应该位于页边界上。