天天看點

在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的位址,此時的位址都是實體位址。

繼續閱讀