人间还是仙界?聊一聊linux系统的用户空间和内核空间

2023-05-16

我们生活在人间,但《西游记》里提到,在天上还有一个仙界。

人间不知道仙界的存在;而仙界知道人间的存在,神仙也可以从仙界下凡到人间,但是被严格管控的。

软件设计的灵感其实都来自于生活:用户空间就等同于我们理解的人间;而内核空间就等同于所谓的仙界。

人间在地上,仙界在天上,地理上是隔离的。

linux内核里的用户空间和内核空间也是一样。


以32位linux系统为例:

人间还是仙界?聊一聊linux系统的用户空间和内核空间

32位linux系统的地址空间分布

用户空间地址范围:0x00000000~0xBFFFFFFF,大小3G

内核空间地址范围:0xC0000000~0xFFFFFFFF,大小1G

有小伙伴问了,你这个地址是啥地址啊,是逻辑地址、虚拟地址、线性地址、还是物理地址咩?

当然是虚拟地址了。

  • 在intel x86下,逻辑地址,是由一个段标识符加上一个指定段内的相对地址的偏移量(offset)组成,表示为 [段标识符:段内偏移量],例如:[cs:eip]
  • 虚拟地址其实就是上述组成逻辑地址的段内偏移offset
  • 而线性地址,则是由逻辑地址经过一系列转换得到的,具体来讲就是: 线性地址=段描述符所在段的基地址+offset
  • 而物理地址,则是真正的物理内存的地址。

那么问题来了,linux内核为什么要特意划分内核空间和用户空间呢?有以下几方面的原因:

1.安全考量

整个系统中有各种资源,比如计算资源、内存资源和外设资源。而linux是多用户、多进程系统。所以,这些资源必须在受限的、被管理的状态下使用,要不然就陷入了混乱。官方介绍空间隔离可以保证即便是单个应用程序出现错误也不会影响到操作系统的稳定性。

2.处理器模式不同,权限不同

前面说到内核空间代码要管理各种底层的资源,而用户空间代码更多是实现业务逻辑的。所以内核空间和用户空间代码运行时的处理器模式是不同的。

对于x86体系的cpu, 用户空间代码运行在Ring3模式(用户模式),内核空间代码运行Ring 0模式(特权模式);

对于arm体系的cpu,用户空间代码运行在usr模式(用户模式),内核空间代码运行在svc模式(特权模式);

用户模式只能正常执行程序,而特权模式才能访问外设、处理中断等。

3.核心代码和业务代码的解耦

我们在设计应用系统的时候会考虑耦合性,内核集中了这么多人的智慧,难道它们不会考虑到这一点吗?

内核代码偏重于系统和资源管理;而用户空间代码(也即应用程序)偏重于业务逻辑代码的实现。

两者分工不同,隔离也是解耦。


现在的linux系统基本都是64位的。所以,我们再稍微介绍下64位系统的内核空间和用户空间的地址分布:

人间还是仙界?聊一聊linux系统的用户空间和内核空间

摘自:《linux高性能服务器编程》

64位系统的地址线有64位,但是在具体实现上,并没有使用这么多,一般来说,48位的地址线就够了。所以在这样的系统中,比如armv8-A,高64TB是内核空间,低64TB是用户空间,发现规律了没有?内核空间的的高16位都是1,用户空间的低16位都是0,这样可以方便的对用户空间和内核空间进行有效性检测,防止越界。


总结一下下:

32位linux系统的整个虚拟地址空间最大为4G,这4G的虚拟地址空间,高1G(也就是0xC0000000~0xFFFFFFFF)属于内核空间;低3G(也就是0x00000000~0xBFFFFFFF)属于用户空间,linux系统中的所有进程共用这3G的虚拟地址空间。

你说了什么?

共用?如何共用?

所有的进程共用这3G的虚拟地址空间该如何理解呢?

预知后事如何,请看下回分解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人间还是仙界?聊一聊linux系统的用户空间和内核空间 的相关文章

  • Access中神秘的Criteria(上)

    看到这个标题 xff0c 很多读者可能会迷惑 xff0c 什么是Criteria xff1f 我用了这么久Access xff0c 怎么从来没听说国 我猜想很多读者都是怀着好奇的心情点击的这个主题 但是也许你不知道 xff0c Access
  • Access多条件格式研究笔记(上)

    之前见过论坛好几个帖子讨论过超过三个的条件格式 xff0c 当时因为没有用过条件格式 xff08 通常遇到类似需求我就直接用VBA写代码了 xff09 xff0c 所以也无法加入讨论 xff0c 但是开始留意条件这个这个功能 适逢周末有点空
  • Access 窗体控件事件集线器(EventsHub)V 1.1

    模块名称 xff1a EventsHub 模块版本 xff1a V 1 1 模块介绍 xff1a 很多时候我们在窗体中会有很多类似的控件 xff08 比方说40多个TextBox xff09 xff0c 对于这些类似的控件我们需要编制类似的
  • 窗体类中慎用Option Explicit

    今天遇到一个怪病 xff0c 困扰了我几个小时 xff0c 我有一段程序读取窗体上的切换按钮状态 xff0c 在一个新文件中运行得很好 xff0c 但是同样一个按钮 xff0c 同样代码 xff0c 贴到另外一个窗体 xff0c 却怎么也无
  • 窗体控件绑定数据库字段后的Value类型

    下面三张图展示了各种数据类型的字段绑定到窗体控件后的控件值类型 需要注意的是 xff0c 窗体类中是否使用Option Explicit xff0c 对于空值类型影响很大 xff0c 具体请看本人的另一篇文章 窗体类中慎用Option Ex
  • Dim 的陷阱

    代码一 xff1a Dim x 100 y 100 As Byte Call ReadBytes x Public Sub ReadBytes ByRef z As Byte 39 Do Nothing End Sub 对以上代码进行编译
  • 谨慎使用单精度/双精度数值类型

    前言 在近日几个帖子里面 xff0c 和QQ群的讨论里面 xff0c 我发现很多网友都遇到的问题都是因为不恰当地使用了单精度 双精度数值 因此想专门就这个话题谈一下 单精度和双精度数值类型最早出现在C语言中 xff08 比较通用的语言里面
  • Java的内存结构(Memory Structure)和垃圾收集(Garbage Collection)图解

    JVM 内存包含如下几个部分 xff1a Heap Memory 存放Java对象 Non Heap Memory 存放类加载信息和其它meta dataOther 存放JVM 自身代码等 在JVM启动时 xff0c 就已经保留了固定的内存
  • MD5加密的VB类模块源码

    在窗体中调用时如下 set c1 61 new class 39 class 为你存的类模快名 text1 text 61 md5 string calc sourcestring 类模块源码如下 Option Explicit 39 Vi
  • 四种整数数据类型的性能对比

    在我们写VBA程序的时候 xff0c 我们经常要面对数据类型定义的选择 xff0c 有的情况下 xff0c 业务本身对于数据类型有要求和限制 xff0c 那么我们并不难以选择 xff0c 有些时候却没有限制 xff0c 我们可以任意选用四种
  • VBA/VB获取硬盘序列号

    Private Declare Function GetVolumeInformation Lib 34 kernel32 dll 34 Alias 34 GetVolumeInformationA 34 ByVal lpRootPathN
  • .NET 4 on Windows7 / Mono 2.10.8.1 on Ubuntu 12.04 差异记录

    环境A xff1a NET 4 on Windows 7 环境B xff1a Mono 2 10 8 1 on Ubuntu 12 04 1 Socket Receive byte 当远程连接被断开时 xff1a A xff1a 立即返回0
  • 计算机视觉学习知识框架体系总结整理

    计算机视觉的三个基本任务 xff1a 1 xff09 对象检测 object detection 2 xff09 对象跟踪 object tracking 3 xff09 对象分割 object segmentation 一 xff1a F
  • VS Code 配置Java环境问题解决方式

    1 问题 1 1 改变插件的储存位置 1 2 Java环境变量配置 1 3 VS Code Java 工作区建立 1 4 code runner 运行输出为乱码 2 解决方法 2 1 储存位置更改 xff08 1 xff09 改变vs桌面快
  • YOLOv4-pytorch训练自己的数据集

    YOLOv4 pytorch训练自己的数据集 YOLOv4 pytorch介绍环境配置运行环境安装依赖包 准备工作Git clone YOLOv4准备数据集下载PascalVOC MSCOCO 2017数据集准备自己的数据集 下载权重文件
  • 【DEBUG日记】cannot import name ‘amp‘

    问题描述 xff1a 在使用WongKinYiu PyTorch YOLOv4进行训练时 xff0c 报错 xff1a Traceback span class token punctuation span most recent call
  • 【DUBUG日记】subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1.

    项目场景 xff1a 这是在编译FCOS 主要是其中基于maskrcnn benchmark部分 时报的错误 问题描述 xff1a 在执行 python setup py build develop no deps 时 xff0c 会Run
  • YOLOv5部署到Windows的C++(使用LibTorch)

    YOLOv5部署到Windows的C 43 43 xff08 使用LibTorch xff09 前言准备内容配置环境编译YOLOv5 检测可能遇到的问题 前言 由于项目需要 xff0c 我们要将YOLOv5部署到Windows上的C 43
  • 如何在Java中选择Map/List/Set

    很实用 xff0c 分享一下 简单版本 复杂版本 参考 xff1a http initbinder com articles cheat sheet for selecting maplistset in java html http ww
  • 一文搞定 Visual Studio 配置 OpenCV环境

    文章目录 前言准备工作系统环境变量配置VS项目环境配置检验补充 前言 在 Visual Studio 上配置 OpenCV 环境是极其恼人的事情 xff0c 尤其是对于初学者 xff0c 经常几个小时过去了都配不好 xff0c 将我们对代码

随机推荐

  • PyTorch 轻松节省显存的小技巧

    文章目录 前言一 大幅减少显存占用方法1 模型2 数据 二 小幅减少显存占用方法1 使用inplace2 加载 存储等能用CPU就绝不用GPU3 低精度计算4 torch no grad5 及时清理不用的变量6 分段计算 总结 前言 如今的
  • 【OpenCV经验总结】——视频篇

    文章目录 前言一 视频读写二 视频参数的获取和设置 前言 本篇汇总了本人在OpenCV使用过程中总结的关于视频处理的一些函数使用经验及Bug处理经验 xff0c 会根据后续使用情况逐步更新 一 视频读写 span class token k
  • 【OpenCV经验总结】——图片预处理篇

    文章目录 前言一 图片读写二 调整大小和填充三 滤波四 边缘提取五 腐蚀和膨胀 xff0c 开闭运算 前言 本篇汇总了本人在OpenCV使用过程中总结的关于图片的一些函数使用经验及Bug处理经验 xff0c 会根据后续使用情况逐步更新 一
  • 【DEBUG日记】torch.unique() 报错

    问题描述 在模型输出数据的后处理中 xff0c 在使用torch unique 时报以下错误 xff1a RuntimeError isDifferentiableType variable scalar type INTERNAL ASS
  • 如何在go中执行python3代码

    go python3使用指南与踩坑记录 简介 在开发工作中有时候会有需要和其他语言进行交互的需求 xff0c 笔者前段时间就接到了需要在go中调用python3的需求 xff0c 这种需求笔者想到了两种解法 xff0c 一是直接在代码中调用
  • ios开发-语音识别(科大讯飞)

    在记录事件的时候 xff0c 用户在不方便手写的时候 xff0c 我们可以利用语音录入 xff0c 转成文字的形式记录时间 xff0c 是不是既方便又只能 xff0c 现在做语音识别的有一些不错的开放平台供我们使用 xff0c 科大讯飞平台
  • 用 estimatedRowHeight 对UITableViewCell自动布局的问题?

    iOS8 中通过 UITableViewAutomaticDimension 常量支持自适应高度的单元格 self tableView estimatedRowHeight 61 100 self tableView rowHeight 6
  • Rust VS JS,Rust 已开始渗入前端~

    本文翻译自 xff1a Rust Is The Future of JavaScript Infrastructure Lee Robinson 1 xff0c 已获得作者授权 xff0c 原文略做修改以符合中文语境 xff08 图片镇楼
  • 查看cookie的3种方式

    1 application中查看 2 network中查看 3 console中通过js查看 4 设置cookie document cookie 61 34 age 61 12 34
  • 关于Hadoop中reducer端combiner的一些思考

    什么是Combiner Functions Many MapReduce jobs are limited by the bandwidth available on the cluster so it pays to minimize t
  • Unity新版ECS框架简介:ECS有什么不同?

    了解过ECS的开发者都知道ECS与Unity原本的开发理念相差很大 xff0c 需要所有Unity开发者重新去学习和适应新的开发框架的代价还是很大的 xff0c Unity为何要做出这么大跨度的尝试呢 xff1f Unity正在尝试解决什么
  • Python 爬取 3 万条游戏评分数据,找到了程序员最爱玩的游戏(附代码)

    本文爬取了游戏网站上所有可见的游戏评分数据进行分析 xff0c 全文包括以下几个部分 xff1a 数据获取数据总览游戏类型分析游戏平台分析游戏名称分析高分游戏汇总代码汇总 全文数据获取及分析均基于python3 6完成 数据获取过程 页面内
  • 手游外挂分类及原理介绍

    一 前言 移动游戏市场近几年突然爆发 xff0c 收入规模快速增长 根据第三方数据统计 xff0c 如图所示 xff0c 国内移动游戏2015年市场规模已达514 6亿 如此火热的市场 xff0c 必然会吸引大量图谋不轨的坏人 外挂已在移动
  • 常见游戏外挂分类及原理概述

    外挂基本概念 要理解外挂 xff0c 首先需要理解网络游戏的数据流 这里所说的数据流定义为游戏本地客户端与游戏后台服务器之间的数据流通 一个数据的产生需要玩家做出对应的操作 xff0c 然后经过网络传输同步到服务器后台 xff0c 服务器后
  • 揭秘《英雄联盟》的游戏数据服务器

    Hey xff0c 大家好 xff01 我是 Bill LtRandolph Clark xff0c 一名英雄联盟的游戏工程师 许多 Rioter 工程师关注大量的内容需要直接发送给玩家问题 这是两个我最近最喜欢的例子之一 xff0c 包括
  • 从纹理中生成法线贴图

    概要 本为主要讲解生成法线贴图的基本方法 xff0c 并在 unity 中进行实现和测试 预备知识 法线贴图和基本的图形学知识 xff0c 基本的向量和极限的知识 高度图或灰度图 一张二维纹理有两个维度 u 和 v xff0c 但其实 xf
  • MySQL死锁产生原因和解决方法

    Mysql 锁类型 一 锁类型介绍 xff1a MySQL有三种锁的级别 xff1a 页级 表级 行级 表级锁 xff1a 开销小 xff0c 加锁快 xff1b 不会出现死锁 xff1b 锁定粒度大 xff0c 发生锁冲突的概率最高 并发
  • Flink 动态实时流计算

    xff08 先给个预告 xff0c 下一期关于Flink的文章会讲如何将机器学习融入Flink中 xff09 摘要 本文提供了一种在流计算中不停机动态加载代码来做到敏捷而快速的开发的思路 代码提供在 Lofka 的 lofka night
  • 通俗说Openvswitch

    Openvswitch xff0c 顾名思义 xff0c Open xff0c 开源的 xff0c v xff0c virtual xff0c 虚拟的 xff0c switch交换机 通俗的讲就是一款开源的软件 xff0c 可以创建虚拟的交
  • 人间还是仙界?聊一聊linux系统的用户空间和内核空间

    我们生活在人间 xff0c 但 西游记 里提到 xff0c 在天上还有一个仙界 人间不知道仙界的存在 xff1b 而仙界知道人间的存在 xff0c 神仙也可以从仙界下凡到人间 xff0c 但是被严格管控的 软件设计的灵感其实都来自于生活 x