课程学习总结报告
Linux系统如何工作
Linux的启动过程
- 首先由0号进程idle创建其子进程1号进程init和2号进程kthreadd;
- 1号进程init是所有用户态进程的祖先,init将会创建新的子进程用来执行用户命令;
- 2号进程kthreadd是所有内核线程的祖先。
- 在这个过程中,有可能会发生冲突,根据进程优先级的不同,或者该进程是否是I/O密集型进程来决定谁先抢占CPU,这涉及到进程调度策略,并且在这个过程中会发生进程切换。
- 进程切换的具体细节,就涉及到内核堆栈和用户堆栈之间数据保存和交换,即保存进程上下文。
- 进程是依附于程序存在的,这就需要读取文件信息,通过预编译、编译、汇编、链接,生成可执行未见,才能执行。Linux中大部分可执行文件都是ELF格式,通过该格式文件头信息,可以找到程序执行的起点。
![](https://img2020.cnblogs.com/blog/2016553/202007/2016553-20200707222909417-2128351794.png)
函数调用堆栈
每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧(stack frame).每个独立的栈帧一般包括:
- 函数的返回地址和参数
- 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量
- 函数调用的上下文
栈是从高地址向低地址延伸,一个函数的栈帧用ebp 和 esp 这两个寄存器来划定范围.ebp 指向当前的栈帧的底部,esp 始终指向栈帧的顶部;
ebp 寄存器又被称为帧指针
esp 寄存器又被称为栈指针
栈帧结构如图
Linux系统分为内核态和用户态
![](https://img2020.cnblogs.com/blog/2016553/202007/2016553-20200707223921132-1227273445.png)
内核态中执行高权限的指令,从用户态进入内核态的唯一方式的是中断
内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别中将禁止某些操作。Linux系统设计时利用了这种硬件特性,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。
通过系统调用,用户空间的应用程序就会进入内核空间,由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的地址映射,通用或专用的寄存器组,而用户空间的进程要传递很多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续执行,所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
用户态堆栈和内核态堆栈不同,中断发生内核态,程序上下文则在用户态
在进程上下文中,包含了进程执行所需要的各种信息,包括用户地址空间:包括程序代码、数据、用户堆栈等。 控制信息:进程描述符、内核堆栈等。
进程的CPU上下文,相关寄存器的值。
与进程上下文切换不同,中断上下文是从用户态进入内核态,因此相比进程上下文,内核需要硬件传递过来的这些参数和内核需要保存的一些其他环境
进程管理
进程管理中主要有进程环境,进程状态,进程控制快,进程控制和进程调度
时间管理
Linux分为以下几个定时器
时间戳计数器Time stamp counter,TSC
可编程间隔定时器Programmable interval timer, PIT n CPU本地定时器
高精度事件定时器
ACPI电源管理定时器
可以通过设备文件对其编程
内核通过0x70和0x71两个端口访问RTC
设备驱动
它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。
![](https://img2020.cnblogs.com/blog/2016553/202007/2016553-20200708232726103-495918956.png)
根文件系统的加载
文件系统
![](https://img2020.cnblogs.com/blog/2016553/202007/2016553-20200708233041783-522234982.png)
在Linux系统中分为以下几类文件
(1)正规文件:是指系统所规定的普通格式的文件,包括系统文件、库文件以及各种用户文件等。
(2)目录文件:是由文件目录构成的一类文件。是用来维护文件系统结构和管理普通文件和目录的文件。
(3)符号链接:又称为软链接。它是一个短文件,其中包含了另一个文件的任意一个路径名。这个路径名可以指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。硬链接是指目录表中的目录项所确定的文件名和索引节点之间的对应关系。硬链接的次数就是同一索引节点被目录项引用的次数。
(4)设备文件:包括块设备文件和字符设备文件。在UNIX系统中,所有的输入输出设备都被看成是文件,甚至在使用形式上也和普通文件相同。
(5)管道(pipe)文件:系统使用管道文件的目的是希望将一个进程的输出作为另一个进程的输入。管道文件使用一块专用的内存区域来保存中间信息。
(6)套接字(socket):又称插口。通过在发送方和接收方分别创建一个称为套接字的通信端点可以获得TCP服务。每个套接字有一个套接字序号(地址),包含主机的IP地址和一个端口。每条连接由两端的套接字标识符来识别,即(socket1, socket2)。
Linux总结
在Linux系统分析这门课程中,通过内核源代码和知识点结合的方式学习Linux,在实验中通过自己动手运行和调试内核,知晓了操作系统内核的结构和设计原理,一个操作系统是如何运作起来的,系统的各个功能之间是如何分工协作的,这让课程不仅仅是停留在理论阶段,学完之后加深了对操作系统的理解。