在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的地址,此时的地址都是物理地址。
本文来自博客园,作者:dolinux,未经同意,禁止转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2016-08-19 Linux驱动开发——__stringify
2013-08-19 【转载】Ubuntu下SVN安装和配置
2013-08-19 【转载】关于shell中的basename
2013-08-19 tar的-t参数使用