大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
linux作为一款流行的嵌入式系统,目前已经有多种架构的MCU支持Linux移植,arm64就是其中一种。今天在这里想做一个笔记,记录一下完整的arm64移植过程。
嵌入式Linux系统组成部分
嵌入式Linux移植到开发板上时,主要有四个组成部分,下面一 一列举。
在启动过程中,bootloader加载设备树文件(dtb),之后启动内核(Start kernel),进而加载根文件系统(debian或者ubuntu),最后进入系统。
那么我们所做的工作可以分为以下三部分:
1、进行bootloader的编译开发和移植。
2、进行内核文件的编译和移植(Image和dtb)。
3、进行根文件系统的编译和移植。
bootloader的移植
每个开发板的bootloader开发不太一样,个人经历的两块板子,bootloader和uboot移植过程就大相径庭,如果你手头有板子的话,建议以原厂提供的方式为准。
这里不介绍bootloader的移植和uboot的移植,感兴趣的话,请参考自己的开发板资料或者网上资料。
根文件系统的生成
根文件系统的生成可以参考链接 构建debian for ARM
我们假定最后生成的根文件系统为 debian_stretch文件夹。
Linux内核的移植
Linux内核的移植,主要是移植最后生成的内核镜像Image文件以及设备树文件dtb
Linux内核的编译,也是为了生成Image以及dtb
1、准备工作
(1)原厂提供的内核源代码。
(2)linaro官网下载的交叉编译工具 aarch64-linux-gnu- 。
(3)linux系统的pc机一台。
2、进行交叉编译的配置工作
交叉编译的意思是在你x86的pc上,编译出能够在arm64上运行的程序,充当的是“翻译”的角色。
进入到/opt目录
cd /opt
解压下载的交叉编译工具
sudo tar -jxvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
进行环境变量设置
sudo vim /etc/profile
在代码底部,加入环境变量
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
之后保存退出,执行立即生效
source /etc/profile
接下来,当你在终端拼写aarch64并按下tab键时,命令行会自动补全如下信息。
debian:~$ aarch64-linux-gnu-
aarch64-linux-gnu-addr2line aarch64-linux-gnu-gcov-tool
aarch64-linux-gnu-ar aarch64-linux-gnu-gdb
aarch64-linux-gnu-as aarch64-linux-gnu-gdb-add-index
aarch64-linux-gnu-c++ aarch64-linux-gnu-gfortran
aarch64-linux-gnu-c++filt aarch64-linux-gnu-gprof
aarch64-linux-gnu-cpp aarch64-linux-gnu-ld
aarch64-linux-gnu-dwp aarch64-linux-gnu-ld.bfd
aarch64-linux-gnu-elfedit aarch64-linux-gnu-ld.gold
aarch64-linux-gnu-g++ aarch64-linux-gnu-nm
aarch64-linux-gnu-gcc aarch64-linux-gnu-objcopy
aarch64-linux-gnu-gcc-7.5.0 aarch64-linux-gnu-objdump
aarch64-linux-gnu-gcc-ar aarch64-linux-gnu-ranlib
aarch64-linux-gnu-gcc-nm aarch64-linux-gnu-readelf
aarch64-linux-gnu-gcc-ranlib aarch64-linux-gnu-size
aarch64-linux-gnu-gcov aarch64-linux-gnu-strings
aarch64-linux-gnu-gcov-dump aarch64-linux-gnu-strip
说明交叉编译工具配置成功
3、进行内核(kernel)的配置与编译。
(1)给内核打实时补丁(可选,不打实时补丁的话,可以跳到第二步)
将网上下载的rt补丁放到内核源码目录,之后执行
sudo patch -p1 < patch-4.19.132-rt59.patch
这样补丁就打好了
(2)进行内核配置。
导入原厂的默认配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- xxx_defconfig
说明:xxx_defconfig是我从原厂内核源代码arch/arm64/configs那里拷贝过来的内核配置文件,里面包含了原厂已经做好的,对板子的基本配置。这也是我为什么开头推荐下载内核源码要从开发板原厂下载的原因。否则linux官网的内核可能没对你这款MCU进行支持和配置,即使你以后能编译,也无法生成dtb文件。
进行自定义内核配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
打了rt补丁的话,需要在menuconfig的界面下,进行如下操作
进入“General setup”
在”Preemption Model”中选择“Fully Preemptible Kernel(Real-Time)”
回到上一层,进入”Device Drivers”中,去掉“Staging drivers”
之后保存,退出界面
(3)进行交叉编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- all //时间较长,可以去喝杯茶
最后交叉编译完成,会生成arch/arm64/boot/Image 以及arch/arm64/boot/dtbs/xxxx/*******.dtb文件。
注意:上一行的xxxx为你的开发板或MCU原厂的名字,如Sumsung或者xilinx。*******.dtb对应你的开发板型号。
这也是我推荐使用原厂内核的原因。
接下来就可以移植Image内核镜像以及dtb设备树了
modules以及headers头文件安装
上面我们生成了debian_stretch根文件系统,以及Image,dtb 内核镜像和设备树文件,按理来说已经可以进行移植了。但是不要忘了Modules以及headers也是内核里比较重要的两个内容
modules 是一些内核编译的模块选项,需要你安装到根文件系统中,跟随系统一起启动
headers 是一些头文件,需要你安装到根文件系统中 。linux安装应用软件经常会用到这些头文件。
(1)安装modules文件
生成modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules
安装modules到根文件系统
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=~/debian_stretch/usr
(2)安装headers头文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- headers_install INSTALL_HDR_PATH=~/debian_stretch/usr
到现在为止,完整的rootfs(根文件系统),Image(内核镜像),.dtb(设备树文件),都已备齐。
移植到开发板有两种方式
1、下载上述三个文件到flash中
2、下载上述三个文件到SD卡中
之后在bootloader或者uboot设置启动地址即可。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192657.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...