Guest User

Untitled

a guest
Mar 20th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. # lab1 SPOC思考题
  2.  
  3. ##**提前准备**
  4. (请在上课前完成)
  5.  
  6. - 完成lec4的视频学习和提交对应的在线练习
  7. - git pull ucore_os_lab, v9_cpu, os_course_spoc_exercises in github repos。这样可以在本机上完成课堂练习。
  8. - 了解x86的保护模式,段选择子,全局描述符,全局描述符表,中断描述符表等概念,以及如何读写,设置等操作
  9. - 了解Linux中的ELF执行文件格式
  10. - 了解外设:串口,并口,时钟,键盘,CGA,已经如何对这些外设进行编程
  11. - 了解x86架构中的mem地址空间和io地址空间
  12. - 了解x86的中断处理过程(包括硬件部分和软件部分)
  13. - 了解GCC内联汇编
  14. - 了解C语言的可函数变参数编程
  15. - 了解qemu的启动参数的含义
  16. - 在piazza上就lec3学习中不理解问题进行提问
  17. - 学会使用 qemu
  18. - 在linux系统中,看看 /proc/cpuinfo的内容
  19.  
  20. ## 思考题
  21.  
  22. ### 启动顺序
  23.  
  24. 1. 段寄存器的字段含义和功能有哪些?
  25. - 代码段寄存器CS:当前执行程序段地址
  26. - 数据段寄存器DS:当前执行程序所用的操作数段地址
  27. - 堆栈段寄存器SS:当前执行程序所用的堆栈段地址
  28. - 附加端寄存器ES:当前执行程序所用的附加数据段地址
  29. 2. 描述符特权级DPL、当前特权级CPL和请求特权级RPL的含义是什么?在哪些寄存器中存在这些字段?对应的访问条件是什么?
  30. - DPL:访问该段的权限级别,存储在GDT中
  31. - CPL:正在执行代码段的特权级,存储在CS和SS中
  32. - RPL:进程对段访问的请求权限,存储在段选择子中
  33.  
  34. 对应的访问权限是什么?
  35. 3. 分析可执行文件格式elf的格式(无需回答)
  36.  
  37. ### 4.2 C函数调用的实现
  38.  
  39. ### 4.4 x86中断处理过程
  40.  
  41. 1. 中断处理中硬件压栈内容?用户态中断和内核态中断的硬件压栈有什么不同?
  42. - 内核态中断,不需要特权级切换时,压栈EFLAGS、CS、EIP、Error Code;用户态中断需要特权级切换时,压栈SS、ESP、CS、EIP、EFLAGS、Error Code
  43. 2. 为什么在用户态的中断响应要使用内核堆栈?
  44. - 中断服务例程在内核态执行,中断服务例程执行完,需要通过弹栈获得中断处的寄存器值,因此使用内核堆栈。
  45. 3. trap类型的中断门与interrupt类型的中断门有啥设置上的差别?如果在设置中断门上不做区分,会有什么可能的后果?
  46. - trap类型中断门:控制权递交时不改IF标志;interrupt类型中断门:控制权递交时关中断,清IF标志。
  47. - 中断无限嵌套。
  48.  
  49. ### 4.8 练习四和五 ucore内核映像加载和函数调用栈分析
  50.  
  51. 1. 在kdebug.c文件中用到的函数`read_ebp`是内联的,而函数`read_eip`不是内联的。为什么要设计成这样?
  52.  
  53. ### 4.9 练习六 完善中断初始化和处理
  54.  
  55. 1. CPU加电初始化后中断是使能的吗?为什么?
  56.  
  57. ## 开放思考题
  58.  
  59. 1. 如何修改lab1, 实现在出现除零异常时显示一个字符串的异常服务例程?
  60. 2. 在lab1/bin目录下,通过`objcopy -O binary kernel kernel.bin`可以把elf格式的ucore kernel转变成体积更小巧的binary格式的ucore kernel。为此,需要如何修改lab1的bootloader, 能够实现正确加载binary格式的ucore OS? (hard)
  61. 3. GRUB是一个通用的bootloader,被用于加载多种操作系统。如果放弃lab1的bootloader,采用GRUB来加载ucore OS,请问需要如何修改lab1, 能够实现此需求? (hard)
  62. 4. 如果没有中断,操作系统设计会有哪些问题或困难?在这种情况下,能否完成对外设驱动和对进程的切换等操作系统核心功能?
  63.  
  64. ## 课堂实践
  65. ### 练习一
  66. 在Linux系统的应用程序中写一个函数print_stackframe(),用于获取当前位置的函数调用栈信息。实现如下一种或多种功能:函数入口地址、函数名信息、参数调用参数信息、返回值信息。
  67.  
  68. ### 练习二
  69. 在ucore内核中写一个函数print_stackframe(),用于获取当前位置的函数调用栈信息。实现如下一种或多种功能:函数入口地址、函数名信息、参数调用参数信息、返回值信息。
Add Comment
Please, Sign In to add comment