RTFSC(2)
exec_once()
函数函数覆盖了指令周期的所有阶段: 取指, 译码, 执行, 更新PC
//nemu/src/isa/riscv32/inst.c
/*
* 可以看到每一次我们都是从内存中取出32位(uint32_t)作为指令,然后也让我们的pc+4,因为我们的内存定义为uint8_t pmem[].
*/
int isa_exec_once(Decode *s) {
s->isa.inst.val = inst_fetch(&s->snpc, 4);
return decode_exec(s);
}
/**********************************************/
//nemu/include/cpu/ifetch.h
static inline uint32_t inst_fetch(vaddr_t *pc, int len) {
uint32_t inst = vaddr_ifetch(*pc, len);
(*pc) += len;
return inst;
}
//nemu/src/memory/vaddr.c
word_t vaddr_ifetch(vaddr_t addr, int len) {
return paddr_read(addr, len);
}
/**********************************************/
//nemu/include/cpu/decode.h
typedef struct Decode {
vaddr_t pc;
vaddr_t snpc; // static next pc
vaddr_t dnpc; // dynamic next pc
ISADecodeInfo isa; //还有一些信息是ISA相关的, NEMU用一个结构类型ISADecodeInfo来对这些信息进行抽象, 具体的定义在nemu/src/isa/$ISA/include/isa-def.h中.
IFDEF(CONFIG_ITRACE, char logbuf[128]);
} Decode;
//nemu/include/isa.h
typedef concat(__GUEST_ISA__, _ISADecodeInfo) ISADecodeInfo;
//nemu/src/isa/riscv32/include/isa-def.h
// decode
typedef struct {
union {
uint32_t val;
} inst;
} MUXDEF(CONFIG_RV64, riscv64_ISADecodeInfo, riscv32_ISADecodeInfo);
/**********************************************/
标签:PA2,nemu,依曼,pc,ISADecodeInfo,inst,冯诺,isa,vaddr
From: https://www.cnblogs.com/cilinmengye/p/18127248