洞察如何通过低成本家政服务app实现高效管理与数字化转型
1815
2022-11-22
Android系统10 RK3399 init进程启动(十一) 内核编译
说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
本章重点介绍在Android 源码包中,内核的的单独编译。
一, 内核目标清除
内核如果编译过, 需要重新重头编译,或者打包给别人, 可以对内核进行清除
cd rk3399_Android10.0/kernel/make distclean 或者 make clean
distclean清除更彻底
二, 单独第一次编译内核
对于第一个编译内核, 需要进行内核配置, rk3399会可以做如下操作
cd rk3399_Android10.0/source FFTools/build.shcd kernel/make ARCH=arm64 firefly_defconfig android-10.config rk3399.configmake ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3399_roc_pc_plus/boot.img rk3399-roc-pc-plus.img -j6
解释:
执行make ARCH=arm64 firefly_defconfig android-10.config rk3399.config会显示如下:
arch/arm64/configs/firefly_defconfigUsing .config as baseMerging ./kernel/configs/android-10.configMerging ./kernel/configs/rk3399.configmerged configuration written to .config (needs make)configuration written to .config
说明会将多个congfig文件会进行合并。
执行make ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3399_roc_pc_plus/boot.img rk3399-roc-pc-plus.img -j6 的意思是
会编译rk3399-roc-pc-plus.dts, 并且会将最终的目标文件更新生成到../rockdev/Image-rk3399_roc_pc_plus/boot.img
三, 修改内核源码再编译
如果已经做过第一次内核配置和编译,后面需要在此基础上进行修改和编译, 可以通过如下操作:
cd rk3399_Android10.0/source FFTools/build.shcd kernel/make ARCH=arm64 menuconfig
或者修改源码,dts等, 如修改支持sd/tf启动:
vim arch/arm64/boot/dts/rockchip/rk3399-roc-pc-plus.dts +88 打开注释&sdmmc{ supports-emmc; //for sd boot};vim arch/arm64/boot/dts/rockchip/rk3399-roc-pc-plus.dtsi +266 添加&vcc_sd{ regulator-always-on; regulator-boot-on; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>;};
重新编译内核:
make ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3399_roc_pc_plus/boot.img rk3399-roc-pc-plus.img -j24
最后编译生成日志为:
CC drivers/gpu/arm/bifrost/bifrost_kbase.mod.o CC drivers/gpu/arm/midgard/midgard_kbase.mod.o CC drivers/media/usb/gspca/gspca_main.mod.o CC drivers/mtd/devices/m25p80.mod.o CC drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmdhd.mod.o CC drivers/net/wireless/rockchip_wlan/rtl8723ds/8723ds.mod.o CC drivers/net/wireless/rockchip_wlan/rtl8723cs/8723cs.mod.o CC drivers/net/wireless/rockchip_wlan/rtl8723du/8723du.mod.o CC drivers/net/wireless/rockchip_wlan/rtl8822bs/8822bs.mod.o LD [M] drivers/gpu/arm/bifrost/bifrost_kbase.ko LD [M] drivers/net/wireless/rockchip_wlan/rtl8723du/8723du.ko LD [M] drivers/media/usb/gspca/gspca_main.ko LD [M] drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmdhd.ko LD [M] drivers/net/wireless/rockchip_wlan/rtl8822bs/8822bs.ko LD [M] drivers/gpu/arm/midgard/midgard_kbase.ko LD [M] drivers/mtd/devices/m25p80.ko LD [M] drivers/net/wireless/rockchip_wlan/rtl8723cs/8723cs.ko LD [M] drivers/net/wireless/rockchip_wlan/rtl8723ds/8723ds.ko Image: resource.img (with rk3399-roc-pc-plus.dtb logo.bmp logo_kernel.bmp) is ready Image: boot.img (../rockdev/Image-rk3399_roc_pc_plus/boot.img + Image + resource.img) is ready Image: zboot.img (../rockdev/Image-rk3399_roc_pc_plus/boot.img + Image.lz4 + resource.img) is ready
四, 生成镜像介绍
在当前目录下会出现boot.img resource.img, 以上红色部分是在kernel/scripts/mkimg中打印出来的
file boot.imgboot.img: Android bootimg, kernel (0x10008000), second stage (0x10f00000), page size: 2048
将boo.img解压出来, unpack_bootimg --boot_img boot.img --out boot-out,.得到如下内容:
其实boot.img的生成是由如下命令完成的:
./scripts/mkbootimg --kernel ./arch/arm64/boot/Image --second resource.img -o boot.img
最后通过验证,其实boot.img中的second就是resource.img。
解压resource.img:
kernel/mytest$ ../scripts/resource_tool --unpack --image=resource.img
在当前目录下出现out目录:
所以rk3399下boot.img内部结构如下:
+—————–+| boot header | 1 page+—————–+| kernel | n pages+—————–+| ramdisk | m pages+—————–+| second stage | o pages <====() logo.bmp logo_kernel.bmp rk-kernel.dtb+—————–+
五, 内核烧录
将kernel目录下的boot.img从编译机器中拷贝到window中来:
在开发板上电之前, 按住reovery键, type-c线链接好, 上电, 进入到-模式:
选好boot.img路径, 然后执行boot.img,即可完成烧录更新内核。
六,总结
通过编译内核, 大体上知道内核源码最终生成的是boot.img, 可以打包生成到统一镜像中去, 也可以单独编译和调试。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~