• 在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的地址,此时的地址都是物理地址。

  • 相关阅读:
    JAVAOO 11 12 15 13 章
    JAVAOO 继承~接口 笔记
    JAVAOO 5~6章笔记
    JAVAOO 1—4章学习重点
    CSS超链接和导航
    XHTML基础
    ZooKeeper伪集群安装配置
    异常,常用类,集合
    继承,抽象,多态,接口
    java oo 第一周
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/15162363.html
Copyright © 2020-2023  润新知