адрес карты памяти для вызова функции - PullRequest
0 голосов
/ 27 апреля 2020

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. Также он не будет направлять каждый запрос через эту функцию, но только если запрос пересекает границу страницы.

1 Ответ

1 голос
/ 28 апреля 2020

Я думаю о переносе драйвера A / B / C ... в UserSpace с помощью UIO, и все эти драйверы используют один и тот же код пространства ядра, который использовался для управления всеми связанными устройствами.

User Space    | Driver A | Driver B | Driver C |
              |================================|
Kernel Space  |           KObject ABC          |
              |================================|
Hardware      |          Device A|B|C          |
...