lab4

准备

 uservec做的事情:1.交换a0和 sscratch,然后a0就是TRAPFRAME了。(这里没懂,先记录下)2.将寄存器的值保存到trapframe中。3. 将a0的值(现在存在了sscratch中)也保存到trapframe4. 从trapframe中恢复内核的一些数据。(设置kernel pagetable等)5. 跳转到usertrap()

疑惑a0寄存器有啥用。
解答:在uservec执行前,所有的寄存器都保存了进程被中断时候的值。

    usertrap():1.首先看trap是不是来自user mode,然后将stvec设置为kernelvec。2. 保存当前进程的program counter。3. 判断是系统调用,设备中断,还是exception。然后采取相应措施。注意,如果是系统调用的话,program counter要加4,因为希望执行下一条指令。4. 调用usertrapret。usertrapret:1.首先将stvec设置为uservec2.设置trapframe里的一些参数3.设置ssstatus寄存器3.设置sepc寄存器4.调用userretuserret:1.切换页表2.从trapfram中复原保存的寄存器的值,并设置sscratch为TRAPFRAME3.调用sret返回user mode

backtrace

void backtrace(void){uint64 st, ra,f,end;st = r_fp();end=PGROUNDUP(st);printf("backtrace:\n");while (st!=end){ra = st - 8;f= st-16;printf("%p\n",*(uint64 *)ra);st=*(uint64 *)(f);}}

alarm

这个实验包括两个系统调用sigalarm(interval, handler)和sigreturn( ),要我们每n个时间片调用一次handler函数。首先我们来通过test0。有关系统调用和proc.h的一些配置这里就不赘述了。这里只keenel/trap.c的代码。
void
usertrap(void)
{int which_dev = 0;if((r_sstatus() & SSTATUS_SPP) != 0)panic("usertrap: not from user mode");// send interrupts and exceptions to kerneltrap(),// since we're now in the kernel.w_stvec((uint64)kernelvec);struct proc *p = myproc();// save user program counter.p->trapframe->epc = r_sepc();if(r_scause() == 8){// system callif(p->killed)exit(-1);// sepc points to the ecall instruction,// but we want to return to the next instruction.p->trapframe->epc += 4;// an interrupt will change sstatus &c registers,// so don't enable until done with those registers.intr_on();syscall();} else if((which_dev = devintr()) != 0){// ok} else {printf("usertrap(): unexpected scause %p pid=%d\n", r_scause(), p->pid);printf("            sepc=%p stval=%p\n", r_sepc(), r_stval());p->killed = 1;}if(p->killed)exit(-1);// give up the CPU if this is a timer interrupt.if(which_dev == 2){if(p->ticks!=0){p->left--;if(p->left==0){//p->left=p->ticks;//p->ticks=0;//copy_trapframe(p->save_trapframe,p->trapframe);// memmove(p->save_trapframe,p->trapframe,sizeof(struct trapframe));p->trapframe->epc = (uint64)p->handler;}}yield();}usertrapret();
}
  第一次我做到这里的时候有个疑惑,既然在这里只改了epc,没有做别的处理。那么进程在跳转到hander函数后,怎么会把alarmtest剩余的部分执行完呢,是怎么跳回去的?

然后
用gdb查看寄存器信息,pc调到handler函数,但是ra寄存器保存的还是原来指令执行的地址,handler执行完后,ra的值存入pc,然后程序继续执行。

  然后test1,和test2就是要保存切换到handler时候的寄存器信息,然后再调用sigreturn的时候复原。这个地方在proc结构中,增加个trapframe就可以了。开始的时候我自己写了个copy frame函数,后面发现直接用memmove函数就可以了,这是因为     p->trapframe和p->save_trapframe都是kalloc函数分配的,是物理地址,所以可以在内核直接用吗?然后还有要注意要free。

6.s081 lab 4相关推荐

  1. 6.S081 lab: networking e1000 网卡驱动 附 Linux 网卡驱动编写分析

    本文是 6.S081 操作系统课程学习最后一个 lab,编写一个 intel 的 e1000 网卡的驱动在 xv6 下.需要复习知识有:操作系统知识,计算机组成原理 DMA 相关,循环缓冲区的概念,e ...

  2. MIT 6.S081 lab 11:Networking

    ​ 背景 在你开始写代码前,你可能会发现xv6 book中的第五章:中断和设备驱动是很有帮助的. 你将使用一个叫做E1000的网络设备来处理网络通信.对于xv6(以及你写的驱动),E1000看起来像一 ...

  3. MIT 6.S081 lab 5:lazy page allocation

    1 Lab lab 5就是去实现xv6 book 4.6中写的 Lazy page allocation 有个问题:page fault的trap是如何出现的? 1.1 Eliminate alloc ...

  4. MIT6.S081 2021

    MIT6.S081 2021 环境配置 Xv6 and Unix utilities vscode格式化头文件排序问题 以地址空间的视角看待变量 其他 代码参考 system calls trace ...

  5. 「实验记录」MIT 6.S081 Lab7 multithreading

    #Lab7: multithreading I. Source II. My Code III. Motivation IV. Uthread: switching between threads ( ...

  6. 书呆子rico_Excel书呆子的夏季赠品

    书呆子rico It's time for an Excel giveaway! Just describe one of the telltale signs of Excel nerdery (i ...

  7. csdn使用Markdown

    转 CSDN MARKDOWN语法 2019年01月30日 15:33:43 tangxuesong6 阅读数:36 这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的 ...

  8. 吴军三部曲态度(四)人际关系

    交友不要怕吃亏 如果你现在在大学中,那么很好,大学或者是更早交的朋友,是很单纯的,不会像社会上那么的功利,因为到了社会上,很多东西都跟利益挂钩了,这样目的就不会那么的单纯了. 俗话说,穷在闹市无人问, ...

  9. 6.S081 Xv6 Lab 5: lazy page allocation

    Lab: xv6 lazy page allocation https://pdos.csail.mit.edu/6.S081/2020/labs/lazy.html 新的 2020 版哦. $ gi ...

最新文章

  1. 《科学+ 预见人工智能》——“工具”本质,理性批判
  2. 乒乓球比赛赛程_国乒今年最后一站比赛延期!赛程缩短比赛地温暖,教练组考察队员...
  3. (转)AS3中的stage,this,root的区别
  4. 996. Number of Squareful Arrays
  5. redis专题:redis的主从、哨兵、集群架构的配置和部署详情、以及问题分析
  6. android listview的理解,Android ListView的理解
  7. 最新5G标准必要专利声明量排名:中兴通讯位列全球前三
  8. OPPO Find X,一款(可能)被全面屏“耽搁”了的AI手机
  9. linux rvm,RVM 实用指南
  10. 自动驾驶 9-2: 卡尔曼滤波器和偏置BLUEs Kalman Filter and The Bias BLUEs
  11. 苹果手机桌面找不到计算机,苹果手机在我的电脑显示不出来怎么办
  12. matlab工具箱安装
  13. antd日期选择组件a-range-picker默认选中的时分秒
  14. 互联网创业公司是否需要技术外包?
  15. vue图片超出屏幕尺寸自动适应图片比例缩放
  16. 光线折射公式推导:Snell‘s Law
  17. 退役赛总结(山东省第八届ACM程序设计大赛总结)
  18. 网站APP数据库里的用户信息被泄露篡改怎么办
  19. 谷歌创始人布林二婚破裂:被曝1月已提出与华裔妻子离婚,目前身家6314亿美元...
  20. Navicat 提示:Connection is being used

热门文章

  1. Endnote软件改变文献引用格式报错-解决方案
  2. create sequence 序列号
  3. 实战丨Halo-轻松部署属于自己的博客系统
  4. 930群控服务器虚拟机,安卓群控系统虚拟机版本跟真机版区别
  5. python排课问题_排课常见问题
  6. 区块链会员积分体系解决方案
  7. 四十三、项目实战—阿里百秀
  8. 关于Spine导入Unity的一些问题
  9. Python--huan
  10. 前后分离,测试环境使用nginx调试解决跨域问题。