Может ли Android NDK скомпилировать исходный код модуля ядра?

Я хочу сделать динамически загружаемый модуль ядра для Android. Линукс ставить не хочу, у меня только cygwin и андроид NDK.


person lovespring    schedule 01.02.2011    source источник
comment
Поскольку в Linux нет ABI ядра, вам нужно скомпилировать модуль для каждого отдельного ядра. .   -  person lovespring    schedule 05.02.2011
comment
Могу ли я загрузить LKM из приложения в корневом телефоне, чтобы мешать системным вызовам. Любые идеи?   -  person Dev.Sinto    schedule 18.01.2013


Ответы (3)


Только что я нашел этот URL, по которому пользователь пытался загрузка LKM прошла успешно, хотя и на Android (ядро ядра: 2.6.29), и я думаю, что это было на Linux, а не на Cygwin. Надеюсь, вы тоже получите!

Есть еще один ресурс здесь и здесь!.

Всего наилучшего!

person TheCottonSilk    schedule 02.02.2011

Да, модули ядра можно собирать с помощью 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, ваш модуль должен собраться!

Удачи в этом. Я уверен, что есть некоторые различия для каждого устройства.

person mpontillo    schedule 22.07.2011

Перейдите по этому URL, разработчик Android предлагает перейти на виртуальный образ Ubuntu. для этого, чем cygwin.

person TheCottonSilk    schedule 01.02.2011
comment
Нет, я не хочу компилировать андроид, просто новый модуль ядра. - person lovespring; 01.02.2011
comment
Извините, я пока не сталкивался с таким требованием. Поскольку у меня был весь исходный код, я просто добавил свои модули в соответствующие папки драйверов и получил свой собственный образ Android. - person TheCottonSilk; 02.02.2011