0

Я хочу реализовать простой модуль, в котором используется метод ioctl(). В модуле ядра я использую макросы ядра, такие как _IO(), _IOWR() и т. Д., Чтобы определить мои собственные подкоманды ioctl. В действительности мне не нужны фактические значения этих определений, поскольку я всегда буду использовать эти макросы вместо фактических значений.Как разделить файлы заголовков между модулями ядра и приложениями пользовательского пространства.

Когда программисты в пользовательском пространстве хотят вызвать мою функцию ioctl(), они должны знать либо фактические значения, либо макроопределения таких подкоманд.

Я думаю, что в пользовательском пространстве это не будет , _IOWR() макроопределения, поэтому, как я могу экспортировать эти определения в пользовательское пространство для прикладных программистов.

+0

Проверьте содержимое папки 'include/uapi' в исходном дереве ядра Linux. – 0andriy

ответ

0

Макросы _IO и _IOWR (и пр.) Также доступны в заголовках пользовательского пространства. Определения могут быть втянуты как в исходное пространство ядра, так и в источник пользовательского пространства с помощью #including <linux/ioctl.h>.

Вы должны разделить ваши файлы заголовков ядра на две части: (a) те, которые нужны только для кода ядра - struct определения, объявления между исходными файлами, другие #includes или что-нибудь еще, что вам удобно включать туда которые не нужны пользовательскому пространству, и (б) те, которые определяют интерфейс между ядром и пользовательским пространством. Последний будет содержать определения _IO* и может также включать определения пользовательской структуры, используемые для передачи информации в ioctl с пользовательского пространства на ядро.

Тогда вам нужно будет организовать стратегию для совместного использования определяющего интерфейс файла заголовка между вашим ядром и кодом пользовательского пространства.