Cargando el módulo del kernel en el núcleo de Android

Estoy enumerando mi problema aquí.

Tengo un teléfono de Google Nexus aka "pasión" conmigo. Las herramientas Fastboot y adb se instalan en el teléfono. Y el cargador de arranque está desbloqueado.

Mi tarea: Tengo que añadir un módulo de kernel de linux al kernel de Android.

Que he hecho:

Seguí los pasos en http://source.android.com/source/initializing.html y descargé el kernel para android-2.3.6_r1 (pasión) y lo he construido. También soy capaz de flash en el teléfono y el nuevo núcleo de Android también funciona bien. Ahora lo que quiero es modificar el kernel y añadir mi propio módulo de kernel y luego flash en el teléfono, para que el núcleo en el teléfono es mi kernel modificado.

Ahora he encontrado dos enfoques para hacer esto.

1}

Cross Compile mi módulo del kernel con el núcleo de android y póngalo en el dispositivo con el comando adb. El Makefile que utilizo en el kernel es como sigue.

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 

Ahora esto no es capaz de generar nuevo hello-1.ko. No sé por qué, supongo que hay algún problema con los valores VERSION, PATCHLEVEL, SUBLEVEL y EXTRAVERSION. ¿Son necesarios? He intentado estos valores de android-2.3.6_r1 también pero todavía no funciona. No estoy seguro de qué es este valor EXTRAVERSION?

Incluso lo intenté con el hello-1.ko generado desde el compilador en mi ubuntu. Empujé este hello-1.ko en el emulador con el siguiente comando 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 

Pero que hola-1.ko no es capaz de insmod y me sale el siguiente error. Insmod: Error en la función init_module () hello-1.ko no implementada

Mientras que el hello-1.c es bastante simple:

 #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)

La segunda aproximación de hacer esto puede estar colocando mis archivos de fuente del módulo del kernel en el directorio del núcleo del androide. Puede estar en el directorio del sistema o en otro lugar y pedir a la marca para construir estos archivos de origen también junto con la otra fuente. Pero no estoy seguro de dónde pedir el proceso de hacer para hacerlo. Intenté hacerlo en main.mk y creé un archivo Android.mk en el directorio de origen de mis archivos de origen, pero no funcionó. Puede ser esta es una mejor solución, pero no pude encontrar ninguna ayuda en esto.

Después de hacer esto, mis módulos del kernel deben ser capaces de controlar el wnic (dispositivo de interfaz de red inalámbrica) del teléfono android. Debe ser capaz de poner el wnic en modo de reposo y luego despertarlo después de recibir el comando de mi módulo del kernel. Si usted tiene algunos consejos sobre cómo hacer esto, que será una ayuda. He encontrado que en Android se controla a través de wpa_supplicant controlador privado. Comandos, como:

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

Puede hacer mi tarea, pero no estoy seguro ya que no lo he intentado. No he llegado a esa etapa.

Por favor, mire esto y proporcione alguna ayuda / orientación.

Gracias,

Apurva

Los módulos del kernel (KO) son mucho más fáciles de trabajar que un kernel estático, siempre y cuando el núcleo los haya habilitado. La forma más fácil de decir es hacer una "shell adb lsmod". En segundo lugar es ver si el kernel .config ha habilitado CONFIG_MODULES = y y CONFIG_MODULE_UNLOAD = y. Mucha información en la web sobre el desarrollo de linux KO.

Hummm, estás cerca pero parece que el makefile es una locura. Primero intenta construir el hello KO en tu host para la prueba de unidad, luego construye en tu objetivo. He aquí un ejemplo de makefile que utilizo en un OMAP36xx ejecutando pan de jengibre:

 # 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 

Primero compruebe el archivo .config si el soporte del módulo está habilitado. (CONFIG_MODULES = y y CONFIG_MODULE_UNLOAD = y) si no los habilita usando menuconfig.

Luego coloque su módulo en la raíz de la fuente del kernel y agregue esto al makefile principal que encuentre en la raíz

 core-y := usr/ yourModule/ 

Y esto a las carpetas yourModule makefile

 obj-m := yourModule.o 
  • ¿Puedo programar radio en android?
  • AOSP y IntelliJ IDEA
  • AOSP Privileged vs System app
  • ¿Cómo generar automáticamente diff entre versiones de API?
  • Realizar cambios persistentes en init.rc
  • Estoy recibiendo error 'ko: inválido caché tipo de imagen de partición: yaffs2 (esperado ext4)' cuando se intentó lanzar android en el emulador de dispositivo mako?
  • La lógica subyacente del código nativo de la cámara
  • Modificación de la interfaz de usuario de la aplicación individual (teléfono, contactos) en ICS AOSP
  • Directorio de datos de usuario en Android 4.3
  • No se pudo analizar el archivo API "frameworks / base / api / current.txt"
  • No se puede generar la imagen de recuperación con AOSP 4.2.2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.