您的位置:首页 > 移动开发 > Android开发

android-----模拟器加载自己编译的内核(适用于驱动练习)

2013-09-13 15:02 447 查看
转自:http://blog.csdn.net/yf210yf/article/details/9901375

1. 下载android 模拟器所用的内核源码, 代号为goldfish

2. 下载arm-linux交叉工具链

3. 编译内核文件

4. 让android模拟器运行在刚编译的内核上

5. 编译自己的hello内核模块

6 将hello.ko载入到内核中

1. 下载android 模拟器所用的内核源码, 代号为goldfish

(goldfish内核是专为android模拟器使用的)

ps:假设我们在~/android-kernel目录下下载android内核文件

$mkdir android-kernel #创建此目录

$cd android-kernel

$git clone https://android.googlesource.com/kernel/goldfish.git
$cd goldfish

$git branch -a #查看全部的版本



git checkout remotes/origin/android-goldfish-2.6.29



git checkout -b master建立自己工作分支

此时目录下已经可以看到kernel代码了。

2. 下载arm-linux交叉工具链

(ps: 假设工具链的目录为: ~/android-toolchain/)

$mkdir ~/android-toolchain

$cd ~/android-toolchain

$git clone https://android.googlesource.com/platform/prebuilt #这一步,要下载近1.8GB。

然后将此路径加入PATH变量中, 修改~/.bashrc文件

在最后一行加入:
export PATH=/home/snail/android/android-toolchain/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

生效:

source ~/.bashrc

到此arm-linux交叉编译工具链就弄好了。

3. 编译内核文件

ps: 为了让内核文件支持动态加载和卸载.ko模块,请大家按下面的步骤进行

$cd ~/android-kernel/goldfish

$export ARCH=arm

$export SUBARCH=arm

$export CROSS_COMPILE=arm-eabi- #前面已经将路径加入到PATH变量中了

$make goldfish_defconfig

[Android4.1以上平台需要进行如下配置]

$make goldfish_armv7_defconfig

为了支持动态加载和卸载ko模块,否则请跳过。

$make menuconfig #这步可能会提示缺少个什么库 , 用sudo apt-get install libxxx安装 (多按Tab补全)

然后请把Enable loadable module support项按y选上

然后按回车进入选上三项,如图:



下面开始编译内核

$make -j8 #-j8表示并行编译数,即8个进程并行编译,更快

到此支持loadable 的内核编译完成 , 编译后的内核为 ./arch/arm/boot/zImage

4. 让android模拟器运行在刚编译的内核上

4.1 打开eclipse -> window -> ***D manager 新建一个模拟器,比如名叫android4.2 (此步的前提是你已经装好了android开发环境)

4.2 使用自己的内核运行

(假设你的android sdk已经安装 , 这里使用 ANDROID_SDK表示android sdk安装目录)

$ $ANDROID_SDK/tools/emulator -avd android4.2 -kernel ~/android-kernel/goldfish/arch/arm/boot/zImage -show-kernel

到此运行成功!

5. 编译自己的hello内核模块

位置:

在driver/char/下建立yf-hello文件夹

在yf-hello文件夹下建立hello.c

[cpp] view
plaincopyprint?

#include <linux/module.h>

#include <linux/init.h>



static int __init hello_init(void)

{

printk(KERN_ERR "Hello world\n");

return 0;

}



static void __exit hello_exit(void)

{

printk(KERN_ERR "exit\n");

}



MODULE_LICENSE("GPL");

module_init(hello_init);

module_exit(hello_exit);

Makefile

[cpp] view
plaincopyprint?

obj-y := hello.o

在driver/char下,编辑Makefile

加入

[cpp] view
plaincopyprint?

obj-y += yf-hello/

重新编译内核可直接将hello模块编译到内核,启动后可以看到。



说明模块加载成功。

6.动态加载hello.ko

Makefile

[cpp] view
plaincopyprint?

obj-m := hello-yf.o

hello-yf-objs := hello.o



KID :=~/android/android-kernel/goldfish

PWD := $(shell pwd)

ARCH=arm

CROSS_COMPILE=arm-eabi-

CC=$(CROSS_COMPILE)gcc

LD=$(CROSS_COMPILE)ld



all:

make -C $(KID) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=${PWD} modules



clean:

rm -rf *.o .cmd *.ko *.mod.c .tmp_versions

make后,将hello-yf.ko

用adb push放入



cat /proc/kmsg

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐