前言

实模式,保护模式,分段,分页,虚拟内存,内核态,用户态,如果你对这些术语之间的关系非常熟悉,那就不用继续看了。这篇主要记录我对用户态/内核态的一些理解,如有不对还请指教。

下述说明均为 x86-32 模式。

简述

分段/分页机制实现了逻辑地址到物理地址的转换,为每个程序提供了自己独立的虚拟内存空间,与其他应用程序进行隔离,防止修改其他程序相关数据。开启了分页机制之后,CPU 硬件会对所有代码进行内存映射处理,不管是应用程序还是操作系统,都会使用虚拟内存机制。

对于4G 线性地址空间而言, linux 将最高 1G 空间映射为内存使用的空间,除去高端内存等小范围概念,基本上内核的地址减去 PAGE_OFFSET 偏移就是其实际物理地址。注意这里我没有说 4G 线性地址空间的主体,它的主体是所有的进程,甚至包括内核自身。 每个进程都有自己的 CR3 ,每个进程的 CR3 的地址映射的最高 1G 都是一样的,是通用的内核本身。

刚开始启动的时候内核是作为一个可执行程序启动,但在启动完成后当有系统调用时,内核代码开始执行,此时它所使用的 CR3 还是原进程的 CR3,所以我们会说一个程序在内核态运行。

我们为什么需要用户态/内核态之间的切换?

用户态/内核态 不是原因,只是结果,只看结果是看不出什么的。引入 用户态/内核态 的原因是因为 privilege level, 用户态/内核态的区分只是实现 privilege protection 的一种形式,而这种方式依赖于 分段/分页来实现。

内存隔离与保护 ----------------> 分段/分页
privilege(特权等级) ----------------> 用户态/内核态

假设只有分段/分页,其依赖于 GDT/LDT 与 CR3 寄存器指向的 page structure, 乍一看提供了隔离,但是如果没有 privilege level 的保护,应用程序可以自己修改自己的 CR3 指向的内存映射,这个内存保护也就形同虚设了,更不用提一些危险的指令了。

假设只有privilege level,那也肯定不行,甚至连多程序运行都不可能。

所以说区分内核态/用户态除了提供系统调用功能,更多的是进行 privilege 保护,不同模式下只允许运行对应的 CPU 指令。所有运行在内核态的代码共享一个虚拟内存空间,也就是通过分段/分页机制使得所有进程的 3G~4G 线性地址空间指向同一块区域,也就是内核区域。从这个方面来看,此时操作系统不再是启动时的可执行程序,更像是一个单例的共享库一样给所有进程使用。许多图片上将操作系统画成应用程序下的独立一层应该更符号这个结构。

总结

之所以写这篇文章是在自制操作系统的过程中对内核的虚拟地址配置有所疑问,不理解所有程序共用 3G~4G内存的原因,很多文章一上来就会告诉你这是内核态使用,我相信从 特权等级 的概念引申出去了解内核态和用户态会更为简单。

处理器在 protected mode 下的 protection的更多相关文章

  1. 【初学者常见问题】一脚踏入protected埋下的陷阱

    受保护的(protected)——声明该成员的类的子类可以访问这个类的成员(但有一定的限制),并且,声明该成员的包内部的任何类也可以访问这个成员 protected修饰符参考:http://www.3 ...

  2. ASP.NET Core 数据保护(Data Protection 集群场景)【下】

    前言 接[中篇],在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求,这个时候就需要使用到了一些 Core 提供的高级的功能. 本文还列举了在集群场景下,有时候 ...

  3. Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-下

    2.2  IA-32处理器体系结构 如前所述,IA-32是指始于Intel386直到当前最新的奔腾4的系列的处理器(额...这本书是什么时候写的啊,表示现在应该是I7啊),在IA-32的发展过程中,I ...

  4. ARM 处理器:RISC与CISC 是什么?【转】

    转自:https://blog.csdn.net/willsun2017/article/details/83388990 完全看懂 ARM 处理器:RISC与CISC 是什么? 历史.架构一次看透 ...

  5. Linux下开启关闭SeLinux

    SELinux (Security-Enhanced Linux) in Fedora is an implementation of mandatory access control in the ...

  6. Centos下搭建ftp服务器

    完全不用那么麻烦,直接可以用xshell中自带的传输文件功能,下载客户端xftp安装就行,不用配置,可以在windows系统向Linux系统的任何文件地方上传下载文件,简单方便,大大节约时间, vsf ...

  7. Linux下禁用、启用SeLinux

    一些Linux默认都是启用SeLinux的,在安装操作系统的时候我们可以选择开启或者关闭SeLinux,但是在安装完系统之后又如何开启与关闭呢? 在/etc/sysconf下有一个SeLinux文件, ...

  8. CentOS_5.6下使用cmake编译MySQL_5.5.11

    MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采用这种方式,网上找了一些安装方法有些地方是错的,自己整理一份 所以特地记录一下安装步骤及过程,以供参考!1 mysql 5 ...

  9. CentOS_5.6下使用cmake编译MySQL_5.5.11教程

    注:资料来自网络    Centos 5.6编译安装mysql 5.5.11 2011年06月24日 星期五 05:33 MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采 ...

随机推荐

  1. [AngularJS] Directive with Transcluded Elements

    Create a wrapWith directive using advanced transclusion techniques. transclude - compile the content ...

  2. Android线程和线程池

    Translated From Google Android. class PhotoDecodeRunnable implements Runnable {...    /*     * Defin ...

  3. 解析“extern”

    解析“extern” 1. 声明外部变量 现代编译器一般採用按文件编译的方式,因此在编译时,各个文件里定义的全局变量是 互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部.以下举一个简单的 ...

  4. typedef 优于 #define

    案例一: 通常讲,typedef要比#define要好,特别是在有指针的场合.请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2 ...

  5. shared_ptr的简单实现

    前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针 ...

  6. 【不怕坑】之 Node.js加密 C#解密

    本人也不太了解AES加密解密,为了解决Node.js加密,但是无法C#解密的问题,在网上搜了大量的相关文章. 但是多数是Node.js vs Java 或 Java vs C#的双向加密解密代码,但是 ...

  7. memcache 存储session

    php使用memcache存储session   http://blog.csdn.net/weilee2009/article/details/7658260

  8. ArcMap运行时出现Runtime Error错误的解决方案

    运行ArcMap时弹出错误提示:“Microsoft Visual C++ Runtime Library. Runtime 1.开始->运行->regsvr32 "C:\Pro ...

  9. 视频播放-VideoVIew,Vitamio

    播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的.这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器.VideoView的用法和 Med ...

  10. linux配置LAMP

    VPS注意:最近在VPS安装过程中,MYSQL老是报错 dpkg: error processing package mysql-server-5.6 (--configure): subproces ...