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载入到内核中
ps:假设我们在~/android-kernel目录下下载android内核文件
$mkdir android-kernel #创建此目录
$cd android-kernel
$git clone https://android.googlesource.com/kernel/goldfish.git
$cd goldfish
$git branch -a #查看全部的版本
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/13/7a52bd5e6dd6e955de0248aeeb33982a)
git checkout remotes/origin/android-goldfish-2.6.29
再
git checkout -b master建立自己工作分支
此时目录下已经可以看到kernel代码了。
$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交叉编译工具链就弄好了。
$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选上
然后按回车进入选上三项,如图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/13/5c6aa45070504bd8373bf75a0b047808)
下面开始编译内核
$make -j8 #-j8表示并行编译数,即8个进程并行编译,更快
到此支持loadable 的内核编译完成 , 编译后的内核为 ./arch/arm/boot/zImage
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
到此运行成功!
在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模块编译到内核,启动后可以看到。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/13/37fa38ad1c5bf86d98a800be80e2d24a)
说明模块加载成功。
[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放入
![](https://oscdn.geek-share.com/Uploads/Images/Content/201309/13/23ae6cc9f174d6076186c35bbedd28a9)
cat /proc/kmsg
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
相关文章推荐
- android-----模拟器加载自己编译的内核(适用于驱动练习)
- Android新编译的内核驱动模块不能被init加载原因解决
- 安卓篇--模拟器加载自己编译的内核
- Android 模拟器(源码编译)测试内核驱动
- A31S android 手动加载摄像头命令,驱动编译进内核
- 如何把自己的驱动编译进内核或模块
- 如何把自己的驱动编译进内核或模块(Kconfig和Makefile)
- ubuntu环境:下载、编译模拟器平台android内核源码
- 编译一个自己的内核模块,并加载进内核
- 分析解决:XXX驱动已经被编译到缺省内核中,不能再使用insmod 方式加载
- 【转】在MAC系统中编译ANDROID源码与模拟器内核GoldFish
- android内核编译及模拟器运行过程记录
- Code maturity level options 代码成熟度选项 [*]Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 我是开发者,所以选[*] Loadable module support 可加载模块支持 [*]Enable loadable module support 内核编译配置选项简介 (2.4.20-8
- linux启动时对编译进内核驱动模块的加载
- 一个hello程序的android内核模块编译方法及在模拟器中进行测试结论
- 编译时向内核添加新设备 模块的方式动态的将驱动加入内核,但这种方式加入的驱动程序,当系统重新启动时, 还需要重新用模块的方式进行插入,如果是系统内常用的设备驱动采用这种方式进行加载, 就会很不方便。
- BB-Black 内核编译并加载WL18(wifi)驱动
- MTK android内核独立模块编译与加载
- Android4.0.1 模拟器内核 最新下载地址及编译步骤
- 如何把自己的驱动编译进内核或模块