Чтобы добиться лучшей инкапсуляции и модульности, я решил разделить драйвер ядра на 2 (может быть больше) модуля, каждый из которых отвечает за разные функции.
Тем не менее, все еще есть некоторые данные + логика, которые я хотел бы разделить между этими модулями (т.е. один модуль может управлять связью с пользовательским пространством, а другой использует его в качестве посредника), и мне интересно, есть ли какой-нибудь простой способ сделать так.
Например, я хотел бы опубликовать некоторый API из одного модуля в другой, что абсолютно выполнимо, поскольку оба модуля работают в рамках процесса ядра и отображаются в разных диапазонах в одном и том же адресном пространстве.
Загвоздка в том, что каждый модуль ядра имеет свою собственную таблицу символов, и для публикации API необходим какой-то загрузчик для исправления адресации/указателей/и т. д. Это похоже на вызов dlopen
и dlsym
из пользовательского пространства при динамическом связывание с библиотекой, но в пространстве ядра и где каждая библиотека также имеет состояние (состояние, определяемое текущим моментальным снимком всех ее внутренних параметров кучи/глобальных).
Мой вопрос заключается в том, является ли этот подход действительным и принятым в сфере macOS?
РЕДАКТИРОВАТЬ, в следующем вопросе объясняется способ Linux для достижения моей цели , Возможно, вы знаете, что эквивалентно symbol_get
и symbol_put
в macOS/XNU?
modinfo
иnm -g
для подробностей. - person Lorinczy Zsigmond   schedule 12.12.2017