日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2023/12/15 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、 開(kāi)發(fā)前期準(zhǔn)備

本文中使用的是linageOs源碼中下載的oneplus3 安卓10內(nèi)核源碼進(jìn)行研究測(cè)試。交叉編譯鏈?zhǔn)褂玫氖莑inageOs源碼中的交叉編譯鏈。

lineageOs源碼中oneplus3內(nèi)核源碼位置路徑:

/home/qiang/lineageOs/kernel/oneplus/msm8996

lineageOs源碼中交叉編譯目錄位置路徑:

/home/qiang/lineageOs/prebuilts/gcc/linux-x86

為了方便研究測(cè)試,不破壞lineageOs中的內(nèi)核源碼結(jié)構(gòu)。我新建一個(gè)目錄專門存放內(nèi)核源碼、內(nèi)核模塊源碼。并將內(nèi)核源碼拷貝到該目錄。

本文后續(xù)測(cè)試的內(nèi)核源碼目錄路徑:

?home/qiang/myproject/kernel/oneplus3/msm8996

本文后續(xù)內(nèi)核模塊編寫存放目錄路徑:

/home/qiang/myproject/kernel/oneplus3/modules

二、編譯內(nèi)核源碼

  • 找到oneplus3設(shè)備的內(nèi)核源碼配置
  • 安卓源碼中device/廠商/手機(jī)型號(hào)/BoardConfig.mk文件中配置了內(nèi)核源碼路徑和編譯配置文件。因此在device/oneplus/oneplus3/BoardConfig.mk中存放了相關(guān)的內(nèi)核配置信息,如下所示:

    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

    以上TARGET_KERNEL_CONFIG變量指定了oneplus3內(nèi)核的編譯配置文件名為:lineageos_oneplus3_defconfig

    在內(nèi)核源碼中編譯配置文件一般存放在路徑arch/處理器平臺(tái)/configs下面。由于一加3手機(jī)為arm64,所以在路徑arch/arm64/configs下找到配置文件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
  • 為編譯配置添加內(nèi)核可加載、卸載選項(xiàng)
  • 由于編譯內(nèi)核模塊的時(shí)候需要依賴于已經(jīng)編譯過(guò)的內(nèi)核輸出,并且內(nèi)核需要配置為可加載才能正常編譯內(nèi)核模塊。所以需要修改一下arch/arm64/configs/lineageos_oneplus3_defconfig,添加如下配置項(xiàng)。

    #?開(kāi)啟內(nèi)核模塊可加載
    CONFIG_MODULES=y
    #?開(kāi)啟內(nèi)核模塊可卸載
    CONFIG_MODULE_UNLOAD=y
  • 配置編譯內(nèi)核源碼腳本
  • 腳本如下

    #?設(shè)置編譯平臺(tái)為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的交叉編譯路徑
    #?測(cè)試過(guò)程中32位的不設(shè)置居然編譯不過(guò)
    export?PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH

    #?設(shè)置64位交叉編譯工具前綴
    #?這個(gè)前綴其實(shí)就是交叉編譯鏈路徑/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin?下面的工具的公共前綴
    export?CROSS_COMPILE=aarch64-linux-android-

    #?設(shè)置32位交叉編譯工具前綴
    #?這個(gè)前綴其實(shí)就是交叉編譯鏈路徑/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin?下面的工具的公共前綴
    export?CROSS_COMPILE_ARM32=arm-linux-androideabi-

    #?通過(guò)make命令生成編譯配置文件.config
    #?O=out指定輸出目錄??lineageos_oneplus3_defconfig:這個(gè)是oneplus3的內(nèi)核編譯配置
    make??O=out?lineageos_oneplus3_defconfig

    #??執(zhí)行內(nèi)核編譯
    make?-j2?O=out?ARCH=arm64

    以上腳本在終端難的一個(gè)一個(gè)的輸入,我將上面的弄成一個(gè)make.sh文件,到時(shí)候直接執(zhí)行。make.sh內(nèi)容如下:

    #!/bin/bash
    #?切換到內(nèi)核源碼根目錄去?
    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

    在終端執(zhí)行make.sh之后就可以看到編譯內(nèi)核了,如下所示:

    qiang@ubuntu:~/myproject/kernel/oneplus3$?./make.sh?
    make[1]:?Entering?directory?'/home/qiang/myproject/kernel/oneplus3/msm8996/out'
    ??GEN?????./Makefile
    ??HOSTCC??scripts/basic/fixdep
    ??HOSTCC??scripts/kconfig/conf.o
    ??HOSTCC??scripts/kconfig/zconf.tab.o
    ??HOSTLD??scripts/kconfig/conf

    編譯完成之后,可以在目錄/home/qiang/myproject/kernel/oneplus3/msm8996/out下面找到編譯產(chǎn)生的文件和內(nèi)核鏡像。

    三、編寫helloworld模塊

    此處編寫一個(gè)簡(jiǎn)單的HelloWorld模塊進(jìn)行研究測(cè)試。

  • 創(chuàng)建helloworld.c模塊源文件
  • 文件代碼如下:

    #include?
    #include?
    #include?
    static?int?__init?hello_init(void){
    ???printk(KERN_ALERT?"Hello?World!\n");
    ???return?0;
    }
    static?void?__exit?hello_exit(void){
    ???printk(KERN_ALERT?"See?You,Hello?World!\n");
    }
    module_init(hello_init);
    module_exit(hello_exit);
  • 創(chuàng)建模塊編譯配置文件Makefile
  • Makefile如下:

    #?設(shè)置內(nèi)核源碼編譯的輸出目錄
    KERNEL_OUT=/home/qiang/myproject/kernel/oneplus3/msm8996/out
    #?設(shè)置arm64交叉編譯鏈工具路徑
    TOOLCHAIN=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
    #?設(shè)置arm32交叉編譯鏈工具路徑
    TOOLCHAIN32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-
    #?設(shè)置模塊
    obj-m?:=?helloworld.o
    #?編譯命令配置?
    all:
    ?make?ARCH=arm64?CROSS_COMPILE_ARM32=$(TOOLCHAIN32)??CROSS_COMPILE=$(TOOLCHAIN)?-C?$(KERNEL_OUT)?M=$(shell?pwd)??modules
    #?清理編譯命令
    clean:
    ?make?-C?$(KERNEL_OUT)?M=$(shell?pwd)?clean
  • 在helloworld模塊目錄執(zhí)行make命令進(jìn)行編譯
  • 編譯如下:

    qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$?pwd
    /home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule

    qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$?ls?-la
    total?16
    drwxrwxr-x?2?qiang?qiang?4096?1月???5?21:18?.
    drwxrwxr-x?6?qiang?qiang?4096?1月???5?21:17?..
    -rw-rw-r--?1?qiang?qiang??310?1月???5?21:06?helloworld.c
    -rw-rw-r--?1?qiang?qiang??498?1月???5?21:08?Makefile

    qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$?make
    make?ARCH=arm64?CROSS_COMPILE_ARM32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-??CROSS_COMPILE=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-?-C?/home/qiang/myproject/kernel/oneplus3/msm8996/out?M=/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule??modules
    make[1]:?Entering?directory?'/home/qiang/myproject/kernel/oneplus3/msm8996/out'
    ??CC?[M]??/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.o
    ??Building?modules,?stage?2.
    ??MODPOST?1?modules
    ??CC??????/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.mod.o
    ??LD?[M]??/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.ko
    make[1]:?Leaving?directory?'/home/qiang/myproject/kernel/oneplus3/msm8996/out'

    模塊編譯好之后就可以 adb push到手機(jī),使用insmod加載模塊進(jìn)行測(cè)試驗(yàn)證了。以后就可以通過(guò)寫內(nèi)核系統(tǒng)hook模塊進(jìn)行系統(tǒng)調(diào)用內(nèi)核層攔截、寫netfileter hook模塊進(jìn)行網(wǎng)絡(luò)管控等等操作。

    專注安卓系統(tǒng)、安卓ndk開(kāi)發(fā)、安卓應(yīng)用安全和逆向分析相關(guān)知識(shí)分享,系統(tǒng)定制、frida、xposed(sandhook、edxposed)系統(tǒng)集成、加固、脫殼等等。關(guān)注公眾號(hào)第一時(shí)間接收更新文章。

    總結(jié)

    以上是生活随笔為你收集整理的编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。