Linux学习(二)移植最新版本的Linux,并在QEMU仿真平台进行测试运行。Linux5.14.14

这篇还没写完,凑合能看
注意!!!这篇只是完成了移植linux并在qemu运行,后来发现没有按照要求说的要配置config、自定义编译内核等等!
要求是5.14.9,但是最新发行版是5.14.15,稳定版是5.14.14

建议用buildroot,这篇没用到,相当于只完成了雏形,不适合在工程下使用!
建议用buildroot,这篇没用到,相当于只完成了雏形,不适合在工程下使用!
建议用buildroot,这篇没用到,相当于只完成了雏形,不适合在工程下使用!

重要的事情说三遍!buildroot工具更加完善,以后有空再重做一遍…

一、前提-安装arm的交叉编译工具链

如果你之前完成了crosstool交叉编译链的制作,应该也可以用之前做好的。
arm-linux-gnueabi- 这个字段是后面linux内核编译和busybox编译都需要的参数。

打开ubuntu终端,输入
前两句可以不要,一般只输入第三句就行吧,没安装成功的话,出问题了就三句一起

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc-arm-linux-gnueabi

安装完后可用以下命令查看是否安装成功
dpkg -l gcc-arm-linux-gnueabi
出现ii gcc-arm-linux- 4:5.3.1-1ubu amd64 GNU C compiler for the armel arch即表明安装成功
在这里插入图片描述

二 、最新版linux内核的下载与编译

在这里插入图片描述在网站https://www.kernel.org/ ,我们可以看到最新版是5.14.14
可以直接用wget命令下载最新版,如果你看到的版本更高,更改一下版本号数字应该就可以。
接下来,

1、Linux5.14.14的下载

下面三句指令依次是:

①创建一个文件夹。

之后linux内核、qemu安装包、busybox安装包我都会放在kernel这里。

②进入kernel文件夹。

③下载linux内核最新版。

mkdir kernel
cd kernel
wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.14.14.tar.xz

wget这一句可能会报错,提示没有认证之类的,把提示的后面那个参数复制一下到wget这句后面 好像是 --no-check-certificate

在这里插入图片描述

linux内核下载完成

④解压到当前文件夹

tar -xvf linux-5.14.14.tar.xz
解压完成:
tar -xvf linux-5.14.14.tar.xz

2、 编译linux内核

要在linux-5.14.14文件夹里运行

cd linux-5.14.14

解释一下为什么要在linux-5.14.14用make命令,以为makefile文件在这个文件夹,后面的busybox也是一个道理,busybox文件夹里面也有个makefile
在这里插入图片描述

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

如果上面第一步报错可以试试输入下面两个解决(我自己的环境没有出错,发现其他人有可能会报错,原因是少了依赖)

sudo apt-get install flex
sudo apt-get install bison

要等一段时间了,如下图,已完成。zImage和dtb的位置要知道在哪。
在这里插入图片描述

三、安装qemu

就这一句,不要去下载最新版6.1的,下面这个2.几的够用了。
我试过安装5.0和6.1的,太麻烦了浪费时间。

sudo apt-get install qemu

查看安装的版本:
qemu-system-arm --version
在这里插入图片描述

四、最新版busybox的下载与编译

https://busybox.net/最新版是1.34.1
下面三步

1、下载busybox

①下载busybox最新版

②解压到当前文件夹

③进入busybox文件夹,准备下一步

wget http://www.busybox.net/downloads/busybox-1.34.1.tar.bz2
tar xjf busybox-1.34.1.tar.bz2
cd busybox-1.34.1

在这里插入图片描述

2、 编译busybox

下面三步时间也需要一段时间哈

make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install CROSS_COMPILE=arm-linux-gnueabi-

三步完成后如下图所示
在这里插入图片描述

五、移植之前的准备

1、用busybox制作目录

注意!!!以下命令我全部在自己创建的kernel文件夹下运行的,后面的路径全是相对路径比如
rootfs就是/home/steve/kernel/rootfs

①创建rootfs目录(根目录),根文件系统内的文件全部放到这里

mkdir -p rootfs/{dev,etc/init.d,lib}

②拷贝busybox命令到根目录下

sudo cp busybox-1.34.1/_install/* -r rootfs/

③从工具链中拷贝运行库到lib目录下

sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

上面三步复制了很多文件,然后rootfs文件夹是这样的:

在这里插入图片描述

④ 创建4个tty端终设备

这篇博客作者是菜鸟,不知道这里为什么要四个,就照做吧

sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4

在这里插入图片描述
下面一节我省略了好几步,虽然运行qemu的时候报错,但凑合能用,如果想做的完善一些,可以看这篇博客,这篇博客翻到下面
https://www.linuxidc.com/Linux/2017-09/146890.htm

2、制作根文件系统镜像

① 生成32M大小的镜像

 dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

② 格式化成ext3文件系统

mkfs.ext3 a9rootfs.ext3

③ 将文件拷贝到镜像中

sudo mkdir tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/*  tmpfs/
sudo umount tmpfs

在这里插入图片描述

六、运行qemu

输入以下命令就可以看到qemu系统运行,输入ls可查看文件目录

qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-5.14.14/arch/arm/boot/zImage -dtb  linux-5.14.14/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

上面一行命令可能看不全,如下
我把两个重要路径加粗显示了,
qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-5.14.14/arch/arm/boot/zImage -dtb linux-5.14.14/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append “root=/dev/mmcblk0 console=ttyAMA0” -sd a9rootfs.ext3


可以看到上图有不少报错,没事,程序和程序员有一个能跑就行,按下enter键,就进去了,输入ls查看根目录有哪些文件
如果想解决 cant run '/etc/init.d/rcS’这个报错可以看本篇第八章
在这里插入图片描述

七、测试c语言文件

新制作的系统里面没有c语言文件,我们可以在原Ubuntu系统vim hello.c 输入正确的c语言代码,然后用arm-linux-gnueabi-gcc-5 hello.c -o hello生成可执行文件,把它复制到 rootfs文件夹下面(或者直接在这个文件夹下面生成可执行文件),再运行下面三个命令,查询写一下系统文件目录,再次运行qemu,用ls命令就能看到新的文件,然后输入./hello即可测试c语言文件,可以看到输出了hello,测试成功

sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/*  tmpfs/
sudo umount tmpfs

在这里插入图片描述

八、添加“开机画面”

前面提到的 cant run ‘/etc/init.d/rcS’ 其实可以看做是少了个打印信息的文件,我们到根目录里新建这个文件就行了
rcS其实很重要 可以放一些指令进去

在这里插入图片描述
以下命令在rootfs文件夹下运行

在这里插入图片描述
如果你已经有etc文件夹那就不需要mkdir etc了

mkdir etc ; cd /etc ; mkdir init.d ; cd init.d ; touch rcS
chmod a+x rcS
vi rcS

在这里插入图片描述

输入vi rcS指令后,输入你要打印的东东

echo "    へ     /| "
echo "  /\7    ∠_/ "
echo "  / │   / / "
echo " │ Z _,< /   /丶 "
echo " │     ヽ   /  〉 "
echo " イ● 、 ●  ⊂⊃〈  / "
echo " ()  へ    | \〈 "
echo " >ー 、_  ィ  │ // "
echo "  / へ   / ノ<| \\ "
echo "  ヽ_ノ  (_/  │// "
echo "  7       |/ "
echo "  >―r ̄ ̄丶ー―_ "

这只皮卡丘又胖又猥琐,重开。。。

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值