TLDR: возможно ли отобразить адресное пространство на вызов функции в модуле ядра?
Так похоже на 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 |
| |
+-------------------------------------------------------------------------+
идея
, потому что мы не хотим переделывать все драйверы. go просматривая весь код и ища каждый указатель, который я указываю на аппаратный регистр для защиты всех этих обращений мьютексами, моя идея состояла в том, чтобы добавить память виртуального устройства . Это должна быть область памяти, в которой каждый доступ будет перенаправлен на функцию. Затем эта функция будет выполнять блокировку и отслеживание, а также доступ к оборудованию.
+----------------+ +--------------+ +------------+ +--------------+
| 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, который позволяет отображать каждый доступ в конкретную область памяти c, которая будет направлена через функцию? Подобно тому, что делает mmap, но на самом деле совсем другое, потому что вы не можете подключить каждую произвольную функцию к mmap. Также он не будет направлять каждый запрос через эту функцию, но только если запрос пересекает границу страницы.