课程学习总结报告

根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。

Linux系统模型

 

 

 内核向上为系统调用和应用程序提供支持,向下对系统资源和驱动程序进行关系,是整个系统的核心。

 

因为计算机的硬件资源是有限的,为了尽量避免有限资源的访问和使用冲突,CPU和操作系统必须提供一些机制对用户程序进行权限划分,Linux操作系统的体系架构分为用户态和内核态。在用户态(低级别指令)下,代码能够掌控的范围受到限制,特权指令只能在内核态下执行,保证了系统稳定性和安全性。

用户态切换到内核态包括三种方式:内部中断(故障和陷阱)和外部中断。

故障:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

外部中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

系统调用:是操作系统为用户态进程与硬件设备进行交互提供的一组接口,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作;系统调用利用陷阱(Trap)这种软件中断方式主动从用户态进入内核态,系统调用是特殊的中断。

 

系统编程接口API和系统调用:

应用编程接口(API)和系统调用是不一样的。API只是一个函数定义,系统调用通过软中断向内核发出一个明确的请求。

Libc库定义的一些封装例程(唯一的目的就是发布系统调用),一般每个系统调用对应一个封装例程,库再用封装例程定义出给用户的API。所以,不是每个API都对应一个特定的系统调用,API可能直接提供用户态的服务,一个单独的API可能调用多个系统调用,不同的API可能调用了同一个系统调用。大部分的封装例程返回一个整数,其值的含义依赖于对应的系统调用,返回值-1一般表示内核不能满足进行的请求。Libc中定义的errno变量包含了特定的出错码。

当用户态进行调用一个系统调用的时候,CPU切换到内核态并开始执行一个内核函数。Linux中是通过执行int $0x80来执行一个系统调用的。这条汇编指令产生向量为128的编译异常。

内核实现了很多不同的系统调用,但是进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数,一般用eax寄存器。

文件系统

在Linux系统中,一切皆文件。普通文件、目录、字符设备、块设备和网络设备(套接字)等在Linux中都被当做文件来对待。虽然他们的类型不同,但是linux系统为它们提供了一套统一的操作接口。把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。这样有两个优点:

         实现了设备无关性。
         Linux 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样处理了。
一切皆文件的实现,是通过虚拟文件系统(VFS)

  • 向上,对应用层 (的System Call) 提供一个标准的文件操作接口;
  • 对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。

应用程序通过文件操作函数(open()、close()、read()、write()、ioctl())调用VFS提供的系统调用函数接口(sys_open()、sys_close()、sys_read()、sys_write()、sys_ioctl())同VFS进行交互,VFS通过驱动程序提供的file_operation接口同设备驱动进行交互。

linux下每一类设备在驱动层都定义了操作方法(例如:字符设备的操作方法为def_chr_fops,块设备为 def_blk_fops,网络设备为bad_sock_fops),并且不同类型的设备底层操作方法是不一样的,但是驱动层通过file_operations方法把不同类型设备的差异屏蔽了,这就使得VFS可以通过统一的file_operations接口来访问不同类型的设备。这就是linux能将所有设备都理解为文件的原因。

 

在这门课程的学习中,让我对linux操作系统的底层有了一定的理解,进一步掌握了程序在linux系统上运行的过程。

posted @ 2020-07-09 21:00  _khf  阅读(168)  评论(0编辑  收藏  举报