之前已经成功在orangepi zero2开发板上将底层的开机启动过程处理完毕了,接下来就需要让它做一点符合它四核cortex-A53身份的事情了:运行操作系统. 首先从Linux内核官网中获取主线内核, 将源码压缩包下载下来后在Ubuntu下解压缩, 然后打开源码目录, 先使用默认配置:
linux> make ARCH=arm64 CROSS_COMPILE=(your crosscompiler) defconfig
ARM64架构下的源码目录和ARM架构下的源码目录有很大不同,在ARM目录下各个半导体厂商都会编写自己芯片的默认配置文件保存在arch/arm/configs目录下面,但是在ARM64架构下只有一个默认配置文件,因为ARM64是较新的架构,所以这种目录安排也体现了这几年Linux内核的发展风格逐渐趋于简约. defconfig将必要的模块编译进入到内核中,其他不必须的模块编译成模块. 这样直接使用默认配置编译而成的内核镜像大小为40Mb左右。由于默认配置中编译了大量冗余部分,故我们要根据自己的需求进行裁剪。
在生成默认配置文件后,我们采用图形窗口的形式进行裁剪:
linux> make ARCH=arm64 CROSS_COMPILE=(Your cross_compile) menuconfig
然后我们就进入了大家熟悉的图形配置窗口:
这个窗口的第二行,从名字可以看出这里面的配置是和各个平台相关的,我们选中进入:
![配置完成的内容](https://img-blog.csdnimg.cn/71d6059cb06544bb85c5a6bfe22e49c8.png)
H616是全志(Allwinner)生产的,所以我们取消掉其他半导体公司的选项,至于这些配置的具体内容我们可以到arch/arm64/Kconfig.platform中查看:H616相关的配置选项如下:
前三项配置选项从名字便可大概知道作用,后三项分别是时钟相关配置,中断控制器相关配置,不可屏蔽中断的配置,c代码位于drivers/irqchip目录中。另外[ ]ARMv8 software model (Versatile Express)这个选项也可选上,从Kconfig文件来看这个选项主要是针对电源管理PM和GPIO进行了配置,因为H616是Cortex-A53核心的,所以这个选项勾选上。
之后我们进入到Device Drivers中进行配置,首先GNSS选项是针对卫星导航系统的,从电路图上得知我们的开发板没有导航模块,故取消选择:
然后Soundwire support是音频总线协议,我的后续开发暂时用不到,取消选择:
然后进入 Multimedia support目录,再进入media device types目录,
如图,取消掉开发板不存在的外设。
然后进入Digital TV options,取消所有选择:
退出Multimedia support目录后,进入Graphics support目录:
这个界面的默认配置会选择上海思麒麟系列SOC平台和一众其他平台的芯片,我们要取消选择,另外通过查阅全志H616的芯片手册(第294页)可以得知:
![](https://img-blog.csdnimg.cn/02692e60a23f4b688f31daf7b28366e6.png)
H616采用的是ARM mali-G31核的GPU。ETNAVIV选项是针对使用Vivante的IP核的芯片,所以这个选项要取消选择,另外取消上方英伟达的驱动,然后选择将Panfrost编译为模块:
到目前为止已经完成了内核的配置,保存,退出。
编译内核。
linux> make ARCH=arm64 CROSS_COMPILE=(...)
执行内核的编译和链接过程,并且在arch/arm64/boot目录下生成Image文件这个文件就是内核的二进制镜像文件. 内核的make过程将各个.o和.a文件链接后产生的文件是vmLinux,这个文件因为是链接后的第一产物所以还保留这ELF格式的各种段, 和在上篇的u-boot源码编译链接后在源码根目录下产生的名为u-boot的文件一样都是ELF格式. 但是因为无论是u-boot还是Linux内核都是直面底层硬件的软件程序, 而ELF格式的可执行文件需要在操作系统提供的虚拟化环境下才能被解释和运行,故make过程最后还需将vmLinux的代码段(.text)段单独抽离出来生成Image, 在编译ARM时生成的zImage又是Image经过gzip压缩后的结果. 启动zImage需要uboot的bootz的支持. 将这个Image拷贝到上篇制作的SD卡中的fat32文件系统中, 再将/arch/arm64/boot/dts/allwiner/中的zero2文件拷贝到那里.
启动orangepi zero2开发板, 在boot界面用setenv命令更改bootcmd:
u-boot> setenv bootcmd 'fatload mmc 0:1 0x40200000 Image;fatload mmc 0:1 0x4fa00000 sun50i-h616-orangepi-zero2.dtb;booti 0x40200000 - 0x4fa00000'
然后再更改bootargs.(为之后引导内核挂载根文件系统做准备)
u-boot> setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw'
u-boot> saveenv
这里的bootargs变量最终会传递给内核start_kernel函数调用的setup_command_linene)函数, root变量表明根文件系统的位置是mmc0的第二分区.
用boot命令启动内核, 这种情况下内核提示kernel panic说未找到根文件系统, 那么接着就需要制作根文件系统了.