qemu vexpress

uboot

版本:u-boot-2018.09

1、生成配置文件,

make ARCH=arm vexpress_ca9x4_defconfig

2、图形配置

make menuconfig

3、编译Uboot

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

4、qemu启动uboot

qemu-system-arm -M vexpress-a9 -cpu cortex-a9 -m 256 -kernel u-boot --nographic

5、退出QEMU组合键 ctrl+a,然后按x

参考 https://blog.csdn.net/jqh_111/article/details/83720406

交叉编译器 4.5.1

arm64

make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- qemu_arm64_defconfig
make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- -j4

#gbd调调试启动 
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 256 -kernel u-boot --nographic -s -S

#另外一个terminal
gdb-multiarch -q
target remote localhost:1234
symbol-file u-boot
b xxx
c

kernel

版本:linux-4.4.157

配置

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

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig -j4 O=./object

全编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 O=./object

部分编译

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

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules //编译驱动模块

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs // 编译设备树

nfs启动uImage:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LOADADDR=0x60003000 uImage -j4 O=./object

busybox

版本:busybox-1.31.1

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install

mkdir rootfs
cp share/busybox-1.31.1/_install/* rootfs/ -rfd

mkdir rootfs/lib
cp /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/lib/* rootfs/lib/ -rfp

cd /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/lib
cp so *.a /home/peich/nfsroot/rootfs/lib/ -d

mkdir ~/nfsroot/rootfs/usr/lib/
cd /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/lib
cp so *.a /home/peich/nfsroot/rootfs/usr/lib/ -d

mkdir rootfs/dev
cd rootfs/dev

//创建4该个串口节点
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4

> `mknod -m 666 tty1 c 4 1`命令中
> mknod表示创建结点
> -m设置权限为666
> tty表示串口
> c表示字符设备
> 4表示主设备号,1表示次设备号

//创建工作台节点
sudo mknod -m 666 console c 5 1`

//创建null节点
sudo mknod -m 666 null c 1 3

模拟sd卡启动

cd ~

  1. 生成跟文件系统镜像 rootfs.ext3。bs表示缓冲区大小,count表示块大小。直接把rootfs.ext3看成一张SD卡
dd if=/dev/zero of=rootfs.ext3 bs=1M count=64
  1. 格式化rootfs.ext3
mkfs.ext3 rootfs.ext3
  1. 将各种文件拷贝到文件系统镜像中

需要注意的是,块设备是不能直接读写的,需要挂载到目录,然后对目录进行相应的操作

​ a. sudo mount -t ext3 rootfs.ext3 /mnt -o loop

mount [-fnrsvw] [-t vfstype] [-o options] device dir

-t ext3表示文件系统是ext3格式

其中 -o loop 使用loop模式用来将一个档案当成硬盘分割挂上系统。

​ b. 挂载完毕,输入ls /mnt查看SD卡内容(空的)

​ c. 拷贝文件到SD卡中 sudo cp -rf rootfs/* /mnt/

​ d. 卸载SD卡sudo umount /mnt

启动内核:

无UI

qemu-system-arm -M vexpress-a9 -cpu cortex-a9 -m 256 -kernel ~/share/linux-4.4.157/object/arch/arm/boot/zImage -dtb ~/share/linux-4.4.157/object/arch/arm/boot/dts/vexpress-v2p-ca9.dtb --nographic -append “root=/dev/mmcblk0 rw console=ttyAMA0” -sd rootfs.ext3

有UI

qemu-system-arm -M vexpress-a9 -cpu cortex-a9 -m 256 -kernel ~/share/linux-4.4.157/object/arch/arm/boot/zImage -dtb ~/share/linux-4.4.157/object/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append “root=/dev/mmcblk0 rw console=tty0” -sd rootfs.ext3

参考:

https://blog.csdn.net/ReCclay/article/details/102319392

https://blog.csdn.net/u013738338/article/details/82961049

nfs挂载rootfs

  1. 启动uboot,ping通ubuntu以后,手动传入kernel,dtb,逐渐挂载启动文件系统

cd share/u-boot-2018.09/
sudo qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M -net nic,vlan=0 -net tap,vlan=0,ifname=tap0

  1. 设置ip

setenv ipaddr 192.168.1.65
setenv serverip 192.168.1.63
ping 192.168.1.63

请添加图片描述

  1. tftp下载uImage与dtb

tftp 0x60003000 uImage

或者 tftp 0x60003000 zImage

将下载到内存中的数据与原来的uImage进行比对:

​ qemu模拟的开发板uboot:md 0x60003000

请添加图片描述

​ 本机ubuntu:hexdump -C uImage | less

请添加图片描述

可以看出字节序相反,因为arm默认内存是小端模式

tftp 0x60500000 vexpress-v2p-ca9.dtb

  1. 设置启动参数

setenv bootargs ‘root=/dev/nfs rw nfsroot=192.168.1.63:/home/peich/nfsroot/rootfs,v3 init=/linuxrc ip=192.168.1.65 console=ttyAMA0’

  1. 启动运行

bootm 0x60003000 - 0x60500000

bootz 0x60003000 - 0x60500000

​ 其中bootm、bootz的命令格式

bootm [addr [initrd[:size]] [fdt]]

bootz [addr [initrd[:size]] [fdt]]

​ 命令 bootm、bootz 有三个参数, addr 是 Linux 镜像文件在 DRAM 中的位置, initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可, fdt 就是设备树文件在 DRAM 中的地址。

参考:https://blog.csdn.net/u010344264/article/details/82949143

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值