系统移植
注:本人刚毕业大学生,对系统移植入门尚浅,欢迎提出问题和指出错误
系统移植目的
-
不同架构的处理器的指令集不兼容,即使是相同的处理器架构,板块不同驱动代码也不同
-
硬件发生变化,软件需要进行相应的裁剪,对硬件进行适配
国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统
-
linux内核是一个通用的内核,各个厂商对linux进行相应的配置使其与我们当前的硬件平台匹配之后才能进行编译和安装
系统移植四部分
- 交叉编译环境搭建
- 选对交叉编译工具链,清除宿主机和目标机架构
- 确定目标操作系统
- 选择交叉编译工具链的功能
- bootloder移植
- 选择合适的bootloder
- 按照手册boot部分进行编译
- 选择bootloder的启动方式
- RAM启动
- SD卡启动
- emmc/nand启动,需要确保开发板支持
- 将bootloder写入合适位置
- linux内核移植
- 确定好合适的内核版本
- 判断需不需要向内核添加补丁和自定义驱动
- 执行make menuconfg选择添加的补丁和驱动
- make help查看配置文件并编译配置文件
- makefile进行编译
- 根文件系统制作
- 选择合适的根文件系统制作工具
- busybox:仅构建常用命令和文件,lib库、/etc需要手动创建
- buildroot:集成了busybox功能外,还集成了各种软件
- busybox:
- 进行配置
- 编译
- 添加lib库、/etc
- buildroot
- 进行配置
- 编译
- 选择合适的根文件系统制作工具
开发板与pc连接与通信
连接
- 串口:
- OTG:uboot下载
- dbug:打印内核或uboot源码信息
- 网线:
- 开发板与pc进行通信,通过网线下载程序,速度极快
通信
配网
-
配置windows ip
-
配置vmware
-
配置ubuntu ip
-
配置开发板ip
搭建tftp
简单文件传输协议,基于
TCP/IP
协议,用来在客户机与服务器之间进行简单文件传输协议传输:以固定的512字节块的长度进行传输,在发送下一个包之前,数据块必须得到响应,少于512字节说明传输结束
端口号:69
-
步骤
-
环境搭建
-
安装tftp服务器,sudo apt-get install tftpd-hpa tftp-hpa
-
修改配置文件:sudo vi /etc/default/tftpd-hpa
TFTP_DIRECTORY= //tftp服务器目录
TFTP_OPTIONS=“-c -s -l” //环境变量
-
重启tftp服务,sudo service tftpd-hpa restart
-
将文件放在工作目录中
-
-
搭建nfs
NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。————相等于共享文件夹
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利
-
步骤
- 环境搭建
- 安装nfs服务 sudo apt-get install nfs-kernel-server
- 配置nfs服务,sudo vi /etc/exports
- /opt/imx93/rootfs *(rw,sync,no_subtree_check,no_root_squash)
- /opt/imx93/rootfs:共享目录或文件系统路径
- *:ip地址,这里标识任何ip
- rw:以可读可写方式共享
- no_subtree_check:NFS服务器不会检查共享目录中的子目录是否也可以共享,可以提交性能
- no_root_squash:表示在远程客户端使用root用户访问共享文件时,其权限不会被限制
- /opt/imx93/rootfs *(rw,sync,no_subtree_check,no_root_squash)
- 创建nfs工作目录:sudo mkdir -p /opt/imx93/rootfs
- 重启nfs服务,使配置生效:sudo service nfs-kernel-server restart
- 环境搭建
-
挂载失败
-
“以前使用的16.04版本的ubuntu没问题,现在更换了18.04.4版本,开始报错。
从Ubuntu17.04开始,nfs默认只支持协议3和协议4,而kernel中默认支持协议2。”- 解决:
1, 修改 NFS 配置文件: sudo vim /etc/default/nfs-kernel-server 2, 在末尾添加: RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog" 3,重启nfs服务后就好了 systemctl restart nfs-kernel-server
-
编译环境搭建
- 宿主机:执行编译、连接嵌入式软件的计算机
- 目标机:运行嵌入式软件的硬件平台,最后的嵌入式程序基本运行在目标机上
交叉编译工具链
什么是交叉编译
在一种平台上编译,编译出来的程序放到别的平台上运行,即编译的环境和运行的环境不一样,属于交叉编译
- 本地编译:当前目标平台下,编译处理的程序,放到放弃平台下
- 交叉编译:在一种平台上编译,编译处理的程序,放到别的平台上运行
为什么使用交叉编译工具链:
- 为了跨平台,不同架构的处理器指令集不兼容,使用交叉编译工具链可以实现对应指令集的编译
为什么不在开发板上进行编译:
- 耗时长,开发板性能远远不如PC机,在开发板上编译耗时长
- 硬盘资源浪费,编译时的源文件远远比编译后的可执行文件大,浪费开发板硬盘资源,这种浪费是可以避免的
- 依赖问题:开发板上编译可能需要安装大量的依赖库和工具。可能导致配置错误或版本冲突,使编译过程变得繁琐和复杂
- 调试困难:开发板上缺乏调试工具,可能难以进行调试和故障排除
交叉编译工具链命名规则
gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu
gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf
gcc-linaro-7.4.1-2019.02-x86_64_aarch64-elf
gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf
gcc-linaro-7.4.1-2019.02-x86_64_armv8l-linux-gnueabihf
规则:gcc - [供应商] - [时间] - [宿主机平台架构] - [目标机平台架构] - [操作系统] - [功能]
-
供应商:
- arm —— 是 Codesourcery 公司(目前已经被Mentor收购),基于GCC推出的的ARM交叉编译工具
- linaro —— Linaro 公司基于GCC推出的的ARM交叉编译工具
-
时间:[版本号] - [发布日期]
- 版本号:9.2 、 7.4.1
- 发布日期:2019.12 、 2019.02
-
宿主机平台:
- x86平台:i386、i486、i586、i686
- x86_64平台:x86_64、amd64
- ARM平台:arm、armv6、armv7
-
目标机平台架构:
- arm平台:arm
- arm64平台:aarch68、armv8
-
操作系统
- none:用于编译裸机系统
- none-linux:用于编译linux系统
- linux:用于编译;inux系统
-
功能
-
gnu:gnu协议
-
abi:二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口
-
eabi:标准二进制接口,指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定
-
hf:代表硬浮点(Hard Float),指的是使用硬件浮点支持的浮点运算。
- 为什么64位交叉编译工具链很少有hf:大多数64位平台都已经具备了硬件浮点单元,所以硬浮点功能已经成为64位架构的默认选项
-
elf:代表可执行和可链接格式(Executable and Linkable Format),是一种用于可执行文件、共享库和目标文件的标准文件格式
-
环境变量设置
- 临时环境变量
export ARCH= //一个存储目标架构的环境变量
export CROSS_COMPILE= //交叉编译工具链的前缀
export PATH=$PATH: //存储可执行文件路径的环境变量
-
永久环境变量
修改:vi ~/.bashrc
生效:source ~/.bashrc