Linux系统的一般执行过程
1. 一般情况
最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程
- 正在运行的用户态进程X
- 发生中断——
- save cs:eip/esp/eflags(current) to kernel stack;
then - load cs:eip(系统调用的起点,entry of a specific ISR) and ss:esp(point to kernel stack)
- save cs:eip/esp/eflags(current) to kernel stack;
- 进入内核代码,SAVE_ALL
- 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换(把当前进程X的用户堆栈切换到需要的其他进程堆栈中)
- 标号1之后开始运行上一步中选中的用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
- restore_all ,恢复现场
- iret - pop cs:eip/ss:esp/eflags from kernel stack
- 继续运行用户态进程Y
- 补充:中断上下文和进程长下文切换。前者是CPU内部的切换;后者是在内核中堆栈的切换
2. 几种特殊情况
- 通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断的时候没有进程用户态和内核态的转换,cs不会变化;
- 用户进程向内核进程切换。内核现场不需要从内核态返回用户态,也就是说省略恢复现场和iret恢复CPU上下文。
- 内核线程向用户进程的切换。内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,也不需要从中断中返回,与最一般的情况相比更简略;
- 创建子进程的系统调用在子进程中的执行起点(如ret_from_fork,上文中也已经提到过)及返回用户态;
- 加载一个新的可执行程序返回到用户态的情况也比较特殊。
虚拟化技术
1.虚拟机管理器(VMM或Hypervisor)
最初人们用VMM(Virtual Machine
Manager,虚拟机管理器)来描述该功能,但是20世纪70年代早期,IBM工程师创造了Hypervisor(虚拟机管理程序)一词,因为虚拟化管理软件运行在被IBM称为Supervisor的操作系统之上。
可以利用Hypervisor来完成虚拟机的创建、虚拟机资源的分配、虚拟机参数的修改以及虚拟机的删除等操作。
Hypervisor主要分为两类,其类型名称并没有太多关于它们之间区别的信息,只是简单地称为Type-1 Hypervisor和Type-2 Hypervisor。
- Type-2 Hypervisor
该类Hypervisor作为一款普通的软件应用运行在宿主操作系统之上。宿主操作系统可以是任何支持虚拟化功能的传统操作系统。Hypervisor
作为这个操作系统上的应用程序,与其他应用程序和进程一起运行,其被分配给特定硬件资源。
在Type-2虚拟化环境中,主机的作用非常小,仅仅为Hypervisor的运行提供一个平台。此外,由主机提供与设备、内存、磁盘及其他外围设备通信的接口。一般来说,宿主操作系统不会运行任何资源重消耗型应用,宿主操作系统应该是一个非常轻量级的层级,在实现操作系统基本功能的同时,主要为客户(即虚拟机)预留大量必需的资源。
-
2Type-1 Hypervisor
该类Hypervisor基于其底层主机仅扮演一个非常轻量级且基本的角色。Type-1 Hypervisor将宿主操作系统的角色融入到Hypervisor代码中,此时Hypervisor直接运行在硬件上,不需要底层操作系统。该类Hypervisor还需要完成其他功能,因为它需要与物理设备进行通信并对其进行管理,同时将所需设备驱动程序加入到Hypervisor代码中。因而这类Hypervisor的代码显得较为复杂,开发时间也较长。但是与Type-2 Hypervisor相比,Type-1 Hypervisor的通信开销较少。由于Type-1 Hypervisor直接运行在硬件上,因此也将该实现方式称为裸机实现方式。 -
KVM/QEMU
KVM和QEMU可能是Linux中流行且常用的Hypervisor。由于KVM和QEMU都是开源的免费软件,因此它们通常都是Linux主机上的虚拟机的默认选择。QEMU是Quick
Emulator的缩写,是一款开源的虚拟机模拟器。QEMU与KVM(Kernel-based Virtual
Machine,基于内核的虚拟机)结合使用,也可以用作Hypervisor。
KVM是Linux内核提供的虚拟化架构,可以让QEMU使用硬件辅助的虚拟化技术。KVM/QEMU允许客户操作系统直接访问虚拟化硬件并获得几乎与直接访问硬件相同的性能(如果该客户操作系统运行在物理机之上)。
2.虚拟机资源分配原理
使用虚拟化的目的是共享硬件资源(如内存、CPU、接口和磁盘空间),使其发挥最大效能。Hypervisor则可以将共享这些资源所造成的影响降至最低。
最近几年,共享机制取得了突破性进展。
- CPU和内存分配
创建虚拟机时,Hypervisor会将预定义的内存和CPU分配给虚拟机,分配给虚拟机的CPU资源会被客户操作系统视为专用物理CPU。由于有些客户操作系统对于支持的CPU套接字有限制,因此较新版本的Hypervisor会根据CPU套接字的颗粒度及内核数量来提供CPU资源。
可分配的CPU性能基于宿主操作系统级别的可用CPU资源,例如,如果宿主服务器使用的是Intel Xeon E5-2680v2
CPU,该CPU具有10个内核/槽,并且是双线程,那么Hypervisor最多可以将20个虚拟CPU提供给虚拟机。这样的分配不会将任何CPU(或CPU内核)与虚拟机相绑定,与此相反,Hypervisor允许将一定比例的CPU循环分配给虚拟机。
虚拟机的CPU请求被Hypervisor截获后,就在可用CPU内核上调度该请求,并将响应传递给客户操作系统。硬件辅助虚拟化技术对于在虚拟机上共享CPU资源来说起到关键性的作用。
为虚拟机分配内存也要使用共享技术。通过共享技术将内存分配给Hypervisor时,同样会让客户操作系统认为是在使用物理内存资源。类似内存页和磁盘交换空间等技术会被用于虚拟机操作系统,分配的全部可用内存都由其独占使用。
- I/O设备分配
串行及其他I/O设备在虚拟机之间实现共享,是通过在同一时间内只将它们分配给一个虚拟机来实现的。这样一来,Hypervisor就可以基于特定的触发条件来切换资源分配。
例如在ESXi中,如果将键盘分配给虚拟机的控制台,ESXi截取到Ctrl+Alt组合键之后,就会将键盘从控制台中分离出来并连接到其他虚拟机上。
- 磁盘空间分配
初次创建虚拟机时,Hypervisor会被告知分配给客户操作系统的磁盘空间大小。根据所使用的置备方法类型,可以在宿主操作系统上创建一个或一组文件。可以使用两种常用的磁盘空间置备方法:厚置备(Thick Provision)和精简置备(Thin Provision)。
课程总结
本门课程主要基于Linux内核分析系统调用、进程切换、可执行程序工作原理等。通过本门课程,学习了编译内核,构建根文件系统,通过qemu模拟环境启动内核,使用gdb断点调试内核程序并据此分析,从一个个关键函数分析一个程序运行时的过程,对于进程切换有了一个既全面又细致的理解。对于进一步深入学习Linux系统有了一个良好的示范与基础。
参考文章:
- https://www.cnblogs.com/20135121conan/p/5400815.html
- http://python1234.cn/archives/bgdata8399