用QEMU搭建arm开发环境之七:编译uboot,并启动ubuntu文件系统

1.下载并编译uboot

官方下载地址:ftp://ftp.denx.de/pub/u-boot/

如果下载比较慢可以从这里下:

链接:https://pan.baidu.com/s/1WPdpB6L-p9ha3-8AuZKM4g 
提取码:04vi

我们选择的是这个版本:u-boot-2017.01.tar.bz2

首先解压缩上面的代码,然后配置qemu支持的版本,然后编译

tar jxvf u-boot-2017.01.tar.bz2
cd u-boot-2017.01
make vexpress_ca9x4_defconfig ARCH=arm
ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make all -j16

编译成功后,产生三个文件

- "u-boot.bin" is a raw binary image
- "u-boot" is an image in ELF binary format
- "u-boot.srec" is in Motorola S-Record format

我们测试一下这个u-boot是否能正常启动:

qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic

如果启动正常,显示类似如下:

$ qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument


U-Boot 2017.01 (Jul 11 2020 - 00:35:07 +0800)

DRAM:  512 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC:   MMC: 0
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   smc911x-0
Hit any key to stop autoboot:  0 
=> 
=> 

按Ctrl+A+X可以退出QEMU.


2.制作uboot启动文件

首先需要安装:sudo apt install u-boot-tools

因为uboot所需的启动文件不同于我们默认的启动文件(要在文件前面加上头部),所以需要把之前做好的文件做改造.

mkimage -n 'linux' -A arm -O linux -T kernel -C none -a 0x60008000 -e 0x60008000 -d Image uImage

mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Rootfs" -d ramdisk.gz ramdisk.gz.uboot

这样uboot所需的文件就做好了,然后我们启动qemu

qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic -sd boot.vfat

当uboot启动起来后,按回车停止uboot,然后输入如下命令:

fatload mmc 0:0 60008000 zimage;fatload mmc 0:0 61008000 vexpress-v2p-ca9.dtb;fatload mmc 0:0 62008000 ramdisk.gz.uboot;bootz 60008000 62008000 61008000

注:如果想要启动刚才制作的uImage也是可以的,把上面的zImage换成uImage,bootz换成bootm.(uImage就是没有压缩的zImage,然后用uboot工具加了一个头)

启动后会显示下面的内容:

mount root file system successfully...
enter new root...
switch_root: can't open '/dev/console': No such file or directory
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100

CPU: 0 PID: 1 Comm: busybox Not tainted 4.4.229+ #7
Hardware name: ARM-Versatile Express
[<800155e8>] (unwind_backtrace) from [<80011ffc>] (show_stack+0x10/0x14)
[<80011ffc>] (show_stack) from [<80247198>] (dump_stack+0x84/0xa4)
[<80247198>] (dump_stack) from [<800a3428>] (panic+0x8c/0x1f4)
[<800a3428>] (panic) from [<8002645c>] (do_exit+0xa20/0xa4c)
[<8002645c>] (do_exit) from [<80026554>] (do_group_exit+0x3c/0xd0)
[<80026554>] (do_group_exit) from [<800265f8>] (__wake_up_parent+0x0/0x18)
---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100

上面日志说明uboot启动内核和ramdisk已经成功了,但是跳转到文件系统的时候失败了.

3.制作ubuntu文件系统

因为ubuntu文件系统启动文件位置不同,所以首先修改ramdisk里面的init脚本中的下面这句话:

exec $BUSYBOX switch_root -c /dev/console /newroot /sbin/init

然后我们使用下面的命令重新制作uboot所需的ramdisk镜像

mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Rootfs" -d ramdisk.gz ramdisk.gz.uboot

从这里下载一个ubuntu的基本文件系统:

链接:https://pan.baidu.com/s/19j9Xxt_ZmqldzBNFrZIJ_A 
提取码:294w

然后我们开始制作ubuntu的文件系统

dd if=/dev/zero of=rootfsubuntu.ext3 bs=1M count=1000

mkfs.ext3 rootfsubuntu.ext3

sudo mount rootfsubuntu.ext3 mnt

cd mnt

tar xvf /mnt/hgfs/vm_share/ubuntu-18.04.1-minimal-armhf-2018-11-26.tar.xz

mv ubuntu-18.04.1-minimal-armhf-2018-11-26/* .

rm -rf image-builder.project lost+found ubuntu-18.04.1-minimal-armhf-2018-11-26 user_password.list

sudo tar xvfp ../armhf-rootfs-ubuntu-bionic.tar -C .

sudo rm ../armhf-rootfs-ubuntu-bionic.tar

cd boot

sudo cp ../../zImage .

sudo cp ../../vexpress-v2p-ca9.dtb .

sudo cp ../../ramdisk.gz.uboot .

cd ../..

sudo umount mnt

这样文件系统就做好了,然后我们启动qemu:

qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic -sd rootfsubuntu.ext3

启动成功后,按回车停下来,输入下面的命令:

ext4load mmc 0:0 60008000 boot/zImage;ext4load mmc 0:0 61008000 boot/vexpress-v2p-ca9.dtb;ext4load mmc 0:0 62008000 boot/ramdisk.gz.uboot;bootz 60008000 62008000 61008000
 

如果Ubuntu启动成功,会出现类似下面的内容:

[  OK  ] Started Connection service.
[  OK  ] Reached target Network.
         Starting Permit User Sessions...
         Starting A high performance web server and a reverse proxy server...
[  OK  ] Started Permit User Sessions.
         Starting Set console scheme...
[  OK  ] Started Serial Getty on ttyAMA0.

Ubuntu 18.04.1 LTS arm ttyAMA0

default username:password is [ubuntu:temppwd]

输入用户名:ubuntu,密码:temppwd就可以进入ubuntu了.

 

鸣谢:本文部分内容来自下面的链接,感谢相关作者的贡献.如侵权或需要删除请联系我.

https://blog.csdn.net/rfidunion/article/details/54670625

https://blog.csdn.net/qq_24188351/article/details/77891353

https://blog.csdn.net/rfidunion/article/details/55254424?utm_source=blogxgwz1

https://www.cnblogs.com/AMDDMA/articles/10815053.html

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值