Porting LicheeNano
Czz Hardcore

前言

在使用香橙派 3 LTS的过程中,总是遇到奇奇怪怪的问题,卡在了Starting Kernel也不知道怎么排查和解决,于是又找了一个教程更多的 Lichee Pi Nano 进行学习 Linux 的移植流程。

所以这次的移植也是根据「Sipeed 资料站 - Sipeed Wiki」中关于荔枝派 Nano 的相关资料。

主要想达到的目的就是了解 Linux 内核的移植过程,在拿到一块全新的硬件时候要从那一步开始入手以及知道了怎么裁剪内核以后尝试把 Linux 裁剪到最小的内核状态(只保留串口、定时器、中断这些必要的配置与驱动选项),根据源码逻辑进行学习 Linux 驱动的开发。

正文

U-boot 的参数传递 Bootargs

U-Boot在启动内核时,会向内核传递一些参数(初次之外可以在编译内核时直接进行配置)。

  • rootrootfs(根文件系统)的位置

  • 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
2
3
export PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
export CROSS_COMPILE=arm-linux-gnueabi-
export ARCH=arm

该设置仅对当前终端有效,可将内容追加到 ~/.bashrc 并通过 source 使得环境变量永久有效

配置完交叉编译工具就可以进行u-bootKernel的编译。

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
2
3
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16	
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 INSTALL_MOD_PATH=out modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 INSTALL_MOD_PATH=out modules_install

内核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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
make menuconfig

以下选项为基础配置:

- Target options
- Target Architecture (ARM (little endian))
- Target Variant arm926t
- Toolchain
- C library (musl) # 使用musl减小最终体积
- System configuration
- Use syslinks to /usr .... # 启用/bin, /sbin, /lib的链接
- Enable root login # 启用root登录
- Run a getty after boot # 启用登录密码输入窗口
- (licheepi) Root password # 默认账户为root 密码为licheepi

另可自行添加或删除指定的软件包
--------------------------------------------------------------------------------------------------------------------------------
Target options --->

Target Architecture Variant (arm926t) ---> // arm926ejs架构
[ ] Enable VFP extension support // Nano 没有 VFP单元,勾选会导致某些应用无法运行
Target ABI (EABI) --->
Floating point strategy (Soft float) ---> // 软浮点

System configuration --->

(Lichee Pi) System hostname // hostname
(licheepi) Root password // 默认账户为root 密码为licheepi
[*] remount root filesystem read-write during boot // 启动时重新挂在文件系统使其可读写

编译后检查 /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命令将设备树文件和镜像加载至内存0x80C000000x80008000

1
2
3
4
5
6
7
8
9
10
11
=> fatload mmc 0:1 0x80008000 zImage
reading zImage
3656328 bytes read in 191 ms (18.3 MiB/s)
=> fatload mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
reading suniv-f1c100s-licheepi-nano.dtb
7991 bytes read in 25 ms (311.5 KiB/s)
=> bootz 0x80008000 - 0x80C00000
## Flattened Device Tree blob at 80c00000
Booting using the fdt blob at 0x80c00000
Loading Device Tree to 80e03000, end 80e07f36 ... OK

参考

U-Boot–bootcmd和bootargs参数-CSDN博客

Linux内核映像vmlinux、Image、zImage、uImage区别 - 知乎 (zhihu.com)

buildroot 登陆及密码问题总结_buildroot用户名密码___pop_的博客-CSDN博客