Скомпилируйте модуль ядра Linux (2.6), включая заголовки, не относящиеся к ядру.

StackOverflow https://stackoverflow.com/questions/817487

Вопрос

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

Например:


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

Спасибо, Майк

Это было полезно?

Решение

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

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

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

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


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


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

Другие советы

Я взял фрагменты кода пользовательского пространства, которые я написал, и преобразовал их для работы в пространстве ядра (т.используя kmalloc() и т. д.), это не так уж и сложно.Однако вы ограничены пониманием C ядром, а не пользовательским пространством, которое немного отличается..особенно с различными стандартными типами int.

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

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

В случае с криптовалютой, как уже говорили другие, просто используйте то, что есть в ядре.Следует отметить одну вещь: вам нужно будет включить их в kconfig, что может произойти, а может и не произойти, в зависимости от того, что пользователь выбирает при его сборке.Итак, следите за зависимостями и будьте откровенны: возможно, вам придется взломать несколько записей в kconfig, которые также выбирают нужный вам криптографический API при выборе вашего модуля.Это может быть немного затруднительно при строительстве из дерева.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top