本文包含NEMU实验(天津大学)中PA2必做任务5的完整实验思路,后续任务慢慢更新,仅为个人完整思路分享,欢迎指正!
必做任务5
修改好Makefile中对于kernel的进入配置,我们就需要修改具体的加载代码了
kernel/src/elf/elf.c
...
/* TODO: fix the magic number with the correct one */
//修改为elf文件的魔数
const uint32_t elf_magic = 0x464c457f;
uint32_t *p_magic = (void *)buf;
nemu_assert(*p_magic == elf_magic);
/* Load each program segment */
//初始化ph指向program header开头,buf指向elf文件的开头,e_phoff为program header偏移量
ph = (void *)buf + elf->e_phoff;
//eph指向program header的末尾,e_phnum为program header中segment的数量
//遍历program header表,加载需要加载的segment
for(Elf32_Phdr *eph = ph + elf->e_phnum;ph < eph;ph++) {
/* Scan the program header table, load each segment into memory */
if(ph->p_type == PT_LOAD) {
uint32_t addr = ph->p_vaddr; //存储segment加载到的目标地址
/* TODO: read the content of the segment from the ELF file
* to the memory region [VirtAddr, VirtAddr + FileSiz)
*/
//利用函数从当前segment中读取filesiz大小的数据到目标地址
ramdisk_read((void *)addr, ELF_OFFSET_IN_DISK + ph->p_offset,ph->p_filesz);
/* TODO: zero the memory region
* [VirtAddr + FileSiz, VirtAddr + MemSiz)
*/
//通过函数将未初始化的数据置0
memset((void *)addr + ph->p_filesz,0,ph->p_memsz - ph->p_filesz);
...
make kernel后假如发现运行时候全部都FAIL了,大概率是因为指令没有补全,可以单独回到make run中跑一下integral和quadratic-eq程序,这个时候可能原来单独测试能过的,现在又会提示有指令没有补充完,补充完整就没问题了(可能是因为链接了FLOAT.a文件吧,具体原因我也不了解)并且记得add里面假如加了断点要去掉哦!这部分挺多bug的,有问题可以在留言区讨论,能够解决的可以相互帮助。
2826

被折叠的 条评论
为什么被折叠?



