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

[cpp] view plain copy print ?
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. static int __init hello_init(void)
  4. {
  5. printk(KERN_ERR "Hello world\n");
  6. return 0;
  7. }
  8. static void __exit hello_exit(void)
  9. {
  10. printk(KERN_ERR "exit\n");
  11. }
  12. MODULE_LICENSE("GPL");
  13. module_init(hello_init);
  14. 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

[cpp] view plain copy print ?
  1. obj-y := hello.o
obj-y := hello.o

在driver/char下,编辑Makefile

加入

[cpp] view plain copy print ?
  1. obj-y   += yf-hello/
obj-y  += yf-hello/

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

说明模块加载成功。

6.动态加载hello.ko

Makefile

[cpp] view plain copy print ?
  1. obj-m := hello-yf.o
  2. hello-yf-objs := hello.o
  3. KID :=~/android/android-kernel/goldfish
  4. PWD := $(shell pwd)
  5. ARCH=arm
  6. CROSS_COMPILE=arm-eabi-
  7. CC=$(CROSS_COMPILE)gcc
  8. LD=$(CROSS_COMPILE)ld
  9. all:
  10. make -C $(KID) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=${PWD} modules
  11. clean:
  12. 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

安卓篇--模拟器加载自己编译的内核相关推荐

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

    1. 下载android 模拟器所用的内核源码, 代号为goldfish 2. 下载arm-linux交叉工具链 3. 编译内核文件 4. 让android模拟器运行在刚编译的内核上 5. 编译自己的 ...

  2. iOS开发UI篇—懒加载

    iOS开发UI篇-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  3. 奇葩问题之奇葩解决方案系列——安卓手机外部加载Assetbundle

    一.前言 首先,这个需求是这么被创造出来的,我们要在安卓手机上加载超过一个G的资源,正常的Unity的程序员都会立马想到使用Assetbundle进行资源打包和加载,我当然也不例外.于是乎我就吭哧吭哧 ...

  4. modprobe:用于向内核中加载模块或者从内核中移除模块。

    modprobe:用于向内核中加载模块或者从内核中移除模块. modprobe br_netfilter 加载模块 modprobe -r br_netfilter 移除 1.查看系统中所有modul ...

  5. modprobe命令用于智能地向内核中加载模块或者从内核中移除模块

    modprobe命令用于智能地向内核中加载模块或者从内核中移除模块. modprobe可载入指定的个别模块,或是载入一组相依的模块.modprobe会根据depmod所产生的相依关系,决定要载入哪些模 ...

  6. Genymotion Booting 安卓虚拟机 一直加载问题

    起初在通过 Genymotion(github最新release版本) 启动安卓ova镜像时,发现一直卡在Starting virtual device界面,等了十分钟还是如此 查看vbox下的虚拟机 ...

  7. 动态加载和静态加载及其编译步骤

    在类unix操作系统中,驱动加载方式一般分为:动态加载和静态加载,下面分别对其详细论述. 一.动态加载 动态加载是将驱动模块加载到内核中,而不能放入/lib/modules/下.     在2.4内核 ...

  8. Java提高篇——JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  9. Cesium开发基础篇 | 02加载地形数据

    Cesium中的地形图层类 前面我们主要学习了cesium内置接口如何操作影像数据,但是在一些应用场景中我们需要操作地形数据,例如模拟逼真的三维场景.与高程相关的一些空间分析和计算等.Cesium提供 ...

最新文章

  1. T-SQL WITH 分号问题
  2. 喜欢的Groove Coverage She
  3. 张贤国:视频压缩还远没有达到最优
  4. php 文件保存函数,PHP文件函数
  5. Apache Ant 的安装
  6. 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)
  7. HugeTLB Pages大页内存
  8. [渝粤教育] 中央财经大学 金融学 参考 资料
  9. 天狼星单片机c语言教程,单片机资料百度盘教程.doc
  10. nyoj234 吃土豆 01背包
  11. 计算机启动时蓝屏后自动重起,升级Win10系统之后一开机就蓝屏且电脑不断重启怎么解决?...
  12. 三分钟了解区块链AR游戏Triffic2.0版本
  13. 美术向技美入门课——庄懂的技术美术入门课(美术向)01
  14. 因子完备数c语言,编写函数输出完备数及其所有约数
  15. matlab曲面的最小值,在matlab中计算曲面的曲率
  16. mapStateToProps mapDispatchToProps 的使用
  17. UltraISO 制作系统启动盘教程
  18. 所谓的CDN动态加速技术
  19. MATLAB强化学习工具箱(一)-在网格环境中使用Q-learning and SARSA
  20. freekan电影系统后台无法登录解决方法

热门文章

  1. 生成Excel,处理CSV Injection
  2. 星辰和大海都需要门票,诗和远方也很贵
  3. 服务器physx性能测试,PhysX有多吃性能?
  4. 山东大学软件学院项目实训weblab-1
  5. Android Activity生命周期一探究竟 及 主Activity里带Thread跳转时的注意事项
  6. 超级星饭团专访张震:就希望你们会喜欢
  7. 读书笔记-精准努力-丢掉幻想准备斗争面对现实解决问题
  8. 一句话木马及文件上传。
  9. fatal: 不是 git 仓库(或者任何父目录):.git
  10. 22个最佳WordPress网站预约插件(2023)