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
版權宣告:本文為博主原創文章,轉載請附上博文連結!