Компилировать модуль ядра Linux (2.6), включая заголовки без ядра - PullRequest
7 голосов
/ 03 мая 2009

Можно ли скомпилировать модуль ядра Linux (2.6), который включает в себя функции, определенные неядерным ядром?

Например:


kernelmodule.h

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>   // printk()
// ...
#include <openssl/sha.h>
// ...

Makefile

obj-m := kernelmodule.o
all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
    $(RM) Module.markers modules.order

Модуль ядра, который я написал и пытаюсь скомпилировать, содержит функциональность, обнаруженную в ряде включаемых файлов openssl.

Стандартный make-файл, представленный выше, не позволяет включать вне заголовков linux. Можно ли включить эту функцию, и если да, не могли бы вы указать мне правильное направление.

Спасибо, Mike

Ответы [ 2 ]

11 голосов
/ 04 мая 2009

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

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

Невозможно связать ядро ​​с библиотеками, предназначенными для использования в пространстве пользователя - даже если они не делают никаких вызовов ОС - потому что среда связывания в ядре не может их забрать.

Вместо этого перекомпилируйте любые функции, которые будут использоваться в ядре (при условии, что они не делают никаких вызовов ОС или библиотек - например, malloc - в этом случае их все равно придется модифицировать). Включите их в свою собственную библиотеку для использования в модулях ядра.


Последние версии linux в любом случае содержат криптографические функции, включая различные хэши SHA - возможно, вместо них вы можете использовать одну из них.


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

6 голосов
/ 04 мая 2009

Я взял кусочки кода пользовательского пространства, который я написал, и преобразовал его для работы в пространстве ядра (то есть с помощью kmalloc () и т. Д.), Это не так сложно. Тем не менее, вы ограничены пониманием ядра C, а не пользовательского пространства, которое немного отличается ... особенно с различными стандартными типами int.

Простое связывание с DSO пользовательского пространства невозможно - ядро ​​Linux является монолитным, полностью автономным. Он не использует пользовательское пространство libc, библиотеки или другие биты, как отметили другие.

9/10 раз, вы найдете то, что вам нужно где-то в ядре. Вполне вероятно, что кто-то еще столкнулся с той же потребностью, что и вы, и написал несколько статических функций в каком-то модуле, чтобы делать то, что вы хотите ... просто возьмите их и используйте их повторно.

В случае крипто, как уже говорили другие, просто используйте то, что находится в ядре. Стоит отметить, что вам нужно, чтобы они были включены в kconfig, что может происходить или не происходить в зависимости от того, что пользователь выбирает при его создании. Так что следите за зависимостями и будьте явными, вам, возможно, придется взломать несколько записей в kconfig, которые также выбирают крипто-API, который вы хотите, когда выбран ваш модуль. Делать это может быть немного больно, когда строишь из дерева.

Таким образом, с одной стороны, у нас есть «просто копировать и переименовывать материал, добавляя общий раздув», с другой - «скажите людям, что у них должен быть полный исходный код ядра». Это одна из причуд, которые идут с монолитным ядром.

С микроядром почти все работает в пользовательском пространстве, не нужно беспокоиться о подключении DSO для какого-то драйвера ... это не проблема. Пожалуйста, не принимайте это утверждение как сигнал для перезапуска философии проектирования ядра в комментариях, это не входит в сферу этого вопроса.

...