linux内核空间和用户空间详解

 

linux驱动程序通常工做在内核空间,但也能够工做在用户空间。下面咱们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。
Linux简化了分段机制,使得虚拟地址与线性地址老是一致,所以,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。由于每一个进程能够经过系统调用进入内核,所以,Linux内核由系统内的全部进程共享。因而,从具体进程的角度来看,每一个进程能够拥有4G字节的虚拟空间。

    Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中能够看出(这里没法表示图),每一个进程有各自的私有用户空间(0~3G),这个空间对系统中的其余进程是不可见的。最高的1GB字节虚拟内核空间则为全部进程以及内核所共享。

  内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不论是内核空间仍是用户空间,它们都处于虚拟空间中。 
虽然内核空间占据了每一个虚拟空间中的最高1GB字节,但映射到物理内存却老是从最低地址(0x00000000)开始。对内核空间来讲,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫作PAGE_OFFSET。


内核空间和用户空间之间如何进行通信? 
内核空间和用户空间通常经过系统调用进行通讯。 


如何判断一个驱动是用户模式驱动仍是内核模式驱动?  判断的标准是什么? 

用户空间模式的驱动通常经过系统调用来完成对硬件的访问,如经过系统调用将驱动的io空间映射到用户空间等。所以,主要的判断依据就是系统调用。 
内核空间和用户空间上不一样太多了,说不完,好比用户态的链表和内核链表不同;用户态用printf,内核态用printk;用户态每一个应用程序空间是虚拟的,相对独立的,内核态中却不是独立的,因此编程要很是当心。等等。

还有用户态和内核态程序通信的方法不少,不仅仅是系统调用,实际上系统调用是个很差的选择,由于须要系统调用号,这个须要统一分配。 
能够经过ioctl、sysfs、proc等来完成。

 

 

 

 

 

内核态和用户态

 

 

 

当一个任务(进程)执行系统调用而陷入内核代码中执行时,咱们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每一个进程都有本身的内核栈。当进程在执行用户本身的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而忽然被中断程序中断时,此时用户程序也能够象征性地称为处于进程的内核态。由于中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些相似。

 



进程上下文和中断上下文

 

 

 

处理器总处于如下状态中的一种: 一、内核态,运行于进程上下文,内核表明进程运行于内核空间; 二、内核态,运行于中断上下文,内核表明硬件运行于内核空间; 三、用户态,运行于用户空间。 用户空间的应用程序,经过系统调用,进入内核空间。这个时候用户空间的进程要传递不少变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,能够看做是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。 硬件经过触发信号,致使内核调用中断处理程序,进入内核空间。这个过程当中,硬件的一些变量和参数也要传递给内核,内核经过这些参数进行中断处理。所谓的“中断上下文”,其实也能够看做就是硬件传递过来的这些参数和内核须要保存的一些其余环境(主要是当前被打断执行的进程环境)。
相关文章
相关标签/搜索