
前言
在使用香橙派 3 LTS的过程中,总是遇到奇奇怪怪的问题,卡在了Starting Kernel
也不知道怎么排查和解决,于是又找了一个教程更多的 Lichee Pi Nano 进行学习 Linux 的移植流程。
所以这次的移植也是根据「Sipeed 资料站 - Sipeed Wiki」中关于荔枝派 Nano 的相关资料。
主要想达到的目的就是了解 Linux 内核的移植过程,在拿到一块全新的硬件时候要从那一步开始入手以及知道了怎么裁剪内核以后尝试把 Linux 裁剪到最小的内核状态(只保留串口、定时器、中断这些必要的配置与驱动选项),根据源码逻辑进行学习 Linux 驱动的开发。
正文
U-boot 的参数传递 Bootargs
U-Boot
在启动内核时,会向内核传递一些参数(初次之外可以在编译内核时直接进行配置)。
root:
rootfs(根文件系统)
的位置rootfstype:用于指明上述文件系统的系统类型
console:设置 Linux 终端,
console=tty0 console=ttyS0,115200n8
rw
:表示挂载的根文件系统可以读写init:内核启动后,进入系统中运行的一个脚本
rootwait:等待初始化完成
MMC
后再进行挂载的操作
荔枝派 Nano 的 U-BOOT 参数传递:console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
除了这些常用的以外还有包括网络启动的相关参数,可以参考下方的链接中的详细介绍,进行自行搜索。
交叉编译工具链
在编译时选择编译链最好是与相关资料或板级使用使用相同的,以免出现一些问题。
在 Fedora 上有一些库与 Ubuntu 上的命名不同,可以在进行编译时弹出缺少相关库时,再进行搜索后安装。
1 | export PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin" |
该设置仅对当前终端有效,可将内容追加到 ~/.bashrc 并通过 source 使得环境变量永久有效
配置完交叉编译工具就可以进行u-boot
或Kernel
的编译。
Linux Kernel 编译
拉取库中内核
1 | git clone --depth=1 -b master https://gitee.com/LicheePiNano/Linux.git |
内核配置
在移植的过程中,内核的配置关乎着编译的镜像是否能够正常使用。在./arch/xxx/configs/
的路径下有不同板级的配置文件,通用的或主流的板级一般都并入到了 Kernel 的源码当中。
1 | make ARCH=arm f1c100s_nano_linux_defconfig |
内核编译
1 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 |
内核img文件:./arch/arm/boot/zImage
设备树dtb文件: ./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
modules文件夹:./out/lib/modules
需要将内核镜像与设备树 dtb 文件放入 nano 的第一块分区,用于在U-Boot
中将编译的镜像以及设备树文件加载到内存中。
在内核的编译过程中,会对 Linux 编译出来的原始内核文件进行压缩或者文件头的摘除等等。(可以通过 Linux 下的readelf -h vmlinux
查看二进制文件头
vmlinux:Linux 内核编译的原始的内核文件,
elf
格式,未作压缩处理。不能用于启动,常用于定位内核问题Image:Linux 编译时,使用
objcopy
处理上述的 vmlinux 生成,也可以在编译 vmlinux 后直接使用同一工具链中的objcopy
工具。未压缩镜像,可用于引导 Linux 系统启动zImage:使用
gzip
压缩上述的 Image 后,使用objcopy
命令生成的 Linux 内核镜像,可用作 u-boot 的引导镜像文件。uImage:在 zImage 前面增加一个 64 字节的文件头,用于描述文件类型,加载位置,大小等信息。 制作方法则是使用工具
mkimage
根文件系统制作
buildroot
buildroot
可以用来构建小型的文件系统。
1 | wget https://buildroot.org/downloads/buildroot-2021.02.4.tar.gz |
获取到源码以后,同样可以使用make menuconfig
进行编译的配置,参考荔枝派 Nano 的配置如下:
1 | make menuconfig |
编译后检查 /etc/inittab
中参数是否正确。
1 | ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL // 串口登录使能 |
将编译好的rootfs.tar
复制至挂载到主机的 sd 卡(分区1:FAT, 分区2:EXT4)中,并解压。
启动
将存有根文件系统以及启动镜像和设备树文件的 sd 卡插入板卡,进入 u-boot 后按照先前的环境变量bootcmd
,使用fatload mmc
命令将设备树文件和镜像加载至内存0x80C00000
与0x80008000
。
1 | => fatload mmc 0:1 0x80008000 zImage |
参考
U-Boot–bootcmd和bootargs参数-CSDN博客