搭建RISCV编译环境之后,简单测试并运行riscv程序。利用qemu运行程序时遇到如下问题:
> qemu-riscv32 test
qemu-riscv32: Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 (Success) for use as guest address space (check yourvirtual memory ulimit setting, min_mmap_addr or reserve less using -R option)
根据上面提示,加-R参数【设置预留的虚拟空间大小】,尝试如下:
> qemu-riscv32 -R 0x100000 test
qemu-riscv32: test: requires more than reserved virtual address space (0x101da4c > 0x100000)
继续根据提示,test程序需要至少0x101da4c的空间,所以尝试如下:
> qemu-riscv32 -R 0x2000000 test
qemu-riscv32: Unable to reserve 0x2000000 bytes of virtual address space at 0x1000 (Success) for use as guest address space (check yourvirtual memory ulimit setting, min_mmap_addr or reserve less using -R option)
此时可以发现提示和刚开始提示的差不多,可以看到它现在的提示是在0x1000地址处,无法预留0x2000000大小的地址空间给test程序用。看起来qemu-riscv32仿真程序想把test程序放到0x1000虚拟地址处开始执行,接下来尝试如下:
> qemu-riscv32 -R 0x2000000 -B 0x1000 test
qemu-riscv32: test: requires virtual address space that is in use (omit the -B option or choose a different value)
根据提示,0x1000地址被占用,无法使用,所以继续尝试。
> qemu-riscv32 -R 0x2000000 -B 0x10000 test
发现放到0x10000地址处【及0x10000以上的地址都可以】,程序可以正常执行!
经过测试发现0~0x10000之间的地址应该是qemu-riscv32程序预留的地址空间,没法给用户使用。而且qemu-riscv32仿真的过程好像作为一个操作系统,把test程序加载到一个虚拟内存空间,然后开始执行test程序
不太清楚为什么程序一定要从0x10000及以上才能执行,有没有清楚的大佬帮忙解释一下?