Con*_* Li 5 linux pci memory io linux-kernel
我目前正在为 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 社区发布了这个,希望我没有违反任何规则。
我建议你看看LDD3 书,它是免费的。它确实在第 9 章第 249 页解释了 ioremap。另请参阅 APIU 3rd edition,第 14.8 章,第 525 页。让我总结一下,尽我所能:
ioremap是一个内核函数,它允许通过称为 I/O 映射内存的机制访问硬件。内存中的某些地址被 CPU 和 RAM 之间的主板截获并重定向到其他硬件,如磁盘或键盘。不确定您是否可以通过指针或其他一些内核函数使用通常的寻址。
I/O 内存只是一个类似于 RAM 的位置区域,设备通过总线提供给处理器。该存储器可用于多种用途,例如保存视频数据或以太网数据包,以及实现行为类似于 I/O 端口的设备寄存器(即,它们具有与读取和写入相关联的副作用)。
mmap是用户空间中可用的系统调用,它将进程内存区域映射到文件的内容,而不是 RAM。当您访问内存的映射区域时,通过通常的指针取消引用,内核将其转换为文件操作。基本上写入内存变成写入文件。这只是一种更奇特的方式来调用 write()。
内存映射 I/O 允许我们将磁盘上的文件映射到内存中的缓冲区,这样当我们从缓冲区获取字节时,文件的相应字节将被读取。同样,当我们在缓冲区中存储数据时,相应的字节也会自动写入文件。这让我们可以在不使用读或写的情况下执行 I/O。
(旁注)我认为第一个称为“IO 映射内存”,第二个称为“内存映射 IO”。难怪你一头雾水。
| 归档时间: |
|
| 查看次数: |
12930 次 |
| 最近记录: |