MMU 的相关整体设计如下:
from pwn import *
elf = ELF("build/kernel.elf", checksec=False)
text = elf.get_section_by_name(".text").data()
text_size = elf.get_section_by_name(".text").data_size
assert(text_size == len(text))
text = text + b"\x00" * (align_to_page(text_size) - text_size)
# 同理 rodata、data
bss_size = elf.get_section_by_name(".bss").data_size
total_bytes = text + rodata + data + b"\x00" * bss_size
with open("memory.hex", "w") as f:
for byte in total_bytes:
f.write(hex(byte)[2:].zfill(2) + "\n")
void putc(char c) {
asm volatile("sb %0, 0(%1)" : : "r"(c), "r"(0x10000000));
}
// arch/riscv/kernel/trap.c
... else if (regs->x[17] == SYS_yield) {
current->counter = 0;
schedule();
} ...
// user program
...
for (unsigned int i = 0; i < 100000000; i++);
yield();
...
if (register[write_addr] != write_data) begin
$fwrite(dump_fd, "[%h] x%d 0x%h\n", CoreSim.core.cpu.MEM_WB_pc, write_addr, write_data);
end
def invoke(self, arg, from_tty):
while True:
gdb.execute("si")
regs = self.parse_registers(gdb.execute("info registers", to_string=True))
for reg in self.register_names:
if regs[reg] != self.regs[reg]:
...
self.output.write(f"[{pc}] x{idx} 0x{new}\n")
self.regs = regs