如何看待Linux操作系统的用户空间和内核空间

作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡。稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中ring0特权最高,ring3的特权最低,之所以要做这样的区分一个主要目的是保护资源,通俗来讲要保护的资源无非就是“内存、I/O端口以及执行特殊机器指令的能力”。任何一个时刻,x86 CPU都是在一定的特权模式下运行。同样,对于ARM体系的CPU 一共有七种运行模式,分别是:用户模式(usr)、快速中断模式(fiq)、中断模式(irq)、管理模式(svc)、系统模式(sys)、数据访问终止模式(abt)和未定义指令终止模式(und)。除了用户模式外,其他6中工作模式都属于特权模式,而特权模式中除了系统模式外,其他5种模式又称为异常模式。

那么底层硬件CPU的这种特性,跟我们将要讨论的用户模式和内核模式又有什么关系呢?让我们正本溯源来端正一下对操作系统的认识。每位教操作系统课程的老师都会告诉大家:所谓的操作系统呢,就是对硬件资源进行统一管理的系统,并向用户提供业务接口的软件系统。通俗来讲,【操作系统就是要能管理你的CPU和内存,驱动你的硬盘,管理你的网卡和显示器,然后当你点击鼠标和敲击键盘时能做出正确的响应。】够通俗了吧。

那么问题就来了,以CPU为例,如果你是一个操作系统的设计者,你会如何处理不同CPU体系架构的差异性(如Intel、ARM,抑或AMD、MIPS等)?当然这个问题不是一般人能hold得了的,CU论坛里开发都江堰操作系统那位大牛前辈确实值得让吾辈佩服和敬仰。继续我们的话题,也就是说不同的操作系统在处理CPU体系架构的差异化方面是不相同的,有些操作系统,就提供了用户模式和内核模式这种机制 (例如linux),而有些操作系统呢,又没有用户态和内核态之分(例如vxWorks)。后者不在我们的讨论范围,感兴趣的童鞋可以自己去google一下。

以Linux系统和Intel x86的CPU为例,Linux使用了ring0模式来运行内核态的代码,ring3来运行用户态的代码,ring1和ring2没有使用。32为操作系统可寻址范围是0~4GB,为此Linux系统将其分为了用户空间和内核空间两部分:

其中用户空间占低位的3GB空间,范围从虚拟地址的0x00000000到0xBFFFFFFFF,内核空间占用了高位的1GB空间,虚拟地址范围从0xC0000000到0xFFFFFFFF。

内核空间里存放的是整个内核代码和所有内核模块,以及内核所维护的数据。当用户运行一个程序时,该程序所创建的进程一开始是运行在用户空间的,当它要执行网络发送数据等动作时,必须通过调用write、send等系统函数来完成,这些系统调用会去调用内核中的代码来完成用户的请求操作,这时CPU必须从ring3切换到ring0,然后进入内核地址空间去执行这些代码完成操作,完成后又切换回ring3,回到用户态。

所以,我们可以看到,提供了用户模式和内核模式的操作系统,用户态的程序就不能随意操作内核地址空间里的数据,具有一定的安全保护作用;于此同时,在实时性方面稍微有所牺牲。也要就是说,只要内核代码没有问题,用户空间程序的错误和BUG一般来说不会导致系统崩溃,提高了系统的健壮性。

这么看来,内核确实比较“拽”,而Linux也提供了一些用户空间和内核空间通讯的机制,使我们可以开发出更高效的程序。但一定要记住,内核中一点小小的错误都是会导致整个系统崩溃,所以开发内核程序时一定要非常小心谨慎。

本文作者:佚名

来源:51CTO

时间: 2024-08-03 06:48:47

如何看待Linux操作系统的用户空间和内核空间的相关文章

linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间

转载 - linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间 作者 digoal 日期 2016-11-20 标签 Linux , 用户空间 , 内核空间 , 用户态 , 内核态 , 进程上下文 , 中断上下文 背景 原文 http://blog.csdn.net/bingqingsuimeng/article/details/7924756 原文 linux驱动程序一般工作在内核空间,但也可以工作在用户空间.下面我们将详细解析,什么是内核空间,什么是用户空间,以及

Linux用户空间与内核空间(理解高端内存)

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中.   Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图.   Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间.注意这里

linux内存管理--用户空间和内核空间

关于虚拟内存有三点需要注意: 4G的进程地址空间被人为的分为两个部分--用户空间与内核空间.用户空间从0到3G(0xc0000000),内核空间占据3G到4G.用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址.例外情况只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间. 用户空间对应进程,所以每当进程切换,用户空间就会跟着变化:而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的.内核空间地址有自己对应的页表,用户进程各自有不同的页表. 每

用户空间与内核空间,进程上下文与中断上下文[总结]

1.前言 最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文.看着很熟悉,半天又说不出到底是怎么回事,有什么区别.看书过程经常被感觉欺骗,似懂非懂的感觉,很是不爽,今天好好结合书和网上的资料总结一下,加深理解. 2.用户空间与内核空间 我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保

Linux Malloc分析-从用户空间到内核空间【转】

转自:http://blog.csdn.net/ordeder/article/details/41654509 版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文章,未经博主允许不得转载.   目录(?)[-] 1背景知识 1 进程的用户空间  12 地址映射 malloc 和free 1 用户层 2 内核层 3 虚拟地址与物理地址 总结 参考 附录   本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系

linux内核空间与用户空间信息交互方法

     摘要:在进行设备驱动程序,内核功能模块等系统级开发时,通常需要在内核和用户程序之间交换信息.Linux提供了多种方法可以用来完成这些任务.本文总结了各种常用的信息交换方法,并用简单的例子演示这些方法各自的特点及用法.其中有大家非常熟悉的方法,也有特殊条件下方可使用的手段.通过对比明确这些方法,可以加深我们对Linux内核的认识,更重要的是,可以让我们更熟练驾御linux内核级的应用开发技术. 内核空间(kernel-space) VS 用户空间(user-space) 作为一个Linu

Linux架构简介:内核空间,用户空间和虚拟文件系统

首先有两个概念,内核空间和用户空间: 内核空间是指当kernel 执行时会占据一段系统的内存空间,这段空间就是内核空间,用户是无法和内核空间直接交互的.操作系统最主要的核心就是在这段空间里面运行. 内核空间的地址分配可以在 /proc/iomem文件中看到: 用户空间是指当用户执行程序时所占用的内存部分,这些用户程序无法直接使用内核空间的资源,必须通过虚拟文件系统才可以使用内核的资源. 所以,虚拟文件系统就是用来让用户和内核交互用的,它分为以下部分: 设备文件目录 /dev 程序信息与系统设置目

Linux用户空间与内核空间数据传递

转载 - Linux用户空间与内核空间数据传递 作者 digoal 日期 2016-11-20 标签 Linux , 用户空间 , 内核空间 , 用户态 , 内核态 , 进程上下文 , 中断上下文 背景 原文 http://wdqfirst.blog.163.com/blog/static/113347411201182222252954/ 原文 Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据

《Oracle高性能自动化运维》一一1.4 Linux内存体系与Oracle内存空间

1.4 Linux内存体系与Oracle内存空间1.4.1 Linux用户空间与内核空间 一般来说,Linux操作系统把虚拟地址空间划分为用户空间和内核空间.例如x86架构下的32位Linux虚拟地址空间是4GB(0x0000 0000-0xffff ffff),其中大致将前3GB(0x0000 0000-0xbfff ffff)划分为用户空间,后1GB(0xc000 0000-0xffff ffff)划分为内核空间. 用户程序只能在用户模式(用户空间)下执行,而不能访问特权模式(内核空间)的数