xv6 CPU alarm 疑问

在做MIT 6.828中的CPU alarm homework时,比较纠结的几个问题, 也是作业网址https://pdos.csail.mit.edu/6.828/2014/lec/l-lockv2.txt提出来的问题,

Q1: how to transfer execution to handler function?
Q2: where is user EIP stored while in trap?
Q3: how did user EIP get there?
Q4: when will handler start executing?
Q5: how to have handler return to interrupted user instructions?
Q6: on what stack should handler execute (user or kernel)?
Q7: why not call handler directly from trap()? e.g. (*proc->alarmhandler)()
     ("works" but write() sys call arguments pushed on wrong stack)
具体代码见这位前辈http://blog.csdn.net/catoldcui/article/details/16797863,结合代码我基本摸清了实现过程,现在回答上述问题:

Q1&Q2&Q3;handler function 的函数指针值是通过syscall中断中参数传递进来的,具体位置在e*x寄存器中;

Q4:根据时间中断计数来判断是否执行;

Q5:将被中断的用户程序所存放在trapframe中的tf-》eip改成handler function的入口地址,然后等中断结束,回到用户态执行tf-》eip处的程序,即handler function;

Q6:user stack;

Q7:据括号中描述,wrong stack 应该指得是write系统函数使用用户进程的堆栈来访问参数,因为在kernel态调用write是不会切换栈的,所以此时的参数实际上已经被压到了内核的栈中,因此write使用用户进程的栈来读取参数是没法得到的。其实有个疑问:xv6中的系统函数实现和lab4中的系统函数实现略有不同,后者是通过寄存器来传递参数的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值