码迷,mamicode.com
首页 > 其他好文 > 详细

课程学习总结报告

时间:2020-07-07 13:37:06      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:load   数据存储   --   linux操作   flag   例程   加强   检查   分类   

Linux内核主要由以下几个功能:进程管理、文件系统、IO体系结构和设备驱动程序、内存管理等等。

技术图片

 

 

下面对Linux的各个功能进行简单的介绍。

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

文件系统:在Linux中,一切都是文件,通过对文件的定义和操作来控制设备的执行和数据的存储。并且使用VFS虚拟文件系统,实现对多种文件系统的兼容。

IO体系结构和设备驱动程序:在Linux中,驱动是应用软件和硬件的桥梁,应用程序只需要调用系统软件的应用编程接口,就可以让相应的硬件完成工作,通过设备驱动程序的定义和运行实现了对IO设备操作的控制。

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

 

 1.进程管理

一个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。

一个进程的执行是在进程的上下文中执行。

当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。

当进行上下文切换时系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。

系统调用的过程:

 技术图片

  

  1. 应用程序 代码调用系统调用( xyz ),该函数是一个包装系统调用的 库函数 ;
  2. 库函数 ( xyz )负责准备向内核传递的参数,并触发 软中断 以切换到内核;
  3. CPU 被 软中断 打断后,执行 中断处理函数 ,即 系统调用处理函数 ( system_call);
  4. 系统调用处理函数 调用 系统调用服务例程 ( sys_xyz ),真正开始处理该系统调用。

2.文件系统

对于计算机来说,所谓的数据就是0和1的序列。这样的一个序列可以存储在内存中,但内存中的数据会随着关机而消失。为了将数据长久保存,我们把数据存储在光盘或者硬盘中。根据我们的需要,我们通常会将数据分开保存到文件这样一个个的小单位中(所谓的小,是相对于所有的数据而言)。但如果数据只能组织为文件的话,而不能分类的话,文件还是会杂乱无章。每次我们搜索某一个文件,就要一个文件又一个文件地检查,太过麻烦。文件系统(file system)是就是文件在逻辑上组织形式,它以一种更加清晰的方式来存放各个文件。 

文件被组织到文件系统(file system)中,通常会成为一个树状(tree)结构。Linux有一个根目录/, 也就是树状结构的最顶端。这个树的分叉的最末端都代表一个文件,而这个树的分叉处则是一个目录(directory, 相当于我们在windows界面中看到的文件夹)。在图1中看到的是整个的一个文件树。如果我们从该树中截取一部分,比如说从目录vamei开始往下,实际上也构成一个文件系统。要找到一个文件,除了要知道该文件的文件名,还需要知道从树根到该文件的所有目录名。从根目录开始的所有途径的目录名和文件名构成一个路径(path)。比如说,我们在Linux中寻找一个文件app_mysql.c,不仅要知道文件名(app_mysql.c),还要知道完整路径,也就是绝对路径(/home/howin/linux/NO.8/app_mysql.c)。从根目录录/, 也就是树状结构的最顶端出发,经过目录home, howin, linux,NO.8,最终才看到文件app_mysql.c。整个文件系统层层分级(hierarchy),howin是home的子目录,而home是howin的父目录。

在Linux中,我们用tree命令来显示目录的树状结构:

技术图片

Linux解释一个绝对路径的方式如下:先找到根目录文件,从该目录文件中读取home目录文件的位置,然后从home文件中读取howin的位置……直到找到目录NO.8中的app_mysql.c的位置。

由于目录文件中都有.和..的条目,我们可以在路径中加入.或者..来表示当前目录或者父目录,比如/home/howin/linux/NO.8/app_mysql.c与./linux/NO.8/app_mysql.c等同。 此外,Linux会在进程中,维护一个工作目录(present working directory)的变量。在shell中,你可以随时查询到到工作目录(在命令行输入$pwd)。这是为了省去每次都输入很长的绝对路径的麻烦。比如说我们将工作目录更改为/home/howin/linux ($cd ..),那么此时我们再去找app_mysql.c就可以省去/home/howin/ ($ls ./NO.8),这样得到的路径叫相对路径(relative path),上面的就是这样一个相对路径。

当文件出现在一个目录文件中时,我们就把文件接入到文件系统中,我们称建立一个到文件的硬链接(hard link)。一个文件允许出现在多个目录中,这样,它就有多个硬链接。当硬链接的数目(link count)降为0时,文件会被Linux删除。所以很多时候,unlink与remove在Linux操作系统中是一个意思。由于软链接(soft link)的广泛使用(soft link不会影响link count,而且可以跨越文件系统),现在较少手动建立硬连接。

对于文件,我们可以读取(read),写入(write)和运行(execute)。读取是从已经存在的文件中获得数据。写入是向新的文件或者旧的文件写入数据。如果文件储存的是可执行的二进制码,那么它可以被载入内存,作为一个程序运行。在Linux的文件系统中,如果某个用户想对某个文件执行某一种操作,那么该用户必须拥有对该文件进行这一操作的权限。文件权限的信息保存在文件信息(metadata)中,文件自身包含的只有数据。文件名实际上储存在目录文件。除了这些之外,还有操作系统维护的文件附加信息,比如文件类型,文件尺寸,文件权限,文件修改时间,文件读取时间等。

此外,当我们创建文件的时候,比如使用touch,它会尝试将新建文件创建为权限666,也就是rw-rw-rw-。但操作系统要参照权限mask来看是否真正将文件创建为666。权限mask表示操作系统不允许设置的权限位,比如说037(----wxrwx)的权限mask意味着不允许设置设置group的wx位和other的rwx位。如果是这个权限mask的话,最终的文件权限是rw-r----- (group的w位和other的rw位被mask)。

计算机本质上是对数据进行处理的工具,而文件是数据储存的逻辑载体,所以了解Linux文件系统很重要。对于文件系统的了解要结合Linux的其他方面(比如用户管理)进行有机的学习。

3.中断:

为了处理是处理硬件外设I/O,有了中断机制这个东西。

中断分外部中断(硬件中断)和内部中断(软件中断)。内部中断?称为异常(Exception),异常?分为故障(fault)和陷阱(trap)。中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应。中断是异步的:由硬件随机产生,在程序执行的任何时候可能出现;异常是同步的:在(特殊的或出错的)指令执行时由CPU控制单元产生。

系统调用作为一种特殊的中断,就是利?陷阱(trap)这种软件中断?式主动从?户态进?内核态的。

此时就不得不牵扯到操作系统的“两把宝剑”进程上下文中断上下?

进程上下文是把系统提供给进程的处于动态变化的运行环境总和。

中断上下文它是一个内核控制路径,代表了中断发生时正在运行的进程执行。

中断的处理过程:

  1. 确定中断向量。
  2. 利用中断向量在IDT中找到对应中断门,在中断门中得到段选择符从而可以从GDT中找到中断服务例程的段基址。
  3. 确定中断发生的特权级合法(linux只有内核态和用户态两种特权级,此步用来检查中断程序的特权是否低于引起中断的程序的特权,低优先级程序不能引起高优先级程序)
  4. 检查是否发生特权级变化(用户态陷入内核态,这时候需要设置内核的堆栈),如果发生读取当前程序的tss段(通过tr寄存器读取)来选择新特权级的ss和esp指针,然后保存旧的ss和esp指针。
  5. 若发生的是故障,用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。
  6. 在栈中保存eflags、cs和eip的内容。
  7. 如果异常产生一个硬件出错码,则将它保存在栈中。
  8. 装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址。

 技术图片

 

课程总结和心得体会

孟老师和李老师开的这么课是比较火的一门课,前不久还在B站刷到了孟老师的庖丁解牛深入理解linux内核。这门课的实践性非常强,需要很强的动手能力,对于没有linux和c基础的学生还是非常吃力的。虽然Linux内核代码看起来比较枯燥,但是两位老师的讲课风格还是比较有趣的。通过学习《Linux操作系统分析》,了解了Linux操作系统的基本原理,能够使用Linux系统进行日常的使用和学习,更加强了对操作系统原理的认识,做一定的知识储备。 当然现在了解到的还只是冰山一角,希望自己能够再接再厉,日后为linux的发展尽一份力。

课程学习总结报告

标签:load   数据存储   --   linux操作   flag   例程   加强   检查   分类   

原文地址:https://www.cnblogs.com/yongjason/p/13259951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!