前言

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

下述说明均为 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. 一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!

    前言: 上一篇文章:一个想法:成立草根技术联盟对开发人员进行技术定级解决企业员工招聘难问题! 当时写文的思维,是从一个公益组织的角度的思考. 因此,有不少关于从利出发的反方观点,的确是值的思考! 任何 ...

  2. MySQL_前缀索引_建立

    -- 查看出现频率select count(*) as cnt,cityfrom sakila.city_demo group by city order by cnt desc limit 10; ...

  3. php的引用&(就是在变量或者函数、对象等前面加上&符号)

    官方文档: 1.引用是什么:http://www.php.net/manual/zh/language.references.whatare.php 2.引用做什么:http://www.php.ne ...

  4. java面试笔试谈

    例一: public class Inc { public static void main(String[] args) { Inc inc=new Inc(); int i=5; inc.ferm ...

  5. HTTP,TCP/IP,Socket

    HTTP:超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议. TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,HTTP是应用层协议,主要解决如何包装数据. ...

  6. 《JavaScript学习指南》第2版 学习笔记1

    1.<noscript> 标签 noscript 元素用来定义在脚本未被执行时的替代内容(文本). 注释:如果浏览器支持脚本,那么它不会显示出 noscript 元素中的文本.无法识别 & ...

  7. Linux中的crontab命令用法

    Crontab 在linux中,crontab的用来设置定期执行指定的命令,我们可以用它来指定一些需要重复的事情,Linux系统的用户只需将想要定期要执行的命令序列加到crontab文件中,操作系统即 ...

  8. div容器内文本对齐--神奇的css

    有时候使用一些css往往能达到意想不到的效果 最近需要在页面上显示读取的文本内容,中英文混杂着,我把它们统统抛到div中div设置了宽度,效果是相当糟糕,左对齐,右端长短不一,有的超出长度,有的不够长 ...

  9. 给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析

    LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明.   1.链表的概念      链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链 ...

  10. delphi xe5 android tts(Text To Speech)

    TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话. 以下代码实现xe5 开发的文本转语音的方法 和访问蓝牙一样,这里用javaclass的接口实现 接 ...