课程学习总结报告

一、要求

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

谈谈您对课程的心得体会,改进建议等。

 

二、Linux系统模型概念

 

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

 

三、中断和异常

  内核的一个主要功能就是处理硬件外设I/O,处理器速度一般比外设快很多而内核必须处理其他任务,只有当外设真正完成了准备好了时CPU才转过来处理外设I/O 。为了使得CPU的处理效率更高,就采用中断机制。

  中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应。中断信号提供了一种特殊的方式,使得CPU转去运行正常程序之外的代码。中断或异常处理程序执行的代码不是一个进程,它是一个内核控制路径,代表了中断发生时正在运行的进程执行。

  中断分为:可屏蔽中断(Maskable interrupt): I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断。

       非屏蔽中断(Nonmaskable interrupt):只有几个特定的危急事件才引起非屏蔽中断。如硬件故障或是掉电

  每个中断和异常由0~255之间的一个数 (8位)来标识,Intel称其为中断向量。

   中断描述符表是一个系统表,它与每一个中断或者异常向量相联系

 

  怎么进入一个中断/异常

 

  1.当执行了一条指令后,cs和eip这对寄存器包含 了下一条将要执行的指令的逻辑地址

  2.在执行这条指令之前,CPU控制单元会检查在 运行前一条指令时是否发生了一个中断或者异 常。

  3.如果发生了一个中断或异常,那么CPU控制单元执行下列操作:
    1.确定与中断或者异常关联的向量i(0~255)

    2.读idtr寄存器指向的IDT表中的第i项

    3.从gdtr寄存器获得GDT的基地址,并在GDT中查找, 以读取IDT表项中的段选择符所标识的段描述符

    4.确定中断是由授权的发生源发出的。

    5.检查是否发生了特权级的变化,一般指是否由 用户态陷入了内核态。 如果是由用户态陷入了内核态,控制单元必须开 始使用与新的特权级相关的堆栈 a,读tr寄存器,访问运行进程的tss段 b,用与新特权级相关的栈段和栈指针装载ss和esp寄存 器。这些值可以在进程的tss段中找到 c,在新的栈中保存ss和esp以前的值,这些值指明了与 旧特权级相关的栈的逻辑地址
    6.若发生的是故障,用引起异常的指令地址修改cs 和eip寄存器的值,以使得这条指令在异常处理结 束后能被再次执行

    7.在栈中保存eflags、cs和eip的内容

    8.如果异常产生一个硬件出错码,则将它保存在栈中

    9.装载cs和eip寄存器,其值分别是IDT表中第i项门 描述符的段选择符和偏移量字段。这对寄存器值 给出中断或者异常处理程序的第一条指定的逻辑地址。

 

四、进程管理

 

进程状态的转换

 

状态转换时调用的函数

 

   当一个进程被创建时,系统就为该进程建立一个 task_struct任务结构体。当进程运行结束时,系统撤消该进程的任务结构体。进程的任务结构体是进程存在的唯一标志。进程的任务结构体为内核管理进程,提供了内核所需了解的进程信息。

  Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:   Thread_info  、进程的内核堆栈

 

五、文件系统

 

   系统调用都是通过Linux文件系统调用字符设备驱动、块设备驱动

  对大多数用户来说,文件系统是操作系统中最 直接可见的部分。计算机的重要作用之一就是能快速处理大量信息,从而,信息的组织、存取和保管就成为一 个极为重要的内容。文件系统是计算机组织、存取和保存信息的重要手段。

   用户在使用文件系统时,可以利用操作 系统提供的系统调用(或称广义指令) 来完成具体的操作。下面介绍常用的文件系统调用open():

  1.open()函数执行到C库中

  2.C库中有int0x80指令,找到中断异常向量表第128项系统调用的中断描述符,里面有对应的中断处理程序的CS、eip,因此能够找到中断异常的程序处理入口

  3.调用sys.open()函数

  4.通过参数找到设备文件打开函数,得到设备号,找到对应的cdev,找到设备驱动程序的位置。

  5.得到创建系统文件打开file表,拷贝cdev中的处理函数,放到file表中

  6.在进程文件打开表的fd数组中找到一个空闲的位子,指向file表

  7.将fd数组的下标通过open()函数返回

  8.然后read()、write()等操作函数就可以通过fd指针,找到file-opreation中对应的操作函数。

 

六、学习心得

  第一次详细接触《Linux操作系统》对于很多方面学习起来还是比较困难的,孟宁老师上课时会一层一层解析代码,有时候讲的时间长了会忘记上面讲了什么。李春杰老师讲的部分比较深入、也是从理论和代码两个方面进行讲解。两位老师的授课都非常的有耐心,不明白的地方会一次一次的讲解。非常感谢两位老师的悉心指导。想要学要这门课程还是需要下很大的功夫,希望以后我能够在实践中更加了解这门课程的精髓。

 

  

 

  

 

posted @ 2020-07-09 19:15  小国旗  阅读(241)  评论(0)    收藏  举报