安卓篇--模拟器加载自己编译的内核
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
$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 -> AVD 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
- #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);
#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
- obj-y := hello.o
obj-y := hello.o
在driver/char下,编辑Makefile
加入
- obj-y += yf-hello/
obj-y += yf-hello/
重新编译内核可直接将hello模块编译到内核,启动后可以看到。
说明模块加载成功。
6.动态加载hello.ko
Makefile
- 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
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} modulesclean:rm -rf *.o .cmd *.ko *.mod.c .tmp_versions
make后,将hello-yf.ko
用adb push放入
cat /proc/kmsg
安卓篇--模拟器加载自己编译的内核相关推荐
- android-----模拟器加载自己编译的内核(适用于驱动练习)
1. 下载android 模拟器所用的内核源码, 代号为goldfish 2. 下载arm-linux交叉工具链 3. 编译内核文件 4. 让android模拟器运行在刚编译的内核上 5. 编译自己的 ...
- iOS开发UI篇—懒加载
iOS开发UI篇-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- 奇葩问题之奇葩解决方案系列——安卓手机外部加载Assetbundle
一.前言 首先,这个需求是这么被创造出来的,我们要在安卓手机上加载超过一个G的资源,正常的Unity的程序员都会立马想到使用Assetbundle进行资源打包和加载,我当然也不例外.于是乎我就吭哧吭哧 ...
- modprobe:用于向内核中加载模块或者从内核中移除模块。
modprobe:用于向内核中加载模块或者从内核中移除模块. modprobe br_netfilter 加载模块 modprobe -r br_netfilter 移除 1.查看系统中所有modul ...
- modprobe命令用于智能地向内核中加载模块或者从内核中移除模块
modprobe命令用于智能地向内核中加载模块或者从内核中移除模块. modprobe可载入指定的个别模块,或是载入一组相依的模块.modprobe会根据depmod所产生的相依关系,决定要载入哪些模 ...
- Genymotion Booting 安卓虚拟机 一直加载问题
起初在通过 Genymotion(github最新release版本) 启动安卓ova镜像时,发现一直卡在Starting virtual device界面,等了十分钟还是如此 查看vbox下的虚拟机 ...
- 动态加载和静态加载及其编译步骤
在类unix操作系统中,驱动加载方式一般分为:动态加载和静态加载,下面分别对其详细论述. 一.动态加载 动态加载是将驱动模块加载到内核中,而不能放入/lib/modules/下. 在2.4内核 ...
- Java提高篇——JVM加载class文件的原理机制
阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...
- Cesium开发基础篇 | 02加载地形数据
Cesium中的地形图层类 前面我们主要学习了cesium内置接口如何操作影像数据,但是在一些应用场景中我们需要操作地形数据,例如模拟逼真的三维场景.与高程相关的一些空间分析和计算等.Cesium提供 ...
最新文章
- T-SQL WITH 分号问题
- 喜欢的Groove Coverage She
- 张贤国:视频压缩还远没有达到最优
- php 文件保存函数,PHP文件函数
- Apache Ant 的安装
- 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)
- HugeTLB Pages大页内存
- [渝粤教育] 中央财经大学 金融学 参考 资料
- 天狼星单片机c语言教程,单片机资料百度盘教程.doc
- nyoj234 吃土豆 01背包
- 计算机启动时蓝屏后自动重起,升级Win10系统之后一开机就蓝屏且电脑不断重启怎么解决?...
- 三分钟了解区块链AR游戏Triffic2.0版本
- 美术向技美入门课——庄懂的技术美术入门课(美术向)01
- 因子完备数c语言,编写函数输出完备数及其所有约数
- matlab曲面的最小值,在matlab中计算曲面的曲率
- mapStateToProps mapDispatchToProps 的使用
- UltraISO 制作系统启动盘教程
- 所谓的CDN动态加速技术
- MATLAB强化学习工具箱(一)-在网格环境中使用Q-learning and SARSA
- freekan电影系统后台无法登录解决方法