请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
一 系统调用
当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。
在Linux中是通过执行arm汇编语言swi来执行系统调用的
如下图为应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系。
内存管理:
内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
物理内存按大小被分成页框、页,每块物理内存可以被映射为一个或多个虚拟内存页。这块映射关系,由操作系统的页表来保存,页表是有层级的。层级最低的页表,保存实际页面的物理地址,较高层级的页表包含指向低层级页表的物理地址,指向顶级的页表的地址,驻留在寄存器中。当执行地址转换时,先从寄存器获取顶级页表地址,然后依次索引,找到具体页面的物理地址。
文件系统:就是操作系统中实现文件统一管理的一组软件、被管理的文件以及为实施文件管理所需要的一些数据结构的总称。
虚拟文件系统:
要实现操作系统对其它各种不同文件系统的支持,就要将对各种不同文件系统的操作和管理纳入到一个统一的框架中。对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟
的文件系统界面,这就是所谓的虚拟文件系统(Virtual File System Switch,VFS)。例如,在Linux操作系统中,可以将DOS格式的磁盘或分区,即文件系统,“安装”到系统中,然后用户程序就可以按完全相同
的方式访问这些文件,就好像它们也是Ext2格式的文件一样。
虚拟文件系统分3个层次
第一层为文件系统接口层,如open、write、close等系统调用接口。
第二层为VFS (Virtual File System)接口层。该层有两个接口:一个是与用户的接口;一个是与特定文件系统的接口。VFS与用户的接口将所有对文件的操作定向到相应的特定文件系统函数上。VFS与特定文件系统的接口主要是通过vfs-operations来实现的。
第三层是具体文件系统层,提供具体文件系统的结构和实现,包括网络文件系统,如NFS (network file system)。
概念模型
以下以进程向内核读文件为例:
- 进程调用库函数向内核发起读文件请求;
- 内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
- 调用该文件可用的系统调用函数read();
- read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
- 在inode中,通过文件内容偏移量计算出要读取的页;
- 通过inode找到文件对应的address_space;
- 在address_space中访问该文件的页缓存树,查找对应的页缓存结点:
(1)如果页缓存命中,那么直接返回文件内容;
(2)如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;
以helloworld在linux下的执行为例;
用户首先告诉OS执行程序;
OS找到该程序,检查其类型,找出其数据部的地址;
文件系统找到相应的磁盘块,父进程创建子进程执行程序;
OS需将执行文件映射到进程结构,设置上下文环境,并跳到程序开始处;
执行第一条程序,缺页,OS分配一页内存,并将代码从磁盘读入;继续执行,更多的缺页,读入更多页面。
程序执行系统调用;在文件描述符中写一行字符串,OS找到字符串并送往设备,
然后由一个进程控制的终端告诉窗口系统他要显示字符串,窗口系统确定这是一个合法的操作,将字符串转换为像素;
视频硬件将像素转换成一组模拟信号控制显示器,显示器发射电子形成helloword.
心得体会和改进意见
学完linux分析之后对计算机底层原理有了更深一步的了解;通过实验也接触到了与底层代码的调试,分析系统调用的过程等都让我们更容易的明白整个系统执行的流程,对以后的工作肯定意识收益匪浅。
改进意见:老师们在讲课的过程中通过一些动画或者视频发现对理解这些原理有很大的帮助,我觉得可以从这方面进行改进(其实已经不错了)。