TLDR:是否可以将adresspace映射到内核模块中的函数调用?
与mmap相似。但是mmap用于用户空间,只有在访问下一页时才会调用函数。
+---+---+---+---+--------------------+
| | | | | |
+-------+---+---+--------------------+
|
+-------------------------------------------------+
|
+---------------------v----------------+
| void my_driver_function(int offset); |
+--------------------------------------+
编辑:
[在过去,我们有N个设备,它们由N个独立的设备驱动程序控制。存储器映射到某个位置的每个设备的每个寄存器。而且每个驱动程序都只是重新映射寄存器并直接控制硬件。
+----------------+ +--------------+ +------------+ +--------------+
| Driver A | | Driver B | | Driver C | | Driver E |
+----------------+ +--------------+ +------------+ +--------------+
|ioremap |ioremap |ioremap |ioremap
| | | |
+----+-----------+ +--------------+ +------------+ +--------------+
| Device A | | Device B | | Device C | | Device E |
| | | | | | | |
+----------------+ +--------------+ +------------+ +--------------+
在我们的新世界中,我们合并了设备硬件。但是驱动程序仍然是分开的。由于硬件限制,现在必须使对一台新设备的所有访问均处于互斥状态。现在还存在一些其他限制,这些限制是旧世界所不具备的(对齐,字节序,时序等)。但是由于驱动程序是独立的,因此他们不了解其他驱动程序中发生的代码或访问。因此,这导致违反此约束。
+----------------+ +--------------+ +------------+ +--------------+
| Driver A | | Driver B | | Driver C | | Driver E |
+----------------+ +--------------+ +------------+ +--------------+
|ioremap |ioremap |ioremap |ioremap
| | | |
+----+----------------------------------------+-----------------+---------+
| Device A/B/C/D/E |
| |
+-------------------------------------------------------------------------+
因为我们不想重新处理所有驱动程序。遍历所有代码并寻找我要指向的每个指向硬件寄存器的指针,以保护通过互斥锁进行的所有此类访问,我的想法是添加虚拟设备内存。这应该是一个存储区,每个访问都将路由到一个功能。然后,此功能将执行锁定和跟踪以及事物和对硬件的访问。
+----------------+ +--------------+ +------------+ +--------------+
| Driver A | | Driver B | | Driver C | | Driver E |
+----------------+ +--------------+ +------------+ +--------------+
|ioremap |ioremap |ioremap |ioremap
| | | |
+----+----------------------------------------+-----------------+---------+
| Virtual Device A/B/C/D/E |
| |
+----------------------+--------------------------------------------------+
|
|my_mapper_function(...)
| /* do (un)locking, check constraints, ... */
|
+----------------------+--------------------------------------------------+
| Device A/B/C/D/E |
| |
+-------------------------------------------------------------------------+
linux内核中是否存在一种机制,该机制允许将对每个访问的特定映射映射到通过功能路由的特定内存区域?与mmap相似,但实际上却大不相同,因为您无法将每个任意函数都挂接到mmap。此外,它不会通过此功能路由每个请求,而仅在请求越过页面边界时才会路由。
[我正在考虑使用UIO将驱动程序A / B / C ...移至UserSpace,并且所有这些驱动程序都使用相同的内核空间代码来控制所有相关设备。
User Space | Driver A | Driver B | Driver C |
|================================|
Kernel Space | KObject ABC |
|================================|
Hardware | Device A|B|C |