Linux操作系统分析——课程总结报告

一、Linux系统的启动过程

1、POST开机自检

linux开机加电后,系统开始开机自检,该过程主要对计算机各种硬件设备进行检测,如CPU、内存、主板、硬盘、CMOS芯片等,如果出现致命故障则停机,并且由于初始化过程还没完成,所以不会出现任何提示信号;如果出现一般故障则会发出声音等提示信号,等待故障清除;若未出现故障,加电自检完成。

2、加载主引导目录(MBR)

开机自检完成后,CPU首先读取位于CMOS中的BIOS程序,按照BIOS中设定的启动次序(Boot Sequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个扇区中读取MBR。 CPU将MBR读取至内存,运行GRUB(Boot Loader常用的有GRUB和LILO两种,现在常用的是GRUB),GRUB会把内核加载到内存去执行。

3、加载内核,初始化initrd

CPU将MBR读取至内存,运行GRUB(Boot Loader常用的有GRUB和LILO两种,现在常用的是GRUB),GRUB会把内核加载到内存去执行。

4、进行系统初始化

内核并加载进内存运行并以读写方式挂载完根文件系统后,执行第一个用户进程init,包括加载设备、初始化硬件、检查文件系统、设置系统运行级别等。

5、打印登录提示符

系统初始化完成后,init给出用户登录提示符(login)或者图形化登录界面,用户输入用户和密码登陆后,系统会为用户分配一个用户ID(uid)和组ID(gid),这两个ID是用户的身份标识,用于检测用户运行程序时的身份验证。登录成功后,整个系统启动流程运行完毕!

二、Linux系统的一般执行过程

系统启动后,用户可以通过图形化界面或终端窗口来和Linux交互,从而启动用户程序,在这一过程中,背后的Linux系统中主要涉及的操作为进行的执行和切换,其主要步骤如下(从进程x切换到进程y):

  1. 正在运行的用户态进程X
  2. 发生中断(包括异常、系统调用等),CPU完成以下动作:
  • 当前CPU上下文压入进程X的内核堆栈。
  • 加载当前进程内核堆栈相关信息,跳转到中断处理程序,即中断执行路径的起点。
  1. 保存现场,此时完成了中断上下文切换,即从进程X的用户态到进程X的内核态。
  2. 中断处理过程中或中断返回前调用了schedule函数,其中的switch_to做了关键的进程上下文切换。将当前进程X的内核堆栈切换到进程调度算法选出来的next进程(本例假定为进程Y)的内核堆栈,并完并完成了进程上下文所需的EIP等寄存器状态切换。详细过程见前述内容。
  3. 执行进程y(y曾经也以相同的步骤被切换出去过)。
  4. 恢复现场,与(3)中保存现场相对应。注意这里是进程Y的中断处理过程,而(3)中保存现场是在进程X的中断处理过程,因为内核堆栈从进程X切换到进程Y了。
  5. 从Y进程的内核堆栈中弹出(2)中硬件完成的压栈内容。此时完成了中断上下文的切换,即从进程Y的内核态返回到进程Y的用户态。
  6. 继续运行用户态进程y。

具体的过程在另一篇博客 Linux操作系统分析Lab5:深入理解进程切换 中已经进行分析,这里不再赘述。

三、结合虚拟化技术对Linux系统的一般执行过程进行分析

虚拟机技术是云计算最核心的技术,而 KVM(Kernel-based Virtual Machine)是当前最主流的虚拟机技术之一。虚拟机技术主要包括 CPU 的虚拟化、内存的虚拟化和 I/O 的虚拟化,典型的虚拟机实现有传统的 QEMU 虚拟机实现和轻量化的 StratoVirt 虚拟机实现。

CPU的虚拟化

CPU 的虚拟化在实现上可以分为全虚拟化、半虚拟化和硬件辅助虚拟化。其中全虚拟化和半虚拟化都是软件实现,也就是 VMM(Virtual-Machine Monitor)是纯软件实现。全虚拟化实现方式在客户虚拟机执行特权指令时需要通过 VMM 进行异常捕获、二进制翻译 BT(Binary Translation)和模拟执行;半虚拟化实现方式需要修改客户虚拟机操作系统的特权指令,改为通过 Hypercall 调用 VMM 来处理特权指令,无需异常捕获与模拟执行。硬件辅助虚拟化的实现方式是 VMM 与 Inter-VT、AMD-V 等硬件辅助虚拟化技术相配合提供在性能和运行环境上都更加逼真的虚拟机环境。

内存的虚拟化
  • 内存虚拟化是将 Guest 上的虚拟内存地址 GVA(Guest Virtual Address)转换为 Guest 上的物理内存地址 GPA(Guest Physical Address),进一步再转换为 Host 上的物理内存地址 HPA(Host Physical Address )。
  • 没有硬件辅助虚拟化之前,VMM 为每个 Guest 维护一份影子页表(Shadow Page Table),通过软件维护 GVA、GPA 到 HPA 的映射,由于内存访问与更新频繁导致影子页表的维护复杂,运行开销大影响虚拟机的性能。
  • 硬件辅助内存虚拟化技术是 CPU 引入硬件辅助内存虚拟化页表,作为 CPU 内存管理单元 MMU 的扩展,通过硬件来实现 GVA、GPA 到 HPA 的转换。首先 Guest 通过页表寄存器将 GVA 转换为 GPA,然后查询硬件辅助内存虚拟化页表将 GPA 转换为 HPA。
  • CPU 还使用 TLB 缓存虚拟地址到物理地址的映射,地址转换时 CPU 先根据 GPA 查找 TLB,如果未找到映射的 HPA,将根据页表中的映射填充 TLB,再进行地址转换,从而通过高速缓存 TLB 加速内存虚拟化的地址转换。
I/O的虚拟化

在虚拟化环境中,Guest 的 I/O 操作需要经过特殊处理才能在底层 I/O 设备上执行。KVM 支持多种 I/O 虚拟化技术,比如全虚拟化的设备模拟与半虚拟化的 virtio 驱动都是通过软件实现的 I/O 虚拟化;比如设备直通 PCI Pass-through、设备共享 SR-IOV(Single Root-IO Virtualization)、数据平面开发工具集 DPDK(Data Plance Development Kit)与存储性能开发工具集 SPDK(Storage Performace Development Kit)等硬件辅助 I/O 虚拟化技术。

四、课程收获

  1. 本课程中以Linux5.34为例,通过自己制作根文件系统,跟踪调试start_kernel的运行过程,深入理解了Linux系统的启动过程,学会了在Linux系统下的调试手段。
  2. 编写程序进行系统调用,并跟踪这一过程,使得我对Linux系统下的系统调用有了更深刻的理解。
  3. 通过分析Linux系统中的进程切换过程,深入理解了Linux系统的一般执行过程。
  4. 两位老师在课上对Linux系统下函数执行过程中栈和寄存器的变化、系统的中断和异常、虚拟化技术等进行了深入的分析,使得我对Linux操作系统更加了解。
  5. Linux操作系统本身是一个优秀且庞大的项目,通过本课程的学习,我学会了如何阅读和理解这样一个大型项目,如何正确的调试大型项目。另外,项目本身也有着优秀的源码,通过阅读源码,使得我学到了更多关于系统项目的编写规范和技巧。

参考文献:
史上最详细linux启动过程讲解—没有之一
Linux操作系统之虚拟化
庖丁解牛Linux操作系统分析

作者:518

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值