linux课程学习总结报告[操作系统入门]

编程

一、linux系统概念模型总结

linux系统模型可以用如下图简单示意:

底层硬件部分属于计算机组成原理的内容,本课程没有过多的涉及,本课程主要涉及内核空间及用户空间部分,且侧重于内核空间的运行过程。基本的,cpu在任意的时刻均处于以下的三种情况:

(1).运行于用户态,执行用户态的进程上下文;

(2).运行于内核态,执行内核进程上下文;

(3).运行于内核态,处于中断上下文;

对于为什么要划分用户态和内核态,主要是这样划分,使得内核空间和用户空间是隔离的,这样即使用户的程序崩溃了,内核也不受影响。内核状态下,代码可以执行特权指令,可以访问任意的物理内存。而在用户态下,代码访问的内存地址会受到限制。我们知道,一般程序员编写代码可能考虑的不是那么周详,这样代码不会威胁到整个操作系统,而内核态的代码由更加专业的人员编写。操作系统对空间的划分导致了用户程序不能直接操作内核,需要通过系统调用来与内核进行通信(应用程序通过内核提供的接口来完成访问)。对于中断的产生,又可以分为硬件中断(由外设的接入导致的,比如键盘、硬盘的接入)、软件中断(又可细分为:故障、退出及陷阱),本课程中详细地说明了陷阱产生的具体工作过程,即系统调用、调试指令(int 3)等。下面具体的说明内核空间的各个部分的作用:

 

设备驱动:

设备驱动程序是操作系统最基本的组成部分,是linux内核的一部分,一般情况下可以将驱动 程序设计为一个模块,在需要时动态加载到内 核中。 Linux将硬件设备看作一个特殊的文件来操作, 该文件被称为设备文件;系统通过对设备文件 的读写等操作,实现对外设的读写等操作驱动是应用软件和硬件的桥梁, 它使得应用软件只需要调用系统软件的应用 编程接口(API)就可让硬件去完成要求的工作。

内存管理:

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换等,而且对性能也有很高的要求。

 文件系统:

文件系统是计算机组织、存取和保存信息的重要手段,是操作系统中实现文件统一管理的一组软件、被管理的文件以及为实施文件管理所需要的一些数据结构的总称。在Linux中,一切都是文件,通过对文件的定义和操作来控制设备的执行和数据的存储。并且使用VFS虚拟文件系统,实现对多种文件系统的兼容。

进程管理:

进程管理是linux内核中最重要的部分,它保证了程序的正常执行。 在Linux中, 进程是系统资源分配的基本单位,也是使用CPU运行的基本调度单位。它实现了对进程的控制和调度。

系统调用:

图中形象地表现出了系统调用作为用户态和内核态进行沟通的桥梁,系统调?一般以库函数的?式表现出来,库函数?来把系统调?给封装起来,它能够将用户从底层的硬件编程中解放出来,并且有效地提高了系统的安全性,使得用户程序具有可移植性。

 

 

下面一I/O子系统和文件系统读写流程进行具体分析:

 

read系统调用

分为用户空间和内核空间处理两部分。其中,用户空间处理只是通过$0x80中断陷入内核,接着调用其中断服务例程,即sys_read以进入内核处理流程。

对于read系统调用在内核的处理,如上图所述,经过了VFS、具体文件系统,如ext2、页高速缓冲存层、通用块层、IO调度层、设备驱动层、和设备层。其中,VFS主要是用来屏蔽下层具体文件系统操作的差异,对上提供一个统一接口,正是因为有了这个层次,所以可以把设备抽象成文件。具体文件系统,则定义了自己的块大小、操作集合等。引入cache层的目的,是为了提高IO效率。通用块层的主要工作是,接收上层发出的磁盘请求,并最终发出IO请求(BIO)。IO调度层则试图根据设置好的调度算法对通用块层的bio请求合并和排序,回调驱动层提供的请求处理函数,以处理具体的IO请求。驱动层的驱动程序对应具体的物理设备,它从上层取出IO请求,并根据该IO请求中指定的信息,通过向具体块设备的设备控制器发送命令的方式,来操纵设备传输数据。设备层都是具体的物理设备。

 VFS层:

内核函数sys_read是read系统调用在该层的入口点。它根据文件fd指定的索引,从当前进程描述符中取出相应的file对象,并调用vfs_read执行文件读取操作。vfs_read会调用与具体文件相关的read函数执行读取操作,file->f_op.read。然后,VFS将控制权交给了ext2文件系统。(ext2在此作为示例,进行解析)

Ext2文件系统层

通过ext2_file_operations结构知道,上述函数最终会调用到do_sync_read函数,它是系统通用的读取函数。do_sync_read才是ext2层的真实入口。该层入口函数 do_sync_read 调用函数 generic_file_aio_read ,后者判断本次读请求的访问方式,它会判断该页是否在页高速缓存,如果是,直接将数据拷贝到用户空间。如果不在,则调用page_cache_sync_readahead函数执行预读(检查是否可以预读),它会调用mpage_readpages。如果仍然未能命中(可能不允许预读或者其它原因),则直接跳转readpage,执行mpage_readpage,从磁盘读取数据。在mpage_readpages(一次读多个页)中,它会将连续的磁盘块放入同一个BIO,并延缓BIO的提交,直到出现不连续的块,则直接提交BIO,再继续处理,以构造另外的BIO。

page cache 结构

文件被分割为一个个以 page 大小为单元的数据块,这些数据块(页)被组织成一个多叉树(称为 radix 树)。树中所有叶子节点为一个个页帧结构(struct page),表示了用于缓存该文件的每一个页。树中的所有中间节点为组织节点,指示某一地址上的数据所在的页。

 通用块层

在缓存层处理末尾,执行mpage_submit_bio之后,会调用generic_make_request函数。这是通用块层的入口函数。它将bio传送到IO调度层进行处理。

 IO调度层

对bio进行合并、排序,以提高IO效率。然后,调用设备驱动层的回调函数,request_fn,转到设备驱动层处理。

 设备驱动层

request函数对请求队列中每个bio进行分别处理,根据bio中的信息向磁盘控制器发送命令。处理完成后,调用完成函数end_bio以通知上层完成。

 

二、课程心得体会

linux系统是性能稳定的开源软件,我们可以通过阅读源代码的形式了解一个操作系统的具体工作流程,而本课程正是基于linux系统源码的基础上,进行简化处理,突出核心内容,对于初学者理解linux工作机制十分有帮助,老师们上课十分有耐心,例子生动形象。通过本课程的学习,能够对操作系统的知识有更深的理解,也看到了理论与实现的差异。同时,本课程的实验让我们能够更深刻的体会系统的运行过程,更加具体。感谢老师们的辛苦指导!

 

linux课程学习总结报告

原文:https://www.cnblogs.com/ustcsselee/p/13264514.html

以上是 linux课程学习总结报告[操作系统入门] 的全部内容, 来源链接: utcz.com/z/518231.html

回到顶部