Linux内核分析学习总结

一.Linux内核架构及概念模型

Linux操作系统是一种*和开放源码的类UNIX操作系统。其符合POSIX,是一种支持多用户,多任务,多线程的现代操作系统。

GNU/Linux 层次结构如下图

Linux内核分析学习总结

其中Linux内核架构如图
Linux内核分析学习总结

可以看到,最下层是与体系结构及设备驱动相关的代码,中间层主要是进程管理,内存管理,文件系统模块及网络栈,最上层提供了为应用程序系统系统调用的接口。

前文说过,Linux支持多用户多任务。为了高效管理有效的计算机资源分配和防止可能的使用冲突及信息安全,Linux采用了对指令执行分级的机制,具体来说,CPU执行级别分为内核态和用户态。应用程序需要访问计算机资源等敏感操作时需要通过系统调用进入内核态实现相应功能。

二.中断

中断分类:

中断可分为如下几种:

硬件中断:

  • 可屏蔽中断。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。
  • 非可屏蔽中断。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断。

软件中断:

  • 陷入。是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态的子例程,它常被用作实现系统调用。
  • 故障。通常来自当前指令内在缺陷,导致执行失败,可在修复后重新执行该指令。

中断处理过程:

1.CPU得到中断类型码后,进行保护断点,主要包括将状态寄存器压栈,保存当前代码段寄存器CS和程序计数器IP。

2.通过中断向量号查找中断向量表,找到中断处理程序地址,保存现场。执行中断处理程序

3.执行结束后恢复线场,恢复CS和IP。

三.进程管理

进程介绍:

进程是操作系统资源调度的单位,也是线程的容器。

Linux内核通过名为struct task_struct的结构体来描述进程,其包含了一个进程所需的所有信息。包括了进程状态,进程标识符,进程内核栈,线程描述符,进程标记进程优先级,进程地址空间,时间等信息。

Linux内核分析学习总结

进程调度及切换:

进程调度策略即从就绪队列中选择合适进程的策略方法。常用调度策略有SCHED_NORMAL、SCHED_FIFO、SCHED_RR、SCHED_BATCH。其中SCHED_NORMAL是用于普通进程的调度类,而SCHED_FIFO和SCHED_RR是用于实时进程的调度类,优先级高于SCHED_NORMAL。

进程切换:进程的切换即进程上下文的切换,包括用户地址空间,控制信息,和寄存器值。包括切换页全局目录和切换内核态堆栈和进程的CPU上下文两个步骤。切换成功的标志是寄存器从一个状态转换到另一个状态。

四.内存管理

Linux采用虚拟内存管理技术,进程初始化分配和操作都是基于虚拟地址,只有当进程需要实际访问内存资源的时候才会建立虚拟地址和物理地址的映射,调入物理内存页。

内核的内存管理单元实现虚拟地址和物理地址的转化。Linux进程可以划分为 5 个不同的内存区域,分别是:代码段、数据段、BSS、堆、栈,内核管理这些区域的方式是,将这些内存区域抽象成vm_area_struct的内存管理对象。

五.文件管理

虚拟文件系统是Linux内核的子系统之一,它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()read()write()这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。

Linux为了实现这种VFS系统,采用面向对象的设计思路,主要抽象了四种对象类型:

  • 超级块对象:代表一个已安装的文件系统。
  • 索引节点对象:代表具体的文件。
  • 目录项对象:代表一个目录项,是文件路径的一个组成部分。
  • 文件对象:代表进程打开的文件。

每个对象都包含一组操作方法,用于操作相应的文件系统。

六.总结

感谢孟老师和李老师的教学与付出, 让我对linux操作系统的设计与实现理论有了初步的了解。通过学习《Linux操作系统分析》理论课及多次实验,我对linux的兴趣更深入了一步,受益匪浅。

上一篇:2021-06-26进程的优先级与LAMP项目部署实战


下一篇:Ubuntu16.04下搭建LAMP环境