Я хочу сделать динамически загружаемый модуль ядра для Android. Линукс ставить не хочу, у меня только cygwin и андроид NDK.
Может ли Android NDK скомпилировать исходный код модуля ядра?
Ответы (3)
Только что я нашел этот URL, по которому пользователь пытался загрузка LKM прошла успешно, хотя и на Android (ядро ядра: 2.6.29), и я думаю, что это было на Linux, а не на Cygwin. Надеюсь, вы тоже получите!
Есть еще один ресурс здесь и здесь!.
Всего наилучшего!
Да, модули ядра можно собирать с помощью NDK. Обратите внимание, что это лучше всего работает с системой Linux (мне сказали, что Linux x86_64 является поддерживаемой средой), потому что сложнее кросс-компилировать код ядра в файловых системах, чувствительных к регистру (например, в системах Windows и Mac по умолчанию), и потому что для сборки модулей ядра требуется сборка бинарных файлов для манипулирования ELF (modpost), для которых требуются заголовки ELF, обычно присутствующие только в Linux. Это сказало...
Сначала вам нужно получить исходный код точно такого же ядра на вашем устройстве и убедиться, что конфигурация такая же, как у вашего устройства. (иначе есть шанс перепутать систему сборки)
Во-вторых, вам нужно определить, где в вашем Android NDK находится цепочка инструментов кросс-компилятора. Вот как я нашел свою:
$ cd $NDK_HOME
$ find . | grep '\-gcc$'
./toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc
./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
(обратите внимание, $NDK_HOME
— это место, где я установил Android NDK)
В-третьих, вам нужно добавить каталог $NDK_HOME/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin
(или где бы он ни находился в вашей системе) в переменную среды PATH.
Затем вам нужно экспортировать две переменные среды:
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
(обратите внимание, префикс arm-eabi-
такой же, как и в команде find
. Когда ядро собрано, такие команды, как gcc
и ld
, будут иметь этот префикс. нужно настроить их. Я собирал модули только для ARM.)
Далее следует скомпилировать ядро. (для этого я вытащил /proc/config.gz
со своего Android-устройства, запустил zcat config.gz > .config
в исходном каталоге ядра, а затем запустил make menuconfig && make
.) Гуру сборки ядра могут знать здесь некоторые ярлыки, но я не смог правильно настроить исходный каталог ядра. для создания модуля без фактической сборки. (Если ядро в вашем дереве сборки соответствует вашему устройству, вам не нужно обновлять ядро, вы можете просто вставить модули.)
Наконец, я использовал обычный процесс для сборки модулей ядра из исходного кода. Обычно модули ядра имеют параметризованную сборку, которая каким-то образом считывается из каталога исходного кода ядра, а затем вызывает сборку. На этом этапе, если дерево исходных текстов ядра настроено правильно и установлены ARCH
и CROSS_COMPILE
, ваш модуль должен собраться!
Удачи в этом. Я уверен, что есть некоторые различия для каждого устройства.
Перейдите по этому URL, разработчик Android предлагает перейти на виртуальный образ Ubuntu. для этого, чем cygwin.