Linux课程学习总结报告

1.系统调用

  首先看用户态与内核态,Linux 操作系统的体系架构分为⽤户态和内核态。计算机的硬件资源是有限 的,为了减少有限资源的访问和使⽤冲突,CPU 和操作系统必须提供⼀些机制对⽤户 程序进⾏权限划分。现代的 CPU ⼀般都有⼏种不同的指令执⾏级别,就是什么样的程 序执⾏什么样的指令是有权限的。在⾼的执⾏级别下,代码可以执⾏特权指令,访问 任意内存,这时 CPU 的执⾏级别对应的就是内核态,所有的指令包括特权指令都可以 执⾏。相应的,在⽤户态(低级别指令),代码能够掌控的范围会受到限制。为什么 会出现这种情况呢?其实很容易理解,如果没有权限级别的划分,系统中程序员编写 的所有代码都可以使⽤特权指令,系统就很容易出现崩溃的情况。因为不是每个程序 员写的代码都那么健壮,或者说会⾮法访问其他进程甚⾄内核的资源,就会产⽣信息 安全问题,这也是操作系统发展的过程中保证系统稳定性和安全性的⼀种机制。让普 通程序员写的⽤户态的代码很难导致整个系统的崩溃,⽽操作系统内核的代码是由更 专业的程序员写的,有规范的测试,相对就会更稳定、健壮。

  系统调⽤是⼀种特殊的中断 • 中断分外部中断(硬件中断)和内部中断(软件中断),内部中断⼜ 称为异常(Exception),异常⼜分为故障(fault)和陷阱(trap)。 系统调⽤就是利⽤陷阱这种软件中断⽅式主动从⽤户态进⼊ 内核态的。 ⼀般来说,从⽤户态进⼊内核态是由中断触发的,可能是硬件中断, 在⽤户态进程执⾏时,硬件中断信号到来,进⼊内核态,就会执⾏这 个中断对应的中断服务例程。也可能是⽤户态程序执⾏过程中,调⽤ 了⼀个系统调⽤,陷⼊了内核态,叫作陷阱(trap)(系统调⽤是特 殊的中断)。

  中断上下⽂的切换
• CPU关键上下⽂的切换,⽐如中断信号/中断指令、iret中断返回指令
• 保存现场和恢复现场,中断处理程序的头部和尾部

系统调⽤具有以下功能和特性。

• • 把⽤户从底层的硬件编程中解放出来。操作系统为我们管理硬件,⽤户态进 程不⽤直接与硬件设备打交道。

• • 极⼤地提⾼系统的安全性。如果⽤户态进程直接与硬件设备打交道,会产⽣ 安全隐患,可能引起系统崩溃。

• • 使⽤户程序具有可移植性。⽤户程序与具体的硬件已经解耦合并⽤接⼝代替 了,不会有紧密的关系,便于在不同系统间移植。

系统调⽤的库函数就是我们使⽤的操作系统提供的 API(应⽤程序编程接⼝),API 只是 函数定义。系统调⽤是通过特定的软件中断(陷阱 trap)向内核发出服务请求,int $0x80 和syscall指令的执⾏就会触发⼀个系统调⽤。

2.进程

进程是进程实体 的运行过程,是系统进行资源分配和调度的一 个独立单位

 Linux是一个多任务多用户操作系统, 一个任务(task)就是一个进程(process)。每一个进程都 具有一定的功能和权限,它们都运行在各自独立的虚 拟地址空间。 在Linux中,进程是系统资源分配的基本单位,也是使 用CPU运行的基本调度单位。存放在磁盘上的可执行文件的代码和数据的集合称为 可执行映象(Executable Image)。当一个可执行映像装入系统中运行时,它就形成了一 个进程。

  进程控制块
  进程控制块PCB是名字为task_struct的数据结构,它称为任务结构体。任务结构体中容纳了一个进程的所有信息,是系统对 进程进行管理和控制的有效手段,是系统实现进程调 度的主要依据。 当一个进程被创建时,系统就为该进程建立一个 task_struct任务结构体。当进程运行结束时,系统撤 消该进程的任务结构体。进程的任务结构体是进程存在的唯一标志。 Linux在内存空间中开辟了一个专门的区域存放进程的 任务结构体。 进程结构体又叫做进程描述符。 Linux中每一个进程由一个task_struct数据结构 来描述(进程控制块PCB)

  进程上下文 把系统提供给进程的处于动态变化的运行环境总和 称为进程上下文。系统中的每一个进程都有它自己 的上下文。 进程因时间片用完或因等待某个事件而阻塞时,进程调度需要把CPU的使用权从当前进程交给另一个 进程,这个过程称为进程切换(procdss switching)。进程的切换又称为上下文切换(context switching).。

  系统上下文 在系统内核为用户进程服务,例如进程执行一个系 统调用时,进程的执行状态要从用户态转换为核心态。但是,此时内核的运行仍是进程的一部分,所以说这时内核是运行在进程上下文中。系统在完成自身任务时的运行环境称为系统上下文 (system context)。内核在系统上下文中执行时不会阻塞。

3.中断和异常

内核的一个主要功能就是处理硬件外设I/O 。处理器速度一般比外设快很多。内核必须处理其他任务,只有当外设真正完成了准 备好了时CPU才转过来处理外设IO。

IO方式:轮询、中断、DMA等,轮询方式效率不高,中断机制就是满足上述条件的一种解决办法

中断——异步的: 由硬件随机产生,在程序执行的任何时候可能出现。异常——同步的: 在(特殊的或出错的)指令执行时由CPU控制单元产生

中断分为:可屏蔽中断(Maskable interrupt)I/O设备发出的所有中断请求(IRQ)都可以产生可屏 蔽中断。可屏蔽中断可以处于两种状态:屏蔽的(masked)和非屏蔽的(unmasked)。非屏蔽中断(Nonmaskable interrupt)只有几个特定的危急事件才引起非屏蔽中断。如硬件故障或是掉电

异常分为:处理器探测异常 :由CPU执行指令时探测到一个反常条件时产生,如溢出、除0错等 。编程异常 :由编程者发出的特定请求产生,通常由int类指令触发,通常叫做“软中断”,例如系统调用。

对于处理器探测异常,根据异常时保存 在内核堆栈中的eip的值可以进一步分为:故障(fault):eip=引起故障的指令的地址  通常可以纠正,处理完异常时,该指令被重新执行,例如缺页异常。陷阱(trap):eip=随后要执行的指令的地址。异常中止(abort):eip=???发生严重的错误。eip值无效,只有强制终止受影响的进程

4.进程管理

进程切换:本质上说每个进程切换有两步组成:切换页全局目录以安装一个新的地址空间。切换内核态堆栈和硬件上下文

进程调度:非剥夺方式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。

剥夺方式:当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程、优先原则、 时间片原则。

调度时机
 时机1:进程状态发生变化时处于运行态下的进程要等待某种资源、运行态下的进程在程序执行完毕后,通过调用内核函数do_exit()终止运行并转入僵死态、 处于等待态的进程被唤醒后,将加入到可运行队列中时、进程从运行态转入暂停态时 、进程从暂停态成为可运行态时。时机2:当前进程时间片用完时。时机3:进程从系统调用返回到用户态时。时机4:中断处理后,进程返回到用户态时

Linux的进程调度是基于优先级的调度 。 Linux的进程分为普通进程和实时进程,在基于优先级的算法下实时进程的优先级高于普通进程。Linux中进程的优先级是动态的,调度程序周期性的调整他们的优先级,避免进程饥饿。Linux对实时进程和普通进程采用不同的调度策略

普通进程按照SCHED_OTHER调度策略进行进程调度。 实时进程按照SCHED_FIFO或SCHED_RR策略进行调度。 SCHED_FIFO是按先进先出方法选择下一个使用CPU的进程。 SCHED_RR是实时进程的时间片轮转法策略。

5. 文件系统

文件是:具有符号名的、在逻辑上具有完整意义的一组相关信息项的有序序列。文件的符号名称作文件名,它是用户在创建文件时确定的,并在以后访问文件时使用。信息项是构成文件内容的基本单位,它可以是一个字符,也可以是一个记录;记录可以等长,也可能不等长。各信息项之间具有顺序关系。
通常,系统为一个正在使用的文件提供读和写指针。读指针用来记录文件当前的读取位置,它指向下一个将要读取的信息项;写指针用来记录文件当前的写入位置,下一个将要写入的信息项将被写到该处。文件建立在外存空间,以便使文件能够长期保存。即:文件一旦建立,就一直存在,直到被删除或超过事先规定的保存期限。

文件系统的一个最大特点是“按名存取”,用户只要给出文件的符号名就能方便地存取在外存空间的文件信息,而不必关心文件的具体物理地址。为了便于对文件进行管理,设计了文件目录,用于检索系统中的所有文件。而实现文件符号名到文件物理地址映射的主要环节是检索文件目录。系统为每个文件设置一个描述性数据结构——文件控制块FCB(File Control Block),文件目录就是文件控制块的有序集合。

文件控制块FCB是系统为管理文件而设置的一个数据结构。FCB是文件存在的标志,它记录了系统管理文件所需要的全部信息。
 硬链接(hard link)
一般情况下,一个常见的文件名代表了到对应文件的一个硬链接
一个文件可以有不同的硬链接,他们可以在同一个目录下,也可以在不同的目录下,因此一个文件可以有不同的文件名
下面的命令可以创建一个硬链接
    $ ln p1 p2
其中p1指明一个现有的文件的路径名
p2指明新建立的硬链接的路径名
硬链接的限制:不允许用户给目录创建硬链接,只有在同一个文件系统的文件之间才能创建硬链接
软链接(symbolic link)
符号链接是一种特殊的文件(短文件),它包含另一个文件的任意一个路径名
可以指向任意一个文件系统的任意文件,甚至一个不存在的文件
下面的命令可以创建一个软链接
$ ln -s p1 p2
文件系统调用
打开文件:如果使用文件,首先要打开。以建立用户和文件的联系。打开文件系统调用的一般格式:open(文件名,读写方式。读写方式可为读、写和既读又写等。
读文件:打开文件后,就可以读取文件中的信息。读文件系统调用的一般格式:read(文件名,内存位置,记录键)。表示把指定文件中给定键值的记录读入内存指定单元。
写文件:写文件系统调用的一般格式:write(文件名,内存位置,记录键 )。表示把内存中指定单元的数据作为指定键值的一个记录写入指定文件中,系统还将为其分配物理块,以便把记录信息写在外存上。
关闭文件:若文件暂时不用,则应将它关闭。文件关闭后一般不能存取,若要存取,则必须再次打开。关闭文件系统调用的一般格式:close(文件名)。系统根据用户提供的文件名或文件描述符,在该文件的文件控制块上做修改。
虚拟文件系统模型:第一层为文件系统接口层,如open、write、close等系统调用接口。第二层为VFS (Virtual File System)接口层。该层有两个接口:一个是与用户的接口;一个是与特定文件系统的接口。VFS与用户的接口将所有对文件的操作定向到相应的特定文件系统函数上。VFS与特定文件系统的接口主要是通过vfs-operations来实现的。第三层是具体文件系统层,提供具体文件系统的结构和实现,包括网络文件系统,如NFS (network file system)。
VFS抽象界面主要由一组标准的文件操作构成,以系统调用的形式提供给用户程序,如read()、write()等
Linux的虚拟文件系统对多种类型的文件系统提供更为广泛的支持。不同的文件系统与VFS之间的界面是一个file_operations数据结构。
每个进程通过打开文件与具体的文件建立起连接,或者说建立起一个读/写的上下文。该连接用一个file数据结构来表示,结构中有个类型为file_operations的指针域f_op。将指针域f_op设置成指向某个具体的文件系统所提供的一组操作函数。
每个文件系统都有自己的文件操作集合,执行读写文件的操作。当内核将一个索引节点从磁盘装入内存时,会在file_operations数据结构中存放一个指向这些文件操作的指针。
VFS的数据结构:
超级块对象:超级块对象描述一个文件系统的信息;对于每个具体的文件系统来说,都有各自的超级块,如Ext2超级块,并被存放在磁盘特定扇区上。当内核对一个具体文件系统进行初始化和注册时,调用文件系统提供的函数为其分配一个VFS超级块,并从此判读取具体文件系统超级块中的信息填充进来。VFS超级块是各个具体文件系统安装时才建立的,并在这些具体文件系统卸载时被自动删除,故VFS超级块仅存于主存中。
索引节点对象:Inode对象内包含了内核在操作文件或目录时需要的全部信息,文件名可以更改,但inode对文件是唯一的,且随文件的存在而存在。一个Inode代表文件系统中的一个文件,它可以是设备或管道这类特殊文件,故Inode中会包含特殊的项。
目录项对象:VFS把每个目录看作一个文件,如在路径/tmp/test中,tmp和test都是文件,tmp是目录文件,而test是普通文件; tmp和test都有一个inode对象表示。每一个文件除了有一个inode数据结构外,还有一个dentry数据结构与之关联,该结构中的d_inode指针指向相应的inode结构。dentry数据结构可以加快对文件的快速定位,改进文件系统的效率。Dentry描述文件的逻辑属性,它在磁盘上没有对应的映像; inode结构记录文件的物理属性,在磁盘上有对应的映像。
文件对象:文件对象在磁盘上没有映像,在文件被打开时创建由一个file结构组成。文件对象中的信息主要是文件指针,即文件中当前的位置,下一个操作将在该位置发生。file结构除保存文件当前位置外,还把指向该文件inode的指针放在其中,并形成一个双项链表,称系统打开文件表。

 安装根文件系统
第一阶段:安装一个特殊的rootfs文件系统,该文件系统仅提供一个作为初始安装点的空目录  init_mount_tree
第二阶段:内核在空目录上安装实际根文件系统


用户打开文件表和系统打开文件表的区别

 

posted @ 2020-07-09 14:16  1233saaa  阅读(394)  评论(0)    收藏  举报