2012-02-24 7 views
12

여기에 내 문제를 나열하고 있습니다.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

답변

5

커널 모듈 (KO의)는 정적 커널보다 작업하기가 훨씬 쉽다 - 한 커널을 사용할 수 있습니다로. 가장 쉬운 방법은 "adb 쉘 lsmod"입니다. 두 번째는 커널 .config가 CONFIG_MODULES = y 및 CONFIG_MODULE_UNLOAD = y를 활성화했는지 확인하는 것입니다. 리눅스 KO 개발에 대한 웹상의 많은 정보.

흠, 당신은 가깝지만 메이크 파일이 망가져있는 것처럼 보입니다. 먼저 단위 테스트를 위해 호스트에 안녕을 구축 한 다음 대상을 기반으로 빌드하십시오. 모듈 지원이 활성화되어있는 경우의 .config에서

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

먼저 체크 : 여기가 OMAP36xx 실행 진저에서 사용하는 샘플 메이크입니다. (CONFIG_MODULES = y 및 CONFIG_MODULE_UNLOAD = y) menuconfig를 사용하여 활성화하지 않은 경우.

그리고 커널 소스의 루트에 모듈을 배치하고 루트

core-y  := usr/ yourModule/ 

에서 찾을 주 메이크이를 추가하고 yourModule 폴더에이

obj-m := yourModule.o 
을 메이크
관련 문제