【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
除了少部分嵌入式设备使用vxworks和freertos之外,大部分嵌入式都是使用linux来做基础os来使用的。linux使用场景很多,除了大家都知道的android设备、娱乐设备之外,在汽车、工控、网络交换机、服务器等领域,linux也扮演着重要的角色。所以,对于linux或者linux kernel来说,大家没必要神话它,也没有必要轻视它,就把它当成一个工具好了,该优化优化、该加驱动加驱动、该写上层软件写上层软件就行。
前面学习了uboot,板子是可以启动了,但是不能称之为一个完整的系统,因为它还缺少了两样东西,一个是linux kernel,一个是rootfs。
不同厂家的soc,一般对uboot和kernel,他们自己都已经移植好了,用户只需要到对应的地址下载代码编译即可。而对于rootfs,如果本身没有特殊的需求,可以考虑直接使用别人做好的rootfs.tar,这样效率会高很多。
1、下载linux kernel
git clone https://github.com/Lichee-Pi/linux.git -b zero-4.10.y
不出意外,我们就可以下载到4.10.y版本的linux内核代码,首先,配置config文件
make ARCH=arm licheepi_zero_defconfig
接着,开始编译内核,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
这个时候就可以搜索发现,生成了一个zImage文件,接着继续编译设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
最后就是生成驱动modules,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules
当然,如果需要自己把驱动放到统一的目录里面,就可以这么做,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules_install
2、编译rootfs
关于rootfs,一般都是用buildroot进行配置编译的。之前练习的时候,下载的buildroot版本是buildroot-2017.08.tar.gz。这部分还是建议使用别人编译好的根文件系统,差别不大,编译好之后,在./output/images目录下面,会有一个rootfs.tar文件,这就是我们需要的根文件系统。在文章的最后,我们也给出了自己编译好的rootfs.tar下载地址,供大家参考。
3、烧入sd卡
除linux kernel编译和rootfs编译之外,另外很重要的一个部分就是sd卡烧入。所有的操作都是在ubuntu虚拟机里面完成的,有这么几个流程,
3.1 分区
利用ubuntu里面的fdisk进行分区,输入
sudo fdisk /dev/sdb
分成两个区即可,第一个分区32M,剩下的空间留给另外一个分区,注意在第一个分区的最后一步输入+32M即可。
3.2 在刚才创建好的分区构建文件系统
sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
3.3 重新插拔sd卡
sudo sync
sudo eject /dev/sdb
3.4 拷贝文件
把zImage和sun8i-v3s-licheepi-zero.dtb拷贝到vfat分区,与此同时把rootfs.tar拷贝到ext4分区,并解压,
tar -xvf rootfs.tar ./
因为之前已经烧入过uboot,这步可以省略,当然不放心的话,可以再烧入一下,
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
3.5 重启板子,因为uboot中我们没有对代码进行修改,所以uboot启动后,需要输入下面这些命令,才能启动kernel
setenv bootm_boot_mode sec
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb
setenv bootargs console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0
bootz 0x41000000 - 0x41800000
4、效果图
之前说过,uboot启动后,如果需要进入Linux,那么需要进行一些配置,效果如下,
所有命令输入完毕之后,也就是输入bootz 0x41000000 - 0x41800000后,kernel就可以开始启动了,
因为目前驱动的内容比较少,上层软件也不多,所以不到2s就启动结束,这里输入rootfs之后,马上就进入根文件系统了,
至此,一个最小的嵌入式linux系统就已经实实在在的跑起来了。
注:
最后为了大家使用方便,这里给出rootfs.tar资源,有小伙伴希望直接可以拿过来用的话,那么可以直接下载使用,https://download.csdn.net/download/feixiaoxing/87816983。