概述及名词解释
概述:
LinuxIO可以初步定为七层
应用层(ApplicationLayer)
系统调用层(System CallLayer)
虚拟文件系统层(VFS Layer)
通用块层(Generic BlockLayer)
IO调度层(I/O SchedulerLayer)
块设备驱动层(Block DeviceDriver Layer)
块设备层(Block DeviceLayer)
其中应用层属于用户态,块设备层属于硬件设备层,其他5层均属于内核态。
名词解释:
什么是用户态和内核态?
用户态(user mode)在计算机结构指两项类似的概念。在CPU的设计中,用户态指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。在操作系统的设计中,用户态也类似,指非特权的执行状态。内核禁止此状态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。
用户态不允许程序进行处理器中要求特权态的操作,以避免操作系统崩溃。每个进程都在各自的用户空间中运行,而不允许存取其他程序的用户空间。
x86结构拥有四种级别,级别最高的是ring 0,也就是内核态。级别最低的是ring 3,也就是用户态。ring 1和ring 2设计成供驱动程式使用,但一般很少使用。
用户态与内核态切换
当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地 称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。
通俗来说,
1、用系统调用时进入内核态。Linux 对硬件的操作只能在内核态,这可以通过写驱动程序来控制。在用户态操作硬件会造成coredump。
2、要注意区分系统调用和一般的函数。系统调用由内核提供,如read()、write()、open()等。而一般的函数由软件包中的函数库提供,如sin()、cos()等。在语法上两者没有区别。
3、一般情况:系统调用运行在内核态,函数运行在用户态。但也有一些函数在内部使用了系统调用(如fopen),这样的函数在调用系统调用是进入内核态,其他时候运行在用户态。
上下文切换
处理器总处于以下状态中的一种:
1、内核态,运行于进程上下文,内核代表进程运行于内核空间;
2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
3、用户态,运行于用户空间。
用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)