NEMU PA2 必做任务5 实验思路分享

本文包含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的,有问题可以在留言区讨论,能够解决的可以相互帮助。 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值