Подтвердить что ты не робот

Загрузка модуля ядра в ядро ​​Android

Я перечислю свою проблему здесь.

У меня есть телефон Google Nexus one a.k.a. "страсть" со мной. В телефоне установлены инструменты Fastboot и adb. И загрузчик разблокирован.

Моя задача: я должен добавить модуль ядра Linux в ядро ​​Android.

Что я сделал:

Я выполнил шаги http://source.android.com/source/initializing.html и загрузил ядро ​​для android-2.3.6_r1 (страсть) и создал его. Я также могу запустить его на телефоне, и новое ядро ​​Android отлично работает. Теперь я хочу изменить ядро ​​и добавить свой собственный модуль ядра, а затем запустить его на телефоне, чтобы ядро ​​на телефоне было моим модифицированным ядром.

Теперь у меня есть два подхода, чтобы сделать это.

1)

Перекрестите мой модуль ядра с ядром Android и нажмите его на устройстве с помощью команды adb. Файл Makefile, который я использую в ядре, выглядит следующим образом.

VERSION = 2
PATCHLEVEL = 3
SUBLEVEL = 6
EXTRAVERSION = -00054-g5f01537
obj-m += hello-1.o
KDIR=/home/apurva/android_dir
PWD := $(shell pwd)
all:
        make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-    x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) modules

clean:
        make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) clean

Теперь это не может генерировать новый привет-1.ko. Я не знаю, почему, я думаю, есть некоторые проблемы с значениями VERSION, PATCHLEVEL, SUBLEVEL и EXTRAVERSION. Необходимы ли они? Я также пробовал эти значения с android-2.3.6_r1, но все же он не работает. Я не уверен, что это за значение EXTRAVERSION?

Я даже попытался использовать hello-1.ko, сгенерированный компилятором в моем ubuntu. Я нажал этот привет-1.ko в эмулятор со следующей командой adb.

/root/bin/src/out/host/linux-x86/bin/adb shell mount
/root/bin/src/out/host/linux-x86/bin/adb push hello-1.ko /data
/root/bin/src/out/host/linux-x86/bin/adb insmod /data/hello-1.ko

Но этот hello-1.ko не может вставлять insmod, и я получаю следующую ошибку. insmod: Ошибка в init_module() Функция hello-1.ko не реализована

В то время как hello-1.c довольно прост:

#include <linux/module.h>       /* Needed by all modules */
#include <linux/kernel.h>       /* Needed for KERN_INFO */

int init_module(void)
{
        printk(KERN_INFO "Hello world 1.\n");
        return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}

2)

Вторым подходом к этому может быть размещение исходных файлов модуля ядра в каталоге ядра android. Может быть в системном каталоге или в другом месте и попросить make создать эти исходные файлы вместе с другим источником. Но я не уверен, где спросить процесс make сделать это. Я попытался сделать это в main.mk и создал файл Android.mk в исходном каталоге исходных файлов, но это не сработало. Может быть, это лучшее решение, но я не мог найти никакой помощи в этом.

После этого мои модули ядра должны иметь возможность управлять wnic (устройством беспроводной сети) телефона Android. Он должен иметь возможность включить wnic в спящий режим, а затем разбудить его после получения команды из моего модуля ядра. Если у вас есть указатели на то, как это сделать, это поможет. Я обнаружил, что на Android он контролируется через частный драйвер wpa_supplicant. Команды, например:

wpa_cli driver powermode 0 - auto 
wpa_cli driver powermode 1 - active

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

Пожалуйста, ознакомьтесь с этим и дайте некоторую помощь/руководство.

Спасибо,

Апурва

4b9b3361

Ответ 1

Модули ядра (KO) намного легче работать, чем статическое ядро ​​- до тех пор, пока ядро ​​их разрешило. Самый простой способ рассказать - это "adb shell lsmod". Во-вторых, чтобы убедиться, что ядро ​​.config разрешило CONFIG_MODULES = y и CONFIG_MODULE_UNLOAD = y. Много информации в Интернете о развитии Linux-бизнеса.

Hummm, вы близки, но похоже, что makefile вяло. Сначала попробуйте создать привет KO на вашем хосте для unit test, а затем постройте свою цель. Вот пример makefile, который я использую на OMAP36xx, работающем пряниками:

# Makefile for trivial android kernel module

obj-m += mod_hello.o

CROSS_COMPILE=/opt/distros/ARM/bin/arm-none-linux-gnueabi-
TARG_KDIR ?= /opt/android/dal/nook_kernel

HOST_KDIR=/lib/modules/$(shell uname -r)/build

# target creates:
#  .<obj>.o: CC command line for the .o, including dependencies
#  .<obj>.mod.o.cmd: CC command line for the mod.o, including dependencies
#  .<obj>.ko.cmd: LD command line which links the .o and .mod.o to create the .ko
target:
    @echo "Make module for target arm"
    make -C $(TARG_KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules

host:
    @echo "Make module for host"
    make -C $(HOST_KDIR) M=$(PWD) modules

clean:
    @echo "cleaning target"
    make -C $(TARG_KDIR) M=$(PWD) clean
    @echo "cleaning host"
    make -C $(HOST_KDIR) M=$(PWD) clean

Ответ 2

Сначала проверьте .config, если поддержка модуля включена. (CONFIG_MODULES = y и CONFIG_MODULE_UNLOAD = y), если не включить их с помощью menuconfig.

Затем поместите ваш модуль в корневой каталог источника ядра и добавьте его в основной файл makefile, который вы найдете в корневом каталоге

core-y      := usr/ yourModule/

а это - в makefile файла yourModule

obj-m := yourModule.o