《Linux操作系统分析》课程总结报告
一、Linux系统的一般执行过程
最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程
-
正在运行的用户态进程X
-
发生中断
save cs:eip/esp/eflags(current) to kernel stack load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack)
-
SAVE_ALL
//保存现场 -
中断处理过程中或中断返回前调用了
schedule()
,其中的switch_to
做了关键的进程上下文切换 -
标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
-
restore_all
//恢复现场 -
iret - pop cs:eip/ss:esp/eflags from kernel stack
-
继续运行用户态进程Y
进程间的特殊情况
通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换 与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换; 内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般 的情况略简略; 创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork; 加载一个新的可执行程序后返回到用户态的情况,如execve;<br>0-3G内核态和用户态都可以访问,3G以上只能内核态访问。<br>内核是所有进程共享的。<br>内核是各种中断处理过程和内核线程的集合。
1.1 从CPU的角度来看
1.2 从内存角度来看
1.3 linux虚拟化
在虚拟化技术中,Linux系统的一般执行过程与非虚拟化环境下有所不同。在虚拟化环境下,Linux系统运行在虚拟机(VM)中,而不是直接在物理硬件上运行。
- 在虚拟化环境下,虚拟化层会拦截所有的硬件访问,并将其重定向到虚拟机中。这意味着在启动引导程序时,虚拟化层会加载虚拟机的引导程序而非物理主机上的引导程序;
- 在第3步时,虚拟化层会加载虚拟机的操作系统内核,而不是物理主机上的操作系统内核。每个虚拟机都可以运行自己的Linux系统,就好像它们在各自的物理计算机上一样;
- 在启动用户空间时,虚拟化层会为每个虚拟机提供独立的资源,并对它们进行隔离,以确保它们之间不会相互干扰。
二、课程收获
- 学习了x86和ARM64指令集架构,具体包括寄存器布局和指令集
- 掌握了linux内核的架构和运行原理,并自己动手学会了如何编译、调试
- 学习了linux操作系统中中断的具体流程,李春杰老师从硬件和软件的角度细致的讲解了中断的流程,包括底层的数据结构和函数源码,这让我明白,中断响应时不是简单的向设备发出信号就可以了。