? 请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
? 首先对整个Linux操作系统分析学了哪些知识,思维导图如下:
在Linux系统结构中,可以大致分为以下几个部分:
中断:在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。上图中的系统调用就是一种中断。
文件管理:Linux内核中的虚拟文件系统用一个通用的文件模型表示了各种不同的文件系统,这个文件模型屏蔽了很多具体文件系统的差异,使Linux内核支持很多不同的文件系统。
进程管理:进程管理主要控制系统进程对CPU的访问。当需要某个进程运行时,由。进程调度器根据基于优先级的调度算法启动新的进程。
设备管理:内核使用了LKM技术,使得设备的驱动程序可以动态地加入内核,在不重编译内核和重启系统的条件下对Linux系统内核进行修改和扩展。
首先对上面的模型精简一下:
? 一个操作系统可以支持多种底层不同的文件系统(比如NTFS, FAT, ext3, ext4),为了给内核和用户进程提供统一的文件系统视图,Linux在用户进程和底层文件系统之间加入了一个抽象层,即虚拟文件系统(Virtual File System, VFS),进程所有的文件操作都通过VFS,由VFS来适配各种底层不同的文件系统,完成实际的文件操作。通俗的说,VFS就是定义了一个通用文件系统的接口层和适配层,一方面为用户进程提供了一组统一的访问文件,目录和其他对象的统一方法,另一方面又要和不同的底层文件系统进行适配。
根据老师的PPT,画出VFS的主要数据关系图如下:
分别结合写文件与读文件的例子来分析整个过程:
读文件:
1、进程调用库函数向内核发起读文件请求;
2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
3、调用该文件可用的系统调用函数read();
3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
4、在inode中,通过文件内容偏移量计算出要读取的页;
5、通过inode找到文件对应的address_space;
6、在address_space中访问该文件的页缓存树,查找对应的页缓存结点:
7、文件内容读取成功。
写文件:
1、进程调用库函数向内核发起写文件请求;
2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
3、调用该文件可用的系统调用函数write();
3、write()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
4、在inode中,通过文件内容偏移量计算出要写的页;
5、通过inode找到文件对应的address_space;
6、如果页缓存命中,直接把文件内容修改更新在页缓存的页中。写文件就结束了。这时候文件修改位于页缓存,并没有写回到磁盘文件中去;
7、如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第6步;
8、一个页缓存中的页如果被修改,那么会被标记成脏页。脏页需要写回到磁盘中的文件块。有两种方式可以把脏页写回磁盘:
同时注意,脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其他写请求被阻塞直到锁释放。
? 上课形式:由于疫情原因,这学期上的是网课,网课的优势就是可以不断看回放,也不会由于座位问题而不能看清PPT和听清老师声音;劣势就是不能上课进行积极的交流,无论是老师与学生之间还是学生与学生之间的。
? 上课内容:孟老师从“庄周梦蝶”引入上课内容,非常形象生动,从宏观上让我们理解Linux系统;李老师主要从微观上让我们一步步分析代码理解Linux系统全过程。
? 实验内容:经过这几次实验,原本只是会浅层次的内核代码分析,现在让我的动手和分析代码能力有了极大的提高。
? 希望以后进行多一点实验,可以提升动手和分析代码能力;以及以后上课可以有录屏之类的,可以有利于上课不懂的地方下课反复观看。
原文:https://www.cnblogs.com/woderfuleight/p/13276039.html