0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:sparkdev 2020-11-12 17:41 次阅读

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

内核空间和用户空间

对 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 可以执行任何指令。运行的代码也不受任何的限制,可以自由地访问任何有效地址,也可以直接进行端口的访问。

在用户态下,进程运行在用户地址空间中,被执行的代码要受到 CPU 的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中 I/O 许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

整体结构

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

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

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

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

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

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

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

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

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

总结

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

责任编辑:xj

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303210
  • 内核
    +关注

    关注

    3

    文章

    1362

    浏览量

    40226
  • Linux
    +关注

    关注

    87

    文章

    11225

    浏览量

    208909

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

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

收藏 人收藏

    评论

    相关推荐

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-应用编程示例控制LED灯之sysfs文件系统

    文件系统概念sysfs是Linux2.6以上的内核在发展迭代过程中衍生出来的一个功能,它的作用是通过一个内存文件系统将信息导出到用户进程空间
    发表于 10-21 09:52

    飞凌嵌入式ElfBoard ELF 1板卡-应用编程示例控制LED灯之sysfs文件系统

    用户空间文件目录结构的形式用户空间提供对这些数据、属性的访问支持。下表描述了
    发表于 10-18 09:31

    电压空间矢量与磁链矢量的关系是什么

    电压空间矢量与磁链矢量的关系在电机控制和变频调速系统中具有重要地位。以下是对这两者关系的介绍: 一、基本概念 电压空间矢量 : 又名“空间
    的头像 发表于 10-12 15:12 459次阅读

    详解linux内核的uevent机制

    在linux内核中,uevent机制是一种内核用户空间通信的机制,用于通知用户空间应用程序各种
    的头像 发表于 09-29 17:01 467次阅读

    linux驱动程序运行在什么空间

    空间拥有对硬件的直接访问权限,而用户空间则受到限制,保护系统的稳定性和安全性。 1. Linux 内核
    的头像 发表于 08-30 14:37 302次阅读

    高质量激光光束光学系统中的空间滤波

    和精度至关重要。 VirtualLab Fusion独特的模拟技术使用户能够对滤波进行详细建模,从而评估对光学系统性能和特性的影响。 用于光束切趾的圆形锯齿光阑 光束切趾在高能激光器和光束传输系统
    发表于 08-14 11:54

    操作系统的内存布局介绍

    32操作系统的内存布局很经典,很多书籍都是以32系统例子去讲解的。32
    的头像 发表于 08-07 15:47 228次阅读
    操作<b class='flag-5'>系统</b>的内存布局<b class='flag-5'>介绍</b>

    达实智能AIoT空间场景控制系统概述

    面对当前建筑空间智能化实施运营中存在的子系统不互通、控制延时、运维成本高、面板复杂不统一等问题,达实通过分割整体建筑单元空间,集成空间环境
    的头像 发表于 07-30 11:27 782次阅读

    地下人防空间环境检测仪介绍

    地下人防空间环境检测仪介绍
    的头像 发表于 07-01 11:05 212次阅读
    地下人防<b class='flag-5'>空间</b>环境检测仪<b class='flag-5'>介绍</b>

    PCIE的BAR空间介绍

    PCIE是一种高速串行总线接口标准,用于连接计算机内部的各种外设和组件。在PCIe架构中,BAR(Base Address Register)空间是用于映射I/O端口或内存地址空间的一组寄存器。
    的头像 发表于 04-22 11:00 4037次阅读

    gis中常用的空间分析方法

    GIS中常用的空间分析方法 GIS(地理信息系统)是一种用于收集、存储、处理、分析和展示地理数据的技术。空间分析是GIS的核心部分,它包括一系列方法和技术,用来研究地理空间数据之间的关
    的头像 发表于 02-25 13:44 5044次阅读

    达实空间场景控制系统的常见问题解答

    达实空间场景控制系统自面世以来,凭借其创新的“空间场景”概念,吸引了业界和用户的广泛关注。
    的头像 发表于 01-10 10:44 630次阅读

    u盘空间变小怎么恢复空间

    的问题。本文将详细探讨U盘空间缩小的原因以及如何恢复U盘空间帮助用户解决这一问题。 一、U盘空间缩小的原因: 1.遭受病毒或恶意软件攻击
    的头像 发表于 12-11 15:31 1438次阅读

    如何在Ubuntu Linux上释放/boot分区中的空间

    在Ubuntu Linux上,/boot分区是用于存储启动相关的文件的。随着时间的推移,这个分区可能会变满,导致系统无法安装新的内核和更新。本文将介绍如何释放/boot分区中的空间,并
    的头像 发表于 11-28 10:04 849次阅读

    MMU虚拟地址空间布局

    当然虚拟地址空间划分不只是如此。因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64虚拟地址,实际支持情况如下。 (1)-虚拟地址宽 虚拟地址的最大宽度是48
    的头像 发表于 11-26 16:35 845次阅读