lec4: lab1 SPOC思考题
提前准备
(请在上课前完成)
- 完成lec4的视频学习和提交对应的在线练习
- git pull ucore_os_lab, v9_cpu, os_course_spoc_exercises in github repos。这样可以在本机上完成课堂练习。
- 了解x86的保护模式,段选择子,全局描述符,全局描述符表,中断描述符表等概念,以及如何读写,设置等操作
- 了解Linux中的ELF执行文件格式
- 了解外设:串口,并口,时钟,键盘,CGA,已经如何对这些外设进行编程
- 了解x86架构中的mem地址空间和io地址空间
- 了解x86的中断处理过程(包括硬件部分和软件部分)
- 了解GCC的x86/RV内联汇编
- 了解C语言的可函数变参数编程
- 了解qemu的启动参数的含义
- 在piazza上就lec3学习中不理解问题进行提问
- 学会使用 qemu
- 在linux系统中,看看 /proc/cpuinfo的内容
思考题
启动顺序
- x86段寄存器的字段含义和功能有哪些?
- x86描述符特权级DPL、当前特权级CPL和请求特权级RPL的含义是什么?在哪些寄存器中存在这些字段?对应的访问条件是什么?
- 分析可执行文件格式elf的格式(无需回答)
4.1 C函数调用的实现
4.2 x86中断处理过程
- x86/RV中断处理中硬件压栈内容?用户态中断和内核态中断的硬件压栈有什么不同?
- 为什么在用户态的中断响应要使用内核堆栈?
- x86中trap类型的中断门与interrupt类型的中断门有啥设置上的差别?如果在设置中断门上不做区分,会有什么可能的后果?
4.3 练习四和五 ucore内核映像加载和函数调用栈分析
- ucore中,在kdebug.c文件中用到的函数
read_ebp
是内联的,而函数read_eip
不是内联的。为什么要设计成这样?
4.4 练习六 完善中断初始化和处理
- CPU加电初始化后中断是使能的吗?为什么?
开放思考题
- 在ucore/rcore中如何修改lab1, 实现在出现除零异常时显示一个字符串的异常服务例程?
- 在ucore lab1/bin目录下,通过
objcopy -O binary kernel kernel.bin
可以把elf格式的ucore kernel转变成体积更小巧的binary格式的ucore kernel。为此,需要如何修改lab1的bootloader, 能够实现正确加载binary格式的ucore OS? (hard) - GRUB是一个通用的x86 bootloader,被用于加载多种操作系统。如果放弃lab1的bootloader,采用GRUB来加载ucore OS,请问需要如何修改lab1, 能够实现此需求? (hard)
- 如果没有中断,操作系统设计会有哪些问题或困难?在这种情况下,能否完成对外设驱动和对进程的切换等操作系统核心功能?
课堂实践
练习一
在Linux系统的应用程序中写一个函数print_stackframe(),用于获取当前位置的函数调用栈信息。实现如下一种或多种功能:函数入口地址、函数名信息、参数调用参数信息、返回值信息。
练习二
在ucore/rcore内核中写一个函数print_stackframe(),用于获取当前位置的函数调用栈信息。实现如下一种或多种功能:函数入口地址、函数名信息、参数调用参数信息、返回值信息。