Linux系统移植四大部分:①搭建交叉开发环境。②bootloader的选择和移植【本文选用bootloader下的U-boot】。③uImage的配置、编译与移植。④根文件系统的制作。(①④全部已完成,本文只讲解②③如何搭载这些东西启动移植目标)
注:本文不涉及安装交叉编译工具链流程,文章底部具有交叉编译工具链的下载方式和安装流程,需要可以自取。若有需要自启动模式的,文章底部也会简单介绍。
使用的交叉编译器:arm-none-linux-gnueabi-gcc
本文关键技术点:tftp串口通信、nfs文件挂载、bootm环境启动参数设定
本文移植:linux(主机端)->目标端:开发板(fs4412、搭载exynos4412芯片、armv7架构、cotex-A9型号)
流程:①主机端搭载tftp服务器、创建共享文件夹并配置tftp命令。②主机端设定nfs文件系统路径。③目标端设定启动环境,保证tftp服务器下载启动文件至内存、设定主机端与移植目标端的ip、初始化搭载文件系统命令,保存环境命令。
①主机端搭载tftp服务器、创建共享文件夹并配置tptp命令。
这里我们使用的主机端是ubuntu(18.08 64bit)搭载VmWare Workstation上。首先我们需要下载tftp服务器至linux端口,命令如下:
sudo apt-get install tftpd-hpa tftp-hpa//下载服务器
若下载失败,可能之前有残留文件或未更新导致,可以尝试如下操作:
1.卸载tftp服务器及客户端,并删除配置文件--purge
2.sudo apt-get remove --purge tftpd-hpa tftp-hpa
3.重新安装tftp服务器及客户端
4.sudo apt-get update 更新软件包
5.sudo apt-get install tftpd-hpa tftp-hpa 重新下载
下载完成后,我们需要创建一个共享文件夹,【将测试文件放进去】。这里要注意权限的赋予,保证【共享文件夹】及【测试文件】都具有可读可写的权限。(这里直接给了0777权限)
1.sudo mkdir TFTPShareDir //创建共享文件夹
2.sudo chmod 0777 TFTPShareDir//赋予权限
接下来使用命令更改tftp参数,主要为了链接这个文件夹为共享文件夹
sudo vi /etc/default/tftpd-hpa
更改成这样
1.TFTP_USERNAME="tftp"//配置服务器名称
2.TFTP_DIRECTORY="/home/TFTPShareDir" //配置共享文件夹路径
3.TFTP_ADDRESS="0.0.0.0:69" //配置tftp服务器地址
4.TFTP_OPTIONS="-c -s -l"// 解释起来比较复杂,建议查看tftp手册得到c s l作用
然后重置tftp运行一下就完成了第一步。具体命令为:
sudo service tftpd-hpa restart
②主机端设定nfs文件系统路径。
这里的话我们先将小型文件系统拷贝至我们的linux系统下即可。博主这里用的是rootfs文件包,记住拷贝rootfs小型文件系统的路径,然后更改nfs配置环境即可。命令如下:
先打开nfs配置环境
sudo vim /etc/exports
再更改nfs配置环境
③目标端设定启动环境,保证tftp服务器下载启动文件至内存、设定主机端与移植目标端的ip、初始化搭载文件系统命令,保存环境命令。
现在我们去开发板进行调试,这里我们使用串口录入开发板信息进行调试,搭载的软件为TeraTerm-4.101
先配置开发板的tftp服务器ip,及主机端的服务器ip 命令如下
再配置nfs搜寻命令 这是一句话
1.#setenv bootargs root=/dev/nfs nfsroot=192.168.8.47:/home/farsight/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.8.88 clk_ignore_unused
2.翻译:从服务器192.168.8.47端口将nfs(网络文件系统)下载至板子192.168.8.88。设置串口波特率为115200,随后将其作为内核的根文件目录。 并且忽略时钟的影响。【注:内核需有支持传输nfs的网络驱动】
再配置运行启动命令,这也是一句话。
1.#setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 – 42000000
2.翻译:使用tftp网络通信将内核放置运行内存41000000位置、将设备树文件放至内存42000000位置
然后保存当前配置环境:
#saveent
----------------------我是分割线-------
到这一步,我们的启动命令已经搭载完毕、同时tftp服务器在主机端、目标端都已链接。然后我们直接boot启动板子即可,注意观察tftp是否下载内容,nfs是挂载成功,若搜寻到挂载文件并可正常使用linux命令就是成功了,类似如下:
此时操作板子的文件系统,linux端口也会出现变化,示例如下:(口误,应该是文件)
我们去linux端口去看一下
-------综上,为linux操作系统移植并启动目标(板子)操作--
④接下来放上交叉编译工具链的下载:
如果要自己编译工具链,从以下链接下载源码
crosstools-ng下载地址
http://ymorin.is-a-geek.org/download/crosstool-ng/
同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是
http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/
解压工具链压缩包
$ cd ~
$ mkdir toolchain
$ cd toolchain
将gcc-4.6.4.tar.xz拷贝到toolchain目录下并解压:
$ tar xvf gcc-4.6.4.tar.xz
环境变量的添加,修改文件/etc/bash.bashrc添加如下内容
export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin
重启配置文件:
$ source /etc/bash.bashrc
⑤自启动的配置方法
从EMMC加载内核和文件系统(自启动)
a)拷贝测试文件到虚拟机tftp共享文件夹目录下
b)烧写内核镜像到EMMC上
# tftp 41000000 uImage
# movi write kernel 41000000
c)烧写设备树文件到EMMC上
# tftp 41000000 exynos4412-fs4412.dtb
# movi write dtb 41000000
d)烧写文件系统镜像到EMMC上
# tftp 41000000 ramdisk.img
# movi write rootfs 41000000 300000
e)设置启动参数
# setenv bootcmd movi read kernel 41000000\;movi read dtb 42000000\;movi read rootfs 43000000 300000\;bootm 41000000 43000000 42000000
# saveenv
boot 启动,
f)重新启动开发板,u-boot自动加载、执行内核