侵权投诉

以32位系统为例介绍内核空间和用户空间

嵌入式ARM 2020-11-12 17:41 次阅读

本文以32位系统为例介绍内核空间(kernelspace)和用户空间(userspace)。

内核空间和用户空间

对32位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为4G(2的32次方)。也就是说一个进程的最大地址空间为4G。

操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。

具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。针对Linux操作系统而言,最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)由内核使用,称为内核空间。而较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)由各个进程使用,称为用户空间。

对上面这段内容我们可以这样理解:「每个进程的4G地址空间中,最高1G都是一样的,即内核空间。只有剩余的3G才归进程自己使用。」

「换句话说就是,最高1G的内核空间是被所有进程共享的!」下图描述了每个进程4G地址空间的分配情况(此图来自互联网):

为什么需要区分内核空间与用户空间

CPU的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。

所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。

比如Intel的CPU将特权等级分为4个级别:Ring0~Ring3。其实Linux系统只使用了Ring0和Ring3两个运行级别(Windows系统也是一样的)。

当进程运行在Ring3级别时被称为运行在用户态,而运行在Ring0级别时被称为运行在内核态。

内核态与用户态

好了我们现在需要再解释一下什么是内核态、用户态:「当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。」

在内核态下,进程运行在内核地址空间中,此时CPU可以执行任何指令。运行的代码也不受任何的限制,可以自由地访问任何有效地址,也可以直接进行端口的访问。

对于以前的DOS操作系统来说,是没有内核空间、用户空间以及内核态、用户态这些概念的。可以认为所有的代码都是运行在内核态的,因而用户编写的应用程序代码可以很容易的让操作系统崩溃掉。

对于Linux来说,通过区分内核空间和用户空间的设计,隔离了操作系统代码(操作系统的代码要比应用程序的代码健壮很多)与应用程序代码。

即便是单个应用程序出现错误也不会影响到操作系统的稳定性,这样其它的程序还可以正常的运行(Linux可是个多任务系统啊!)。

「所以,区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性。」

如何从用户空间进入内核空间

其实所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。

我们的应用程序是无法直接进行这样的操作的。但是我们可以通过内核提供的接口来完成这样的任务。

比如应用程序要读取磁盘上的一个文件,它可以向内核发起一个"系统调用"告诉内核:"我要读取磁盘上的某某文件"。

其实就是通过一个特殊的指令让进程从用户态进入到内核态(到了内核空间),在内核空间中,CPU可以执行任何的指令,当然也包括从磁盘上读取数据。具体过程是先把数据读取到内核空间中,然后再把数据拷贝到用户空间并从内核态切换到用户态。

此时应用程序已经从系统调用中返回并且拿到了想要的数据,可以开开心心的往下执行了。简单说就是应用程序把高科技的事情(从磁盘读取文件)外包给了系统内核,系统内核做这些事情既专业又高效。

对于一个进程来讲,从用户空间进入内核空间并最终返回到用户空间,这个过程是十分复杂的。举个例子,比如我们经常接触的概念"堆栈",其实进程在内核态和用户态各有一个堆栈。

运行在用户空间时进程使用的是用户空间中的堆栈,而运行在内核空间时,进程使用的是内核空间中的堆栈。所以说,Linux中每个进程有两个栈,分别用于用户态和内核态。

下图简明的描述了用户态与内核态之间的转换:

既然用户态的进程必须切换成内核态才能使用系统的资源,那么我们接下来就看看进程一共有多少种方式可以从用户态进入到内核态。

概括的说,有三种方式:系统调用、软中断和硬件中断。这三种方式每一种都涉及到大量的操作系统知识,所以这里不做展开。

整体结构

接下来我们从内核空间和用户空间的角度看一看整个Linux系统的结构。它大体可以分为三个部分,从下往上依次为:硬件->内核空间->用户空间。如下图所示(此图来自互联网):

在硬件之上,内核空间中的代码控制了硬件资源的使用权,用户空间中的代码只有通过内核暴露的系统调用接口(SystemCallInterface)才能使用到系统中的硬件资源。其实,不光是Linux,Windows操作系统的设计也是大同小异。

实际上我们可以将每个处理器在任何指定时间点上的活动概括为下列三者之一:

运行于用户空间,执行用户进程。

运行于内核空间,处于进程上下文,代表某个特定的进程执行。

运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。

以上三点几乎包括所有的情况,比如当CPU空闲时,内核就运行一个空进程,处于进程上下文,但运行在内核空间。

说明:Linux系统的中断服务程序不在进程的上下文中执行,它们在一个与所有进程都无关的、专门的中断上下文中执行。

之所以存在一个专门的执行环境,就是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速地退出。

总结

现代的操作系统大都通过内核空间和用户空间的设计来保护操作系统自身的安全性和稳定性。所以在我们阅读有关操作系统的资料时经常遇到内核空间、用户空间和内核态、用户态等概念,希望本文能够帮助您理解这些基本的概念。

责任编辑:xj

原文标题:Linux系统中,为什么需要区分内核空间与用户空间?

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

原文标题:Linux系统中,为什么需要区分内核空间与用户空间?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

基于ARM9芯片的S3C2440和Linux操作系统设计SPI驱动程序

作者:北京工业大学 集成电路与系统基础实验室 李琦;贺明;董利民;董健 在嵌入式开发过程中,许多系统....
发表于 03-02 16:20 80次 阅读
基于ARM9芯片的S3C2440和Linux操作系统设计SPI驱动程序

Linux之父:Intel安腾处理器已经死透了

还有人记得Intel的安腾处理器(Itanium)吗?   日前,Linux之父Linus Torv....
的头像 算法与数据结构 发表于 03-02 14:08 139次 阅读
Linux之父:Intel安腾处理器已经死透了

【精华】嵌入式原理及应用系列免费视频教程(定期更新中)---通信篇---UART部分

如题
发表于 03-02 13:56 28次 阅读
【精华】嵌入式原理及应用系列免费视频教程(定期更新中)---通信篇---UART部分

如何在Petalinux创建Linux内核模块?

创建内核模块 Petalinux可以帮助工程师简化内核模块的创建工作。在petalinux工程目录下....
的头像 FPGA开发圈 发表于 03-02 11:10 94次 阅读
如何在Petalinux创建Linux内核模块?

嵌入式ARM多核处理器的结构

嵌入式多核处理器结构 OpenMP并行化优化
发表于 03-02 06:59 0次 阅读
嵌入式ARM多核处理器的结构

嵌入式系统制造商面临的IP安全性的挑战是什么

嵌入式系统制造商面临的IP安全性的挑战 防止发生未经授权的固件访问 隐藏模拟与数字资源及其互联方式 ...
发表于 03-02 06:49 0次 阅读
嵌入式系统制造商面临的IP安全性的挑战是什么

香橙派路由器开发板R1 Plus连接两款USB无线网卡测试说明

1. RTL8723BU 测试1) 首先将 RTL8723BU 无线网卡模块插入开发板的 USB 接口中2) 然后 linux 系统会自动加载 RT...
发表于 03-01 20:45 100次 阅读
香橙派路由器开发板R1 Plus连接两款USB无线网卡测试说明

Linux内核中ARM中断的实现资料详解

看了一些网络上关于lnux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也....
发表于 03-01 16:51 13次 阅读
Linux内核中ARM中断的实现资料详解

三家美国企业垄断全球超过98%操作系统市场

据IDC公布的一份数据显示,2020年在全球操作系统领域,微软Windows、苹果Mac OS、谷歌....
的头像 我快闭嘴 发表于 03-01 15:32 197次 阅读
三家美国企业垄断全球超过98%操作系统市场

苹果Mac的开源Linux驱动正向主线内核努力

四年多来,苹果的MacBook Pro一直将Touch Bar作为这些笔记本键盘上方的显示/控制栏输....
的头像 如意 发表于 03-01 14:44 62次 阅读
苹果Mac的开源Linux驱动正向主线内核努力

【北京迅为iMX6ULL】嵌入式学习之Linux系统编程视频教程

1. 什么是Linux系统编程?Linux系统编程也叫Linux下的高级编程,是介于应用层和驱动层之间的。 2. 学习了哪些知识后可以学...
发表于 03-01 14:29 0次 阅读
【北京迅为iMX6ULL】嵌入式学习之Linux系统编程视频教程

【精选】嵌入式软件工程师笔试题合集

收集这个合集,帮助大家在找工作的路上能够更加顺畅一些。 ...
发表于 03-01 14:15 121次 阅读
【精选】嵌入式软件工程师笔试题合集

Intel核显能开启NVIDIA CUDA加速

NVIDIA CUDA鼎鼎大名,不过,从一开始,该技术就为N卡独享。
的头像 lhl545545 发表于 03-01 09:43 206次 阅读
Intel核显能开启NVIDIA CUDA加速

unc0ver 6.0.0版本或将支持iOS 14.3全设备越狱

今日,unc0ver 6.0.0版本发布,添加了对iOS 12.4.9~12.5.1、iOS 13.....
的头像 lhl545545 发表于 03-01 09:30 434次 阅读
unc0ver 6.0.0版本或将支持iOS 14.3全设备越狱

Linux内核进程调度schedule深入理解的详细资料说明

本文以 linux-2.4.10为例主要分析 Linux进程调度模块中的 schedule函数及其相....
发表于 02-26 16:17 13次 阅读
Linux内核进程调度schedule深入理解的详细资料说明

Ubuntu中Git使用教程

Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统....
发表于 02-26 15:01 11次 阅读
Ubuntu中Git使用教程

Linux中的declare/typeset命令功能简介

1.功能简介 declare(别名 typeset)属 Shell 内建命令,用于申明 Shell ....
的头像 Linux爱好者 发表于 02-26 14:18 111次 阅读
Linux中的declare/typeset命令功能简介

Linux中cut命令的格式和选项说明

1.命令简介 cut 是一个选取命令,以行为单位,选择性输出符合条件的内容到标准输出。 cut 命令....
的头像 Linux爱好者 发表于 02-26 14:13 96次 阅读
Linux中cut命令的格式和选项说明

Linu中col命令的介绍和示例

1.命令简介 col(control)命令是一个标准输入文本过滤器,它从标准输入读取内容,过滤掉控制....
的头像 Linux爱好者 发表于 02-26 14:08 136次 阅读
Linu中col命令的介绍和示例

Linux驱动中的platform总线详解

platform总线是学习linux驱动必须要掌握的一个知识点。 一、概念 嵌入式系统中有很多的物理....
的头像 Linux爱好者 发表于 02-26 14:02 246次 阅读
Linux驱动中的platform总线详解

Linux的内核定制方法详细说明

本文档的主要内容详细介绍的是Linux的内核定制方法详细说明
发表于 02-26 11:14 10次 阅读
Linux的内核定制方法详细说明

Linux的内核定制方法详细说明

本文档的主要内容详细介绍的是Linux的内核定制方法详细说明
发表于 02-26 11:14 12次 阅读
Linux的内核定制方法详细说明

如何从零基础学习嵌入式开发?

如何从零基础学习开发,我在这里给大家一个切实可行的道路,而且相对容易入手,学习中会不断有收获。 ...
发表于 02-26 07:56 0次 阅读
如何从零基础学习嵌入式开发?

做嵌入式硬件设计需要关注的点

嵌入式设计是个庞大的工程,今天就说说硬件电路设计方面的几个注意事项,首先,咱们了解下嵌入式的硬件构架。    &nb...
发表于 02-26 07:40 0次 阅读
做嵌入式硬件设计需要关注的点

嵌入式编程为何如此复杂?

嵌入式编程的复杂性分析
发表于 02-26 06:50 0次 阅读
嵌入式编程为何如此复杂?

做嵌入式开发,这2个设计思想要掌握!

笔者参考了市面上各种各样的嵌入式书籍,如MCS-51、AVR、ARM等都有看过,但没发现有哪本是介绍....
发表于 02-26 06:01 73次 阅读
做嵌入式开发,这2个设计思想要掌握!

FPGA的基本结构详细说明

FPGA 由6 部分组成, 分别为可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM 、丰富的....
发表于 02-25 17:55 97次 阅读
FPGA的基本结构详细说明

单片机免费系列教程-连载持续更新中...(原理图设计、PCB布板、焊接调试、软件编程、波形分析,全部囊括)

大家好! 该系列视频为单片机免费教程,特邀黄忠老师为大家讲解。持续关注,我们会继续更新! 大家有关于单片机以及工作中遇...
发表于 02-25 16:45 774次 阅读
单片机免费系列教程-连载持续更新中...(原理图设计、PCB布板、焊接调试、软件编程、波形分析,全部囊括)

基于嵌入式操作系统的机器人驱动控制模型算法设计

硬件依托于ART-PI开发平台,主控芯片采用STM32H750高性能单片机,同时采用TB6612芯片....
发表于 02-25 16:44 1327次 阅读
基于嵌入式操作系统的机器人驱动控制模型算法设计

【电子发烧友】2021中国嵌入式产业发展现状及趋势分析

【电子发烧友】2021中国嵌入式产业发展现状及趋势分析报告   扫描以下二维码可申请加....
发表于 02-25 14:00 26次 阅读
【电子发烧友】2021中国嵌入式产业发展现状及趋势分析

Android内核开发实践的详细资料说明

Android作为 Google公司推出的一款手机开发平台,其本身是基于 linux内核的。 Goo....
发表于 02-25 11:52 34次 阅读
Android内核开发实践的详细资料说明

如何在Linux下实现H.264解码器的优化

H.264是 ITU-T VCGE和 ISO MPEG联合开发的最新视频标准。它虽然具有很多优良性能....
发表于 02-25 11:06 20次 阅读
如何在Linux下实现H.264解码器的优化

浅析RISC-V目前存在的缺陷

在硬件设计方面,人们经常吹捧的一种设计是 RISC-V,它的 ISA 是开放的,不需要授权费。许多组....
的头像 我快闭嘴 发表于 02-25 11:01 339次 阅读
浅析RISC-V目前存在的缺陷

嵌入式机器学习和AI前沿资讯简报

1. STM32 嵌入式机器学习(TinyML)实战教程-01 |  边缘智能实验室 第1部分:总体....
的头像 RTThread物联网操作系统 发表于 02-24 18:28 1589次 阅读
嵌入式机器学习和AI前沿资讯简报

一文汇总Linux常规的硬件基础命令

cat /proc/cpuinfo # 查看 CPU 核心数,架构,名字,频率,缓存,指令集等命令
的头像 陈翠 发表于 02-24 11:16 156次 阅读
一文汇总Linux常规的硬件基础命令

大华智慧物联网安全管理解决方案的性能特点及应用

随着物联网、大数据、云计算等技术的不断发展,人们的生活已进入数字经济时代,作为视频数据感知的智能摄像....
发表于 02-24 11:11 617次 阅读
大华智慧物联网安全管理解决方案的性能特点及应用

使用LabVIEW的鼠标坐标反馈

当事件发生时,鼠标的位置坐标是很重要的信息,有时我们也需要提取鼠标坐标的历史轨迹来作为分析问题的工具....
发表于 02-24 08:00 25次 阅读
使用LabVIEW的鼠标坐标反馈

火星首个开源Linux系统以及飞行软件框架F Prime

从保护罩中被释放后,“毅力号”火星车将被吊车悬挂,通过尼龙绳和负责信号、控制指令传输的电缆,连接“吊....
的头像 传感器技术 发表于 02-23 15:51 225次 阅读
火星首个开源Linux系统以及飞行软件框架F Prime

Linux系统中split命令的常用示例

1.命令简介 split 命令用于将一个大文件分割成较小的文件,默认每 1000 行分割成一个小文件....
的头像 Linux爱好者 发表于 02-23 11:36 152次 阅读
Linux系统中split命令的常用示例

Linux 5.12将修复系统意外关机的问题

Linux 5.11 上个星期才发布稳定版,Linux 5.12 目前仍在开发过程中。在 Linux....
的头像 Linux爱好者 发表于 02-23 11:35 222次 阅读
Linux 5.12将修复系统意外关机的问题

Linux中的fdisk命令简介

1.命令简介 fdisk 命令用于创建和维护磁盘分区表。它采用传统的问答式界面,而不是类似于 fdi....
的头像 Linux爱好者 发表于 02-23 11:24 156次 阅读
Linux中的fdisk命令简介

美国“毅力号”给火星送去Linux系统以及手机芯片?

“确认着陆!毅力号安全到达火星表面。”   就在今天凌晨4点55分,美国“毅力号”不经变轨,直接冲入....
的头像 Linux爱好者 发表于 02-23 11:16 250次 阅读
美国“毅力号”给火星送去Linux系统以及手机芯片?

Linux中iconv命令的简介和使用方法

1.命令简介 iconv命令是用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030....
的头像 Linux爱好者 发表于 02-23 11:14 250次 阅读
Linux中iconv命令的简介和使用方法

Linux中的vim命令说明

1.简介 vim 是 Linux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iM....
的头像 Linux爱好者 发表于 02-23 11:06 177次 阅读
Linux中的vim命令说明

ETCD集群的工作原理和高可用技术细节介绍

【导读】新年快乐!本文介绍了etcd集群的工作原理和高可用技术细节。 etcd 简介 coreos ....
的头像 Linux爱好者 发表于 02-23 10:54 172次 阅读
ETCD集群的工作原理和高可用技术细节介绍

嵌入式工控主板常见的两种类型是怎样的

嵌入式工控主板一般可以认为是嵌入在设备外面做操控、数据处置运用的CPU板,也就是设备的“核心大脑”。....
发表于 02-23 10:42 70次 阅读
嵌入式工控主板常见的两种类型是怎样的

Linux释放内存的方法

一般系统是不会自动释放内存的 关键的配置文件/proc/sys/vm/drop_caches。这个文....
的头像 陈翠 发表于 02-21 10:34 157次 阅读
Linux释放内存的方法

Linux后台启动程序的方式

通常在Linux系统运行某个程序的时候会占用当前终端控制台,当会话控制台结束后程序也随之关闭,那如何....
的头像 陈翠 发表于 02-21 10:32 178次 阅读
Linux后台启动程序的方式

Linux内核内存泄漏怎么办?

什么是内存泄漏: 程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费....
的头像 Linuxer 发表于 02-20 17:14 281次 阅读
Linux内核内存泄漏怎么办?

腾讯云虚拟化开源团队为内核引入全新虚拟文件系统

Linux内存管理概述 我们知道linux系统内核的主要工作之一是管理系统中安装的物理内存,系统中内....
的头像 Linuxer 发表于 02-20 17:12 299次 阅读
腾讯云虚拟化开源团队为内核引入全新虚拟文件系统

谈一谈Linux让实时任务独占CPU的事

本文主要讨论在高实时要求、高效能计算、DPDK等领域,Linux如何让某一个线程排他性独占CPU;独....
的头像 Linuxer 发表于 02-20 17:11 295次 阅读
谈一谈Linux让实时任务独占CPU的事

基于嵌入式操作系统μC/OS-II实现软件显示任务的设计

随着现代生活中蓄电池需求量的日益增加,蓄电池的生产规模也逐渐扩大,同时对蓄电池生产中的控制也提出了更....
的头像 电子设计 发表于 02-20 10:08 685次 阅读
基于嵌入式操作系统μC/OS-II实现软件显示任务的设计

美国毅力号携带Linux系统和骁龙801登陆月球

“确认着陆!毅力号安全到达火星表面。”就在昨天凌晨4点55分,美国“毅力号”不经变轨,直接冲入火星大....
的头像 如意 发表于 02-20 09:56 458次 阅读
美国毅力号携带Linux系统和骁龙801登陆月球

新兴NVM或将迎来市场爆发期

近几十年来,作为闪存的潜在替代品,许多新兴的内存技术被开发出来。闪存的制程难以扩展到 40nm以下。....
的头像 我快闭嘴 发表于 02-19 17:01 383次 阅读
新兴NVM或将迎来市场爆发期

AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)

TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 226次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)