《Linux内核设计与实现》课程学习重点问题总结

时间:2021-10-09 23:37:31

(问题均是同学提出或是老师上课重点讲解的部分内容,根据自身理解和笔记总结出自己的答案。如有不对,还请指教。)

week2

【Q1】命令qemu -kernel 内核可执行文件 -initrd rootfs.img

在内核代码目录下有init,这是一个可执行文件,内含有C语言文件。

【Q2】编译内核的目的是什么?

为了生成符号表(即名称与地址的映射表)。

make config--->make bzImage
make module--->make module--->install--->make install
make all

 

week3

【课堂笔记】

1.MUU页式转换(虚拟地址--->物理地址)。

2.0号中断是除0错误。

3.硬中断:CPU出错,被动中断;软中断:异常,陷入,trap。

4.所有的驱动操作均在内核态。

5.操作系统的边界即是系统调用。

6.快速系统调用机制:sysenter/sysexit。

7.int指令流程:无运行级别切换;有运行级别切换

8.TSS:任务堆栈段。

9.Intel设计用来存放硬件上下文,实现任务切换。

10.系统调用过程:执行路径的切换、运行级别的切换

 

【Q1】所谓的打开中程序关闭中断程序过程中的两种不同情况是指什么?

打开中断与关闭中断过程中涉及两种不同情况。即笔记中第7条提及的不同。什么是运行级别的切换呢?我认为就是在视频讲解中简单带过的“中断发生后的第一件事就是保存现场,结束前最后一件事就是恢复现场”、“发生进程调度”这部分内容。

老师上课提到的打开中断和关闭中断的两种情况应该是指硬中断与软中断的区别。视频中讲解总结如下:

SAVE_ALL
-...//内核代码,完成中断服务,进程调度
RESTORE_ALL
iret_pop cs:eip/ss:eip/eflags from kernel stack

如果并未发生进程调度,则直接往下执行restore_all;

如果发生了进程调度,则当前的这些状态都会暂时保存在系统内,在下次发生进程调度再切回到该进程时则往下执行restore_all。

结合上面知识来思考应该是这样的:

硬中断是CPU出错,因此相当于“停等”。如果执行过程中发生了硬中断,那么整个执行就“硬生生停下”,然后什么事也不干,此时就是“无运行级别切换”(老师所说),即“未发生进程调度”(视频所说),中断结束后,回过神来继续往下走刚才没做完的工作。

软中断相对应的,就是“发生了进程调度”,中断发生后,保存现场,然后处理进程,然后下次进程调度到自身时,恢复现场,继续往下执行。

 

【Q2】中断过程init前后分析

当init触发中断时,系统会根据init中断的中断号去查询中断向量表,获取产生的中断种类,然后找到处理该中断的中断处理程序,例如课程中我们所得的中断号是128(即十六进制数80处理系统调用中断),寻到中断处理程序中进行地址换算获得中断所对应的程序地址,根据先前在eax中存放的系统调用号查询系统调用表,然后找到该号系统调用对应的C代码程序执行实现该系统调用功能。

 

【Q3】虚拟地址、页式存储、物理地址三者关系

我们可以联想到操作系统中所说的“设备无关性”。这里也可以根据无关性来理解。

用户在操作计算机系统的时候其实只需要对虚拟地址,或说逻辑地址进行操作。而无需去对真正存放程序代码的地址、资源地址进行操作。而真正存放这些指令、数据的是物理地址,即绝对地址。在操作系统中运用页式存储数据。在用户进行操作时,操作系统中会自动完成地址映射、转换,通过页式存储、段式存储将虚拟地址转换为物理地址从而实现寻址。

 

【week4】

【Q1】如果经常为路径报错、文件报错而烦恼。怎么办?比如:遇到hello报错。即找不到怎么办?

应该在环境变量下加入运行文件的路径,即可在所有的路径下执行hello。

命令是:export $PATH=你要加入的文件的所在路径。

【Q2】如何给汇编代码设断点?

break 地址

 

 【week5】

【Q1】若找不到文件,则是在哪里找不到文件呢?

若给出了全路径,则在全路径下找,若没有,则在当前目录下找。

【Q2】注意:

 p->thread.ip的值会在调度时被压入新进程堆栈栈顶(esp寄存器),在执行完后再根据这个esp的值返回iret,返回到执行前的地方。

 

【week6】

【Q1】预处理后依旧是文本文件,文字替换的作用,将头文件递归加入。

汇编后的文件是文本文件,是ASCII码。

 

持续更新中....