课程学习总结报告

一学期的课程就这样结束了,涉及的内容不少,但要把这些内容整合在一起重新组织纳入到自己的知识体系中还是比较困难,尽力而为吧。

下面内容是按照各个模块进行总结,就算是期末前的复习了。

 

系统调用与用户态和内核态以及用户空间和内核空间之间的关系

为了更好的进行资源管理以及维护计算机系统的稳定,程序在计算机上运行都会区分用户态内核态。程序处于用户态只能访问有限的资源、执行有限的指令,而在内核态则可以访问所有的资源,执行全部的指令。内存就是计算机系统中一个十分重要的资源,在32位linux系统上有4GB的进程地址空间,处于高地址端的1GB空间为内核空间,剩余为3GB用户空间。处于用户态的程序只能访问用户空间,而处于内核态的程序则可以访问全部的进程地址空间。

如何从用户态进入内核态?一般情况下,用户态到内核态的转换是由中断触发的,可能是硬件中断或者软件中断。系统调用就是一种软件中断,通过系统调用可以主动让用户程序从用户态转换到内核态。

 

语言提供的编程接口与系统调用之间的关系

以C语言为例,C标准库中提供了一系列与文件操作相关的函数,如open()、read()、write();也提供了一些基本的数学函数如abs()、sqrt()、exp()。

前者涉及到文件操作,这部分功能是在操作系统内核中提供的,所以open,read,write内部必然封装了相应的系统调用。后者只涉及相关的数学计算无需内核提供相应的支持。总结来说,应用编程接口(API)可能是系统调用的进一步封装,以加强系统调用的功能,也可以是简单的用户态程序,内部没有封装任何系统调用。

 

系统调用的基本流程(为保证篇幅,下面以文字进行叙述,不贴代码了)

1. 将系统调用号保存在%eax寄存器中,然后通过int 0x80触发系统系统

2. 硬件根据中断向量号查询IDT(中断描述符表),获得对应的表项集即中断描述符。特权级检查通过后,硬件将切换到内核栈(tss.ss0 : tss.esp0)。

3. 进到内核态后,首先保存用户态寄存器的上下文,然后根据中断描述符中的段选择符拿到段描述符,从段描述符中拿到段基址加载cs,offset加载到eip,然后跳转到中断处理入口entry_INT80_32。

4. 根据系统调用号跳转到相应的处理模块

5. 系统调用返回时,iret 将先前压栈的 ss / sp / eflags / cs / ip 弹出,恢复用户态调用时的寄存器上下文。

 

进程和进程控制块

由操作系统的知识我们知道进程是程序的一次执行,是一个动态的概念。从内核观点看,进程的目的就是担当系统分配资源的实体。

进程控制块(PCB)唯一表示了一个进程,是进程存在的唯一标志。进程的创建和销毁就是PCB的创建和销毁。操作系统管理进程就是管理PCB。

父子进程可以共享含有程序代码的页,但是他们有各自独立的数据拷贝(栈和堆),因此父子进程对内存单元的修改是相互不可见的。

linux中PCB对应的数据结构是task_struct,该结构体中需要重点关注的有thread_info、mm->mm_struct、fs->fs_struct、files->files_strcut。 和后面的进程地址空间和文件系统有紧密的联系。

进程创建

linux中除去0号进程init_task是通过硬编码固定下来的,没有经过kernel_thread和fork。其余的进程都是由已存在的进程创建的,分为称为父进程和子进程。内核启动过程中又接着创建了1号进程和2号进程,1号进程是所有用户态进程的祖先,2号进程是所有内核态进程的祖先。

fork()、vfork()、do_fork()最终都是调用_do_fork来创建进程。

_do_fork主要通过copy_process()复制进程描述符和其它所需数据结构,然后调用wake_up_new_task()将进程加入就绪队列,最后返回子进程的pid。

copy_process函数中调用了dup_task_struct复制当前进程的进程描述task_structcopy_thread_tls初始化⼦进程内核栈。

 

什么是文件,文件系统

文件是具有符号名的,在逻辑上具有完整意义的一组相关信息项的有序序列。信息项是构成文件内容的基本单位,它可以是一个,也可以是一个记录。

文件系统就是操作系统中实现文件统一管理的一组软件被管理的文件以及为实施文件管理所需要的一些数据结构的总称 。文件系统的一个最大特点是“按名存取”,用户只要给出文件的符号名就能方便地存取在外存空间的文件信息,必关心文件的具体物理地址。

 

文件目录与目录文件

文件与文件控制块是一一对应的。文件控制块的有序集合构成文件目录,每个目录项即是一个文件控制块。给定一个文件名,通过查找文件目录便可以找到该文件对应的PCB。

文件目录是需要持久化保存的。为了实现文件目录的管理,通常将文件目录以文件的形式保存在外存空间上,这个文件就叫做目录文件。目录文件是长度固定的记录式文件。

 

根文件系统挂在的流程

1. 挂载虚拟的文件系统rootfs作为初始文件系统

2. 挂载真正的根文件系统替换rootfs

start_kernel()-->vfs_caches_init()-->mnt_init

在mnt_init中调用init_rootfs()注册根文件系统,然后调用init_mount_tree把rootfs挂载到/目录

 

posted @ 2020-07-09 21:15  luoyang712  阅读(162)  评论(0编辑  收藏  举报