您的位置:首页 > 运维架构 > Linux

可能是关于Linux系统的一些....

2018-09-06 19:13 232 查看

linux系统中关于设备的一个抽象就是文件,也就是那句linux下一切皆是文件。

关于文件的操作,无非就是读,写,lseek,类似这种,但是总有例外,比方说socket也是文件描述符,但是不支持lseek这种操作哦。所以,linux下文件仅仅是抽象的一种统称

具体实现上面所支持的操作,还要去查文档。

先来说一下 当进行write的时候操作系统都发生了哪些事情?

一般来讲,上层使用的都是用户空间的函数,不能访问内核空间,所以,一般这种函数调用之后,都会切换到内核,转调内核提供的函数。 系统调用是应用程序与内核交互的一种方式。系统调用作为一种接口,通过系统调用,应用程序能够进入操作系统内核,从而使用内核提供的各种资源,比如操作硬件,开关中断,改变特权模式等等。首先,系统调用是一个软中断,既然是中断那么一般就具有中断号和中断处理程序两个属性,Linux使用0x80号中断作为系统调用的入口,而中断处理程序的地址放在中断向量表里。

当进行write函数调用的时候,eax寄存器保存了系统调用的编号,其他寄存器用来存放函数的参数,然后陷入到内核,执行系统调用对应的函数。返回值,放在eax寄存器中。

陷入内核的方式是软中断,也就是编号为0x80的中断,然后系统到中断向量表中记录0x80号的中断处理程序,执行中断处理程序。一般系统内核的处理程序都是sys_开头的。

也就是会调用sys_write函数。这个层面还仅仅是操作系统层面上,还没有涉及到具体对文件的操作。由于linux下的文件系统的虚拟文件系统,提供了一整套同一的api调用,接下来会调用vfs_write系统函数,这个层面是虚拟文件系统的层面。最后才是真正的文件进行写操作。当确定了具体的文件系统以后,就会调用具体文件系统提供的api函数,比如,如果是ext类型的文件系统,调用的就是ext4_frile_write。但是文件的写操作不会直接写到硬盘上面,而是先写到linux内核中,linux系统会在合适的时间将这些数据flush到磁盘文件上面,大概这就是整个流程。

linux系统为了保证用户空间不能直接操作硬件,将内存空间分为两个部分,一个是用户空间,另外一个是内核空间,用户空间可以通过系统调用的方式切换到内核空间,从而访问内核管理的资源,而不能直接操作内核管理的资源。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态) 此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。

当进程在执行用户自己的代码时,则称其处于用户运行态(用户态) 。 此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。

程序在执行过程中通常有用户态和内核态两种状态,CPU对处于内核态根据上下文环境进一步细分,因此有了下面三种状态:

内核态,运行于进程上下文,内核代表进程运行于内核空间。 
内核态,运行于中断上下文,内核代表硬件运行于内核空间。 
用户态,运行于用户空间。

上下文context: 上下文简单说来就是一个环境。

用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存 器值、变量等。 

所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。 

一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

用户级上下文: 正文、数据、用户堆栈以及共享存储区; 
寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP); 

系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

当发生进程调度时, 进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。

硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的 一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。 所谓的“ 中断上下文”其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。 中断时,内核不代表任何进程运行,它一般只访问系统空间,而不会访问进程空间,内核在中断上下文中执行时一般不会阻塞。

当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行 。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: