请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
谈谈您对课程的心得体会,改进建议等。
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
这是孟老师上课中的两个生动比喻,三大法宝:存储程序计算器、中断、函数调用栈;两把宝剑:中断上下文和进程中断上下文。
内核的一个主要功能就是处理硬件外设I/O,中断信号提供了一种特殊的方式, 使得CPU转去运行正常程序之外的代码,中断会改变处理器执行指令的顺序, 通常与CPU芯片内部或外部硬件电路产生的电信号相对应。
初始化过程:
明确中断发生时, CPU 硬件级的中断信号处理过程 :
1. 确定与中断或异常相关联的向量 i
2. 读取 idtr 寄存器的值,找到 IDT 的基址,通过查询 IDT,找到第 i 项对应的内容。
3. 从 gdtr 寄存器获得 GDT 的基地址,并在 GDT 中查找,以读取IDT 表项中的段选择符所标识的段描述符。
4. 确定中断是由授权的发生源发出的。
中断:需要比较 CPL 和 GDT 中的 DPL。中断处理程序的特
权不能低于引起中断的程序的特权。
编程异常:需要比较 CPL 和 IDT 中的 DPL。
5. 检查是否发生了特权级的变化,一般指的是用户态陷入内核态。
如果是用户态陷入内核态,控制单元要使用新的特权级堆栈。
保存 ss 和 esp,并用新的堆栈的值填充。
6. 如果是故障,用引起故障的指令修改 cs 和 eip,以便异常处理后再次执行。
7. 在堆栈中保存 eflags/cs/eip 的内容。
8. 如果有硬件出错码,则保存。
9. 使用 IDT 中第 i 项中的段描述符和偏移量填充 cs 和 eip。
地基(低层)由一排排的文件柜组成,井然有序。文件柜里放置着“文件”--电脑中的文件。左上角,有一只向前挂着421号牌的小企鹅。它表示这PID(进程ID)为421的进程,他正在查看文件柜中的文件,这代表系统中正有一个进程在访问文件系统。在右下角有一只小狗,他是看门狗,这代表对文件系统的监控,可以说整个linux系统都是构建在文件系统之上的,Linux支持多种文件系统,包括ext2、ext3、vfat等等。Linux采用虚拟文件系统VFS来达到支持多种文件系统格式的目标。VFS为各类文件系统提供一个统一的操作界面和编程接口。向上提供统一的编程接口,向下对各种文件系统进行兼容。
Virtual File System这一层,是为了隐藏各个设备之间的实现细节,向上提供统一的接口,试想,当我们通过mkfs.xxx系列命令创建了很多不同的文件系统,但这些文件系统都有各自的API接口,而用户想要的是,不管你是什么API,他们只关心mount/umount,或open/close等操作。
所以,VFS就把这些不同的文件系统做一个抽象,提供统一的API访问接口,这样,用户空间就不用关心不同文件系统中不一样的API了。VFS所提供的这些统一的API,再经过System Call包装一下,用户空间就可以经过SCI的系统调用来操作不同的文件系统。
进程概念
从用户角度:进程就是一个正在运行中的程序。
操作系统角度:操作系统运行一个程序,需要描述这个程序的运行过程,这个描述通过一个结构体task_struct{}来描述,统称为PCB,因此对操作系统来说进程就是PCB(process control block)程序控制块
进程的描述信息有:标识符PID,进程状态,优先级,程序计数器,上下文数据,内存指针,IO状态信息,记账信息。都需要操作系统进行调度。
进程创建
Linux中非常重要的函数——fork(),它从已存在的进程中创建一个新进程。新进程为子进程,而原进程为父进程。
#include <unistd.h> pid_t fork(void); 返回值: 父进程:返回值大于0,子进程的pid 子进程:返回值等于0
关于fork函数需要理解,每当调用一次fork函数时,会返回两个两次。一次是在调用进程中(父进程)返回一次,返回值是新派生的进程的进程ID。一次是在子进程中返回,返回值是0,代表当前进程为子进程。如果返回-1,那么则代表在创建子进程的过程中出现了错误。
进程状态
进程状态一般有:就绪态,阻塞态,运行态
在Linux下:R运行状态,S睡眠状态,D磁盘休眠状态,T停止状态,X死亡状态
原文:https://www.cnblogs.com/jiahuich/p/13272850.html