首先定义了machine结构体,包含了status和mmu
status结构体:包含处理器中的32个普通register和pc
mmu结构体:用于保存处理器内存的所有信息,目前包含entry内存地址(即程序从何处开始执行)
然后定义machine_load_program()用来读取elf文件,获得其文件指针传递给mmu_load_elf()获取elf header,然后将读取的entry地址付给pc寄存器
其中,mmu_load_elf()函数作用就是读取elf header给mmu
知识点:
1)strerror函数和errno的使用
2)C++文本操作
fdopen
fread
3)RV的启动过程
4)交叉编译工具链
root@28e34a0d10c0:/rvemu$ riscv65-unknown-elf-gcc --version
Using built-in specs.
COLLECT_GCC=riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-elf/12.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /home/runner/work/riscv-gnu-toolchain/riscv-gnu-toolchain/gcc/configure --target=riscv64-unknown-elf --prefix=/opt/riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-pkgversion=g2ee5e430018 --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-tm-clone-registry --src=/home/runner/work/riscv-gnu-toolchain/riscv-gnu-toolchain/gcc --disable-multilib --with-abi=lp64d --with-arch=rv64gc --with-tune=rocket --with-isa-spec=2.2 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow'
Thread model: single
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (g2ee5e430018)
5)ELF文件结构
为什么ELF上有entry point?不是加载到memory上之前才会被分配吗?
ELF上的entry point是虚拟地址,并非实际运行的物理地址