Скомпилируйте модуль ядра Linux (2.6), включая заголовки, не относящиеся к ядру.
-
03-07-2019 - |
Вопрос
Можно ли скомпилировать модуль ядра 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 для какого-либо драйвера...это не проблема.Пожалуйста, не воспринимайте это заявление как сигнал к возобновлению философии дизайна ядра в комментариях, это выходит за рамки этого вопроса.