在Qemu+ARM上运行Minix3内核

简介: 在Qemu+ARM上运行Minix3内核

参考

https://www.minix3.org/

https://github.com/Stichting-MINIX-Research-Foundation/minix

https://wiki.minix3.org/doku.php?id=developersguide:minixonarm

交叉编译

./releasetools/arm_sdimage.sh

运行

qemu-system-arm -M beaglexm -serial stdio -drive if=sd,cache=writeback,file=/home/pengdonglin/data0/minix3/minix/minix_arm_sd.img

qemu-system-arm

目前主线的Qemu不支持beaglexm,需要使用linaro的qemu:git clone git://git.linaro.org/qemu/qemu-linaro.git

下面是我静态编译好的qemu-system-arm:

链接: https://pan.baidu.com/s/1fs1xVOtGkOSEJFtR7ShEFw

提取码: akwc

启动log:

链接: https://pan.baidu.com/s/1-1TEm3obcDP69gE7C9RULw

提取码: bq9x

u-boot启动命令bootcmd:

mmc dev ${mmcdev}; 
if mmc rescan; then
if run userbutton; then
                setenv bootenv uEnv.txt;
else
                setenv bootenv user.txt;
fi;
echo SD/MMC found on device ${mmcdev};
if run loadbootenv; then
echo Loaded environment from ${bootenv};
                run importbootenv;
fi;
if test -n $uenvcmd; then
echo Running uenvcmd ...;
                run uenvcmd;
fi;
if run loaduimage; then
                run mmcboot;
fi;
fi;
run nandboot;

上面用到的uEnv.txt是在编译时在minix/releasetools/arm_sdimage.sh中调用gen_uEnv.txt.sh生成的,内容如下:

uenvcmd=run mmcbootcmd
bootargs=console=tty02 rootdevname=c0d0p1 verbose=0 hz=1000
bootminix=setenv bootargs \$bootargs board_name=\$board_name ; echo \$bootargs; go  0x80200000 \\\"$bootargs\\\"
mmcbootcmd=echo starting from MMC ; mmc part 0; ; fatload mmc 0:1 0x80200000 kernel.bin; fatload mmc 0:1 0x82000000 ds.elf; fatload mmc 0:1 0x82800000 rs.elf; fatload mmc 0:1 0x83000000 pm.elf; fatload mmc 0:1 0x83800000 sched.elf; fatload mmc 0:1 0x84000000 vfs.elf; fatload mmc 0:1 0x84800000 memory.elf; fatload mmc 0:1 0x85000000 tty.elf; fatload mmc 0:1 0x85800000 mib.elf; fatload mmc 0:1 0x86000000 vm.elf; fatload mmc 0:1 0x86800000 pfs.elf; fatload mmc 0:1 0x87000000 mfs.elf; fatload mmc 0:1 0x87800000 init.elf ; run bootminix
# Netbooting.
serverip=192.168.12.10
ipaddr=192.168.12.62
usbnet_devaddr=e8:03:9a:24:f9:10
usbethaddr=e8:03:9a:24:f9:11
netbootcmd=echo starting from TFTP;  ; tftp 0x80200000 kernel.bin; tftp 0x82000000 ds.elf; tftp 0x82800000 rs.elf; tftp 0x83000000 pm.elf; tftp 0x83800000 sched.elf; tftp 0x84000000 vfs.elf; tftp 0x84800000 memory.elf; tftp 0x85000000 tty.elf; tftp 0x85800000 mib.elf; tftp 0x86000000 vm.elf; tftp 0x86800000 pfs.elf; tftp 0x87000000 mfs.elf; tftp 0x87800000 init.elf ; run bootminix

启动命令中会执行uenvcmd的内容,也就是run mmcbootcmd,这个函数完成后续镜像的加载,加载到内容中后,执行了run bootminix,这个命令更新了一下bootargs,然后直接跳转到0x80200000开始运行。

从mmcbootcmd的内容可以看到,这个地址上存放的是kernel.bin,这里的kernel.bin就是minix的内核部分,链接脚本是:minix/kernel/arch/earm/kernel.lds,内核的入口是minix/kernel/arch/earm/head.S。

往kernel跳转时,使用的命令是go 0x80200000 \"$bootargs\",这样当跳转到内核时,R0寄存器中存放的是内核入口地址0x80200000,R1中存放的是bootargs的地址,此时的地址都是物理地址。

相关文章
|
Docker 容器
x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
1495 1
|
3月前
|
Ubuntu KVM 虚拟化
基于ARM64的Qemu/KVM学习环境搭建
基于ARM64的Qemu/KVM学习环境搭建
|
4月前
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
367 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
3月前
|
Ubuntu NoSQL Linux
在Ubuntu上用Qemu模拟ARM版本的Fedora39
在Ubuntu上用Qemu模拟ARM版本的Fedora39
|
3月前
|
NoSQL Ubuntu Linux
基于ARM64的Qemu/KVM学习环境搭建2
基于ARM64的Qemu/KVM学习环境搭建2
|
7月前
|
NoSQL Linux 开发工具
百度搜索:蓝易云【VSCode+GDB+Qemu调试ARM64 linux内核教程。】
请注意,根据你的具体环境和需求,上述步骤可能会有所调整和修改。建议参考相关文档和资源,以获得更详细的配置和调试指南。
102 0
|
NoSQL Ubuntu Linux
掌握QEMU虚拟化技术:搭建ARM64+Linux调试环境实战指南
掌握QEMU虚拟化技术:搭建ARM64+Linux调试环境实战指南
|
监控 Ubuntu C#
Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果
Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果
172 0
|
NoSQL 网络协议 数据可视化
ARM深入理解-hypervisor调试方法二(QEMU+GDB调试ARM程序)
ARM深入理解-hypervisor调试方法二(QEMU+GDB调试ARM程序)