6.s081 lab 4
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相关推荐
- 6.S081 lab: networking e1000 网卡驱动 附 Linux 网卡驱动编写分析
本文是 6.S081 操作系统课程学习最后一个 lab,编写一个 intel 的 e1000 网卡的驱动在 xv6 下.需要复习知识有:操作系统知识,计算机组成原理 DMA 相关,循环缓冲区的概念,e ...
- MIT 6.S081 lab 11:Networking
背景 在你开始写代码前,你可能会发现xv6 book中的第五章:中断和设备驱动是很有帮助的. 你将使用一个叫做E1000的网络设备来处理网络通信.对于xv6(以及你写的驱动),E1000看起来像一 ...
- 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 ...
- MIT6.S081 2021
MIT6.S081 2021 环境配置 Xv6 and Unix utilities vscode格式化头文件排序问题 以地址空间的视角看待变量 其他 代码参考 system calls trace ...
- 「实验记录」MIT 6.S081 Lab7 multithreading
#Lab7: multithreading I. Source II. My Code III. Motivation IV. Uthread: switching between threads ( ...
- 书呆子rico_Excel书呆子的夏季赠品
书呆子rico It's time for an Excel giveaway! Just describe one of the telltale signs of Excel nerdery (i ...
- csdn使用Markdown
转 CSDN MARKDOWN语法 2019年01月30日 15:33:43 tangxuesong6 阅读数:36 这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的 ...
- 吴军三部曲态度(四)人际关系
交友不要怕吃亏 如果你现在在大学中,那么很好,大学或者是更早交的朋友,是很单纯的,不会像社会上那么的功利,因为到了社会上,很多东西都跟利益挂钩了,这样目的就不会那么的单纯了. 俗话说,穷在闹市无人问, ...
- 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 ...
最新文章
- 《科学+ 预见人工智能》——“工具”本质,理性批判
- 乒乓球比赛赛程_国乒今年最后一站比赛延期!赛程缩短比赛地温暖,教练组考察队员...
- (转)AS3中的stage,this,root的区别
- 996. Number of Squareful Arrays
- redis专题:redis的主从、哨兵、集群架构的配置和部署详情、以及问题分析
- android listview的理解,Android ListView的理解
- 最新5G标准必要专利声明量排名:中兴通讯位列全球前三
- OPPO Find X,一款(可能)被全面屏“耽搁”了的AI手机
- linux rvm,RVM 实用指南
- 自动驾驶 9-2: 卡尔曼滤波器和偏置BLUEs Kalman Filter and The Bias BLUEs
- 苹果手机桌面找不到计算机,苹果手机在我的电脑显示不出来怎么办
- matlab工具箱安装
- antd日期选择组件a-range-picker默认选中的时分秒
- 互联网创业公司是否需要技术外包?
- vue图片超出屏幕尺寸自动适应图片比例缩放
- 光线折射公式推导:Snell‘s Law
- 退役赛总结(山东省第八届ACM程序设计大赛总结)
- 网站APP数据库里的用户信息被泄露篡改怎么办
- 谷歌创始人布林二婚破裂:被曝1月已提出与华裔妻子离婚,目前身家6314亿美元...
- Navicat 提示:Connection is being used