여기에 내 문제를 나열하고 있습니다.Android 커널에서 커널 모듈로드
나는 Google Nexus와 하나의 "열정"전화를 가지고 있습니다. Fastboot 및 adb 도구가 전화기에 설치됩니다. 그리고 부트 로더의 잠금이 풀립니다.
내 작업 : 리눅스 커널 모듈을 Android 커널에 추가해야합니다. 내가 무슨 짓을
는 :
나는 http://source.android.com/source/initializing.html의 단계를 다음과 안드로이드-2.3.6_r1 (열정)의 커널을 다운로드를 구축했다. 나는 또한 전화로 그것을 플래시 수 있고 새로운 안드로이드 커널도 잘 작동합니다. 이제 내가 원하는 것은 커널을 수정하고 자신의 커널 모듈을 추가 한 다음 전화로 플래쉬하여 폰의 커널이 수정 된 커널이되도록하는 것이다.이제이 작업을 수행하는 데 두 가지 접근 방식이 있습니다.
1)
크로스 안드로이드 커널 내 커널 모듈을 컴파일하고 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
이제 새로운 hello-1.ko를 생성 할 수 없습니다. 나는 왜 그런지 모르겠다. VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION 값에 문제가있는 것 같다. 필요한 것인가? 나는 android-2.3.6_r1에서이 값을 시도했지만 여전히 작동하지 않습니다. 이 EXTRAVERSION 값이 무엇인지 모르겠습니다.
나는 우분투 컴파일러에서 생성 된 hello-1.ko로 시도해 보았습니다. 나는이 hello-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에서 에러() 헬로 1.ko 기능은 매우 간단 헬로 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)
이 일의 제 2 수법 커널 모듈의 소스 파일을 안드로이드의 커널 디렉토리에 둘 수 있습니다. 시스템 디렉토리 나 그 밖의 다른 곳에서이 소스 파일을 다른 소스와 함께 빌드하도록 make에게 요청하십시오. 그러나 나는 make 프로세스에 그렇게하도록 요청할 곳이 확실치 않습니다. 나는 main.mk에서 그렇게하려고 시도하고 내 소스 파일의 소스 디렉토리에 Android.mk 파일을 만들었지 만 작동하지 않았다. 이것은 더 나은 해결책 일지 모르지만 나는 이것에 어떤 도움도 찾을 수 없었다.
이렇게하면 커널 모듈이 안드로이드 폰의 wnic (무선 네트워크 인터페이스 장치)을 제어 할 수 있어야합니다. Wnic을 절전 모드로 전환 한 다음 커널 모듈에서 명령을받은 후에 절전 모드를 해제 할 수 있어야합니다. 이 작업을 수행하는 방법에 대한 지침이 있다면 도움이 될 것입니다. Android에서 wpa_supplicant 전용 드라이버를 통해 제어된다는 것을 알았습니다. 명령, 같은 :
wpa_cli driver powermode 0 - auto
wpa_cli driver powermode 1 - active
내 작업을 할 수 있지만 내가 시도하지 않았기 때문에 확실하지 않다. 나는 그 단계에 도달하지 못했다.
이 부분을 살펴보고 도움/안내를 제공해주십시오.
감사합니다,
Apurva