随笔 - 394  文章 - 0  评论 - 946  阅读 - 143万 

前言

之前我们成功的将U-Boot进行了编译和移植,这章主要讲解linux内核的编译和移植。

说道linux内核,我便会想起linus这个人,拜他所赐,使得全世界拥有了这么个操作系统。同时由于目前硬件设备的急剧成熟化和规模化,使得在一块不到30块钱的设备上运行移植过的linux也不是什么难事儿了。所以在后面的物联网发展道路上,linux注定会一路高歌。

作为linux的喜好者,我向来不吝啬把自己的赞美送给这个已经比自己年纪还大的操作系统。不仅仅因为他的便捷移植性,更因为他的开源,以及由开源所体现出来的各种合作精神。相信拥抱过开源后的人,一定也会成为开源的布道者,而linux则值得让我们这样做。

linux内核编译

编译linux内核前,我们需要设置交叉编译链,但是由于第一章中,已经设置好了交叉编译链,所以这里无需重复设置。而linux内核的下载,可以在这里进行:

1
git clone https://github.com/Icenowy/linux.git -b f1c100s-480272lcd-test

下载下来后,传到虚拟机上解压。

之后,我们需要进入到linux内核目录来配置menuconfig,命令如下:

1
make ARCH=arm menuconfig

 这条命令执行后会打开linux内核裁剪的menuconfig,这里我们可以根据自己的需要进行特性的裁剪。选择好后,保存之后,会在源码根目录下将我们的配置写入到.config文件中备用。需要说明的是,由于荔枝派nano这里已经为我们配置好了.config,所以我们直接点击链接下载,并将此config文件拷贝到源码根目录, 然后利用如下命令将config文件改为.config即可。

1
mv config .config

之后,我们就开始进行正式的编译流程了,在根目录中执行如下命令:

1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16

 此时屏幕会进行输出,开始进行正式的编译流程。期间可能会遇到若干问题,目前通过百度基本上都可以解决。

比如,编译过程中我遇到的一个问题,记录在了挖坑网上,通过百度,修改源码后得以解决,这里我不准备贴具体的错误信息了,大家可以点开自行翻阅。

漫长的等待,一般需要30分钟左右的编译时间,看到如下的结果,就代表编译成功了:

image

zImage is ready 代表着linux内核编译成功,并且已经生成到了/arch/arm/boot/目录下,我们接下来只需要将其拷贝到第一分区中即可。

制作分区

由于这里我们还没有制作分区,这里需要制作一下,总共需要制作两个分区,其中zImage文件和dtb设备树文件放到第一个分区,而根文件系统rootfs.tar需要放到第二个分区。

首先,利用命令打开gparted工具,然后分别创建第一个,第二个分区,第一个分区为fat16格式,给16mb大小,第二个分区为ext4格式,给4gb大小:

 

 

分区点好后,点击上面的对勾,即可把两个分区正确的做出来了。从图上,我们可以看出,第一分区为/dev/sdb1, 第二分区为/dev/sdb2.

进入到zImage所在的目录(arch/arm/boot),然后执行如下命令,将其拷贝到第一分区(由于sdb没法直接访问,需要先挂载,才能访问):

1
2
3
4
5
sudo mkdir /mnt/sdb1                      //创建一个临时目录
sudo mount /dev/sdb1 /mnt/sdb1            //将sdb1挂载到此临时目录
sudo cp zImage  /mnt/sdb1                 //拷贝到sdb1中,此时sdb1中已经能看到文件
sudo sync
sudo umount /dev/sdb1

设备树文件

之后进入目录/linux-mi/linux-f1c100s-480272lcd-test/arch/arm/boot/dts中,可以看到存在着suniv-f1c100s-licheepi-nano.dts文件,我们使用如下命令对其进行修改:

1
nano suniv-f1c100s-licheepi-nano.dts

整体的修改方法,这里有提示,我们可以按照我们的需求进行更改,改完之后保存,然后利用如下命令进行编译:

1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j16

编译完毕,会在当前目录生成suniv-f1c100s-licheepi-nano.dtb文件,将此文件也拷贝到第一分区即可,命令如下:

1
2
3
4
5
sudo mkdir /mnt/sdb1              //创建一个临时目录
sudo mount /dev/sdb1 /mnt/sdb1    //将sdb1挂载到此临时目录
sudo cp suniv-f1c100s-licheepi-nano.dtb /mnt/sdb1   //拷贝到sdb1中,此时sdb1中已经能看到文件
sudo sync
sudo umount /dev/sdb1

整体操作完毕后,可以看到俩文件都拷贝到第一分区来了:

需要注意的是,如果执行umount操作,提示busy:umount: /mnt/sdb2: target is busy.,无法卸载的时候,可以尝试将当前cmd窗口关闭,然后在新窗口中进行umount即可,或者退出当前/mnt目录。

将卡插入荔枝派nano,得到的输出结果如下:

可以看到,成功进入了内核,由于没有根文件系统,所以系统暂停了,接下来一章,我们就来讲解如何制作根文件系统。

参考

http://nano.lichee.pro/build_sys/kernel.html

posted on   程序诗人  阅读(541)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示