android-----模擬器加載自己編譯的內核(適用於驅動練習)

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


#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

在driver/char下,編輯Makefile
加入

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

make後,將hello-yf.ko 
用adb push放入

cat /proc/kmsg


--------------------- 
作者:知恥而後勇的蝸牛 
來源:CSDN 
原文:https://blog.csdn.net/yf210yf/article/details/9901375 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章