首页
社区
课程
招聘
玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译
发表于: 2021-1-7 11:50 15211

玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译

2021-1-7 11:50
15211

本文中使用的是linageOs源码中下载的oneplus3 安卓10内核源码进行研究测试。交叉编译链使用的是linageOs源码中的交叉编译链。

lineageOs源码中oneplus3内核源码位置路径:

lineageOs源码中交叉编译目录位置路径:

为了方便研究测试,不破坏lineageOs中的内核源码结构。我新建一个目录专门存放内核源码、内核模块源码。并将内核源码拷贝到该目录。

本文后续测试的内核源码目录路径:

本文后续内核模块编写存放目录路径:

安卓源码中device/厂商/手机型号/BoardConfig.mk文件中配置了内核源码路径和编译配置文件。因此在device/oneplus/oneplus3/BoardConfig.mk中存放了相关的内核配置信息,如下所示:

以上TARGET_KERNEL_CONFIG变量指定了oneplus3内核的编译配置文件名为:lineageos_oneplus3_defconfig

在内核源码中编译配置文件一般存放在路径arch/处理器平台/configs下面。由于一加3手机为arm64,所以在路径arch/arm64/configs下找到配置文件lineageos_oneplus3_defconfig。如下所示:

由于编译内核模块的时候需要依赖于已经编译过的内核输出,并且内核需要配置为可加载才能正常编译内核模块。所以需要修改一下arch/arm64/configs/lineageos_oneplus3_defconfig,添加如下配置项。

脚本如下

以上脚本在终端难的一个一个的输入,我将上面的弄成一个make.sh文件,到时候直接执行。make.sh内容如下:

在终端执行make.sh之后就可以看到编译内核了,如下所示:

编译完成之后,可以在目录/home/qiang/myproject/kernel/oneplus3/msm8996/out下面找到编译产生的文件和内核镜像。

此处编写一个简单的HelloWorld模块进行研究测试。

创建helloworld.c模块源文件

文件代码如下:

创建模块编译配置文件Makefile

Makefile如下:

编译如下:

模块编译好之后就可以 adb push到手机,使用insmod加载模块进行测试验证了。
以后就可以通过写内核系统hook模块进行系统调用内核层拦截、写netfileter hook模块进行网络管控等等操作。

点我阅读原文

 
/home/qiang/lineageOs/kernel/oneplus/msm8996
/home/qiang/lineageOs/kernel/oneplus/msm8996
/home/qiang/lineageOs/prebuilts/gcc/linux-x86
/home/qiang/lineageOs/prebuilts/gcc/linux-x86
 
home/qiang/myproject/kernel/oneplus3/msm8996
home/qiang/myproject/kernel/oneplus3/msm8996
/home/qiang/myproject/kernel/oneplus3/modules
/home/qiang/myproject/kernel/oneplus3/modules
BOARD_KERNEL_BASE := 0x80000000
BOARD_KERNEL_PAGESIZE := 4096
BOARD_KERNEL_TAGS_OFFSET := 0x02000000
BOARD_RAMDISK_OFFSET     := 0x02200000
BOARD_KERNEL_IMAGE_NAME := Image.gz-dtb
TARGET_KERNEL_SOURCE := kernel/oneplus/msm8996
TARGET_KERNEL_CONFIG := lineageos_oneplus3_defconfig
BOARD_KERNEL_BASE := 0x80000000
BOARD_KERNEL_PAGESIZE := 4096
BOARD_KERNEL_TAGS_OFFSET := 0x02000000
BOARD_RAMDISK_OFFSET     := 0x02200000
BOARD_KERNEL_IMAGE_NAME := Image.gz-dtb
TARGET_KERNEL_SOURCE := kernel/oneplus/msm8996
TARGET_KERNEL_CONFIG := lineageos_oneplus3_defconfig
 
qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$ pwd
/home/qiang/myproject/kernel/oneplus3/msm8996/arch/arm64/configs
 
qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$ ls -la lineageos_oneplus3_defconfig
-rw-rw-r-- 1 qiang qiang 15001 1月   3 23:00 lineageos_oneplus3_defconfig
qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$ pwd
/home/qiang/myproject/kernel/oneplus3/msm8996/arch/arm64/configs
 
qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$ ls -la lineageos_oneplus3_defconfig
-rw-rw-r-- 1 qiang qiang 15001 1月   3 23:00 lineageos_oneplus3_defconfig
# 开启内核模块可加载
CONFIG_MODULES=y
# 开启内核模块可卸载
CONFIG_MODULE_UNLOAD=y
# 开启内核模块可加载
CONFIG_MODULES=y
# 开启内核模块可卸载
CONFIG_MODULE_UNLOAD=y
# 设置编译平台为64位arm
export ARCH=arm64
export SUBARCH=arm64
# 配置arm64的交叉编译路径
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
# 配置32位arm的交叉编译路径
# 测试过程中32位的不设置居然编译不过
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
 
# 设置64位交叉编译工具前缀
# 这个前缀其实就是交叉编译链路径/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin 下面的工具的公共前缀
export CROSS_COMPILE=aarch64-linux-android-
 
# 设置32位交叉编译工具前缀
# 这个前缀其实就是交叉编译链路径/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin 下面的工具的公共前缀
export CROSS_COMPILE_ARM32=arm-linux-androideabi-
 
# 通过make命令生成编译配置文件.config
# O=out指定输出目录  lineageos_oneplus3_defconfig:这个是oneplus3的内核编译配置
make  O=out lineageos_oneplus3_defconfig
 
#  执行内核编译
make -j2 O=out ARCH=arm64
# 设置编译平台为64位arm
export ARCH=arm64
export SUBARCH=arm64
# 配置arm64的交叉编译路径
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
# 配置32位arm的交叉编译路径
# 测试过程中32位的不设置居然编译不过
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
 
# 设置64位交叉编译工具前缀
# 这个前缀其实就是交叉编译链路径/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin 下面的工具的公共前缀
export CROSS_COMPILE=aarch64-linux-android-
 
# 设置32位交叉编译工具前缀
# 这个前缀其实就是交叉编译链路径/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin 下面的工具的公共前缀
export CROSS_COMPILE_ARM32=arm-linux-androideabi-
 
# 通过make命令生成编译配置文件.config
# O=out指定输出目录  lineageos_oneplus3_defconfig:这个是oneplus3的内核编译配置
make  O=out lineageos_oneplus3_defconfig
 
#  执行内核编译
make -j2 O=out ARCH=arm64
#!/bin/bash
 
# 切换到内核源码根目录去
cd ./msm8996
make mrproper
make clean
export ARCH=arm64
export SUBARCH=arm64
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
export CROSS_COMPILE=aarch64-linux-android-
export CROSS_COMPILE_ARM32=arm-linux-androideabi-
make -j2 O=out lineageos_oneplus3_defconfig
make -j2  O=out ARCH=arm64
#!/bin/bash
 
# 切换到内核源码根目录去
cd ./msm8996
make mrproper
make clean
export ARCH=arm64
export SUBARCH=arm64
export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-4-12 22:07 被蟑螂一号编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (5)
雪    币: 1867
活跃值: (4073)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
2021-1-7 12:17
0
雪    币: 2813
活跃值: (3179)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2021-1-7 14:28
0
雪    币: 6573
活跃值: (3933)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
4
2021-1-7 15:16
0
雪    币: 187
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
2021-7-26 13:42
0
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
2022-11-9 11:28
0
游客
登录 | 注册 方可回帖
返回
//