add challenge 2 in lab1

This commit is contained in:
chyyuu 2014-10-25 19:53:28 +08:00
parent fa97536f7d
commit 5346cc9003
6 changed files with 69 additions and 47 deletions

View File

@ -1,4 +1,3 @@
##### 2.6.2.1 双向循环链表
在“数据结构”课程中,如果创建某种数据结构的双循环链表,通常采用的办法是在这个数据结构的类型定义中有专门的成员变量 data, 并且加入两个指向该类型的指针next和prev。例如

View File

@ -128,7 +128,7 @@ ucore OS源码与机器码的语句和地址等的对应关系。
提示可阅读3.3.2小节“中断与异常”。
#### 扩展练习 Challenge需要编程
#### 扩展练习 Challenge 1(需要编程)
扩展proj4,增加syscall功能即增加一用户态函数可执行一特定系统调用获得时钟计数值当内核初始完毕后可从内核态返回到用户态的函数而用户态的函数又通过系统调用得到内核态的服务通过网络查询所需信息可找老师咨询。如果完成且有兴趣做代替考试的实验可找老师商量。需写出详细的设计和分析报告。完成出色的可获得适当加分。
@ -137,6 +137,7 @@ ucore OS源码与机器码的语句和地址等的对应关系。
kern_init 调用 switch_test该函数如下
```
static void
switch_test(void) {
print_cur_status(); // print 当前 cs/ss/ds 等寄存器状态
@ -147,7 +148,29 @@ kern_init 调用 switch_test该函数如下
switch_to_kernel(); // switch to kernel mode
print_cur_status();
}
```
switch_to_\* 函数建议通过 中断处理的方式实现。主要要完成的代码是在 trap 里面处理 T_SWITCH_TO\* 中断,并设置好返回的状态。
在 lab1 里面完成代码以后,执行 make grade 应该能够评测结果是否正确。
#### 扩展练习 Challenge 2需要编程
用键盘实现用户模式内核模式切换。具体目标是“键盘输入3时切换到用户模式键盘输入0时切换到内核模式”。
基本思路是借鉴软中断(syscall功能)的代码并且把trap.c中软中断处理的设置语句拿过来。
注意:
 1.关于调试工具不建议用lab1_print_cur_status()来显示要注意到寄存器的值要在中断完成后tranentry.S里面iret结束的时候才写回所以再trap.c里面不好观察建议用print_trapframe(tf)
 2.关于内联汇编,最开始调试的时候,参数容易出现错误,可能的错误代码如下
```
asm volatile ( "sub $0x8, %%esp \n"
"int %0 \n"
"movl %%ebp, %%esp"
: )
```
要去掉参数int %0 \n这一行
3.软中断是利用了临时栈来处理的,所以有压栈和出栈的汇编语句。硬件中断本身就在内核态了,直接处理就可以了。
4. 参考答案在mooc_os_lab中的mooc_os_2014 branch中的labcodes_answer/lab1_result目录下