首页
友链
关于

note-icspa

09 / 24 / 2023 (最后编辑于 04 / 25 / 2024)
预计阅读时间 11 分钟

monitor负责将客户程序读入客户计算机。

init_monitor()

init_isa(): * 将内置客户程序读入内存 * 用uint8_t模拟内存地址 * 读入位置:RESET_VECTOR(于nemu/include/memory/paddr.h) * 初始化寄存器 * restart() * 用结构体CPU_state模拟寄存器(于nemu/src/isa/$ISA/include/isa-def.h) * 在nemu/src/cpu/cpu-exec.c定义全局变量cpu保存寄存器 > x86的物理内存是从0开始编址的, 但对于一些ISA来说却不是这样, 例如mips32和riscv32的物理地址均0x80000000开始. 因此对于mips32和riscv32, 其CONFIG_MBASE将会被定义成0x80000000. 将来CPU访问内存时, 我们会将CPU将要访问的内存地址映射到pmem中的相应偏移位置, 这是通过nemu/src/memory/paddr.c中的guest_to_host()函数实现的. 例如如果mips32的CPU打算访问内存地址0x80000000, 我们会让它最终访问pmem[0], 从而可以正确访问客户程序的第一条指令. 这种机制有一个专门的名字, 叫地址映射

RISC-V ISA

100: jmp 102
101: add
102: xor

jmp指令的下一条静态指令是add指令, 而下一条动态指令则是xor指令.

SEXT:对立即数进行符号扩展,故一般只在最高位出现的部分使用


在riscv32中, 如果mstatus中的MIE位为0, 则CPU处于关中断状态