文章目录
实验链接
https://pdos.csail.mit.edu/6.S081/2020/labs/pgtbl.html
实验
RISC-V assembly
-
a0-a7,13保存在a2里
-
函数f和g直接被内联优化了,即printf的第2个参数直接是12(f(8)+1的结果).
-
0x640
-
ra保存的是函数调用后返回的地址,由下图可以看出为0x38
-
He110 World(本人的机器是小端的,所以是这个输入,如果是大端的,输出则不一样)
unsigned int i = 0x00646c72; printf("H%x Wo%s", 57616, &i);
-
y的输出结果为0,保存的是a2寄存器中的值。
printf("x=%d y=%d", 3);
Backtrace
该题的主要目的是打印当前进程的调用链,为实现该函数,我们首先需要了解栈的分布情况,如下图所示:
stack
地址从高到低进行增长;sp
: 指向栈的最底端;fp
: 当前栈帧的顶端;return address
是地址是fp-8
prev frame fp
保存地址是fp-16
按照实验提示进行代码更改:
-
kernel/defs.h,添加头文件。
// printf.c void printf(char*, ...); void panic(char*) __attribute__((noreturn)); void printfinit(void); // begin++++ void backtrace(void); // end------
-
kernel/syspro.c,在函数sys_sleep中添加调用
uint64 sys_sleep(void) { int n; uint ticks0; // begin+++++ backtrace(); // end------- if(argint(0, &n) < 0) return -1; acquire(&tickslock); ticks0 = ticks; while(ticks - ticks0 < n){ if(myproc()->killed){ release(&tickslock); return -1; } sleep(&ticks, &tickslock