前言

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

下述说明均为 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. MemCached Cache Java Client封装优化历程

    1.什么是memcached?(从官网翻译翻译) 免费和开源.高性能.分布式内存对象缓存系统,通用在自然界,但用于加速动态web应用程序,减轻数据库负载. Memcached是一个内存中的键值存储为小 ...

  2. 解决IE下jquery ajax无法获得最新数据的问题(IE缓存)

    今天修改一个bug,利用ajax查询数据,在谷歌浏览器下可以获取到最新数据,而在IE中获得是旧数据,无法获得最新的数据,经查资料,才发现时IE缓存再作怪. 发现此ajax请求用的get方式,每次请求的 ...

  3. 向linux内核加入系统调用新老内核比較

    2.6内核 1>改动linux-source-2.6.31/kernel/sys.c文件,在文件末尾加入系统响应函数.函数实现例如以下: asmlinkage int sys_mycall(in ...

  4. iOS开发——混编Swift篇&OC移植为swift

    将Ojective-C代码移植转换为Swift代码 2015-03-09 15:07发布:yuhang浏览:201   相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些 ...

  5. stl 容器

    10.1.2.2容器的分类 序列式容器(Sequence containers) 每个元素都有固定位置--取决于插入时机和地点,和元素值无关. vector.deque.list  关联式容器(Ass ...

  6. [转]UINavigationController 返回的方法汇总

    [html] view plaincopy [self.navigationController popViewControllerAnimated:YES]; UINavigationControl ...

  7. Step-by-Step XML Free Spring MVC 3 Configuration--reference

    The release of Spring 2.5 reduce the burden of XML by introduction annotation based configuration, b ...

  8. Eclipse开发JQuery环境设置(Spket)

     http://www.cnblogs.com/sayo/archive/2008/10/20/1315528.html   首先需要安装Spket.可以参阅我的这篇文章进行Spket的安装. 之后进 ...

  9. 关于 error: LNK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案【Qt】【 VS2010】

    近日因为换装硬盘重装了系统,于是不得不重新安装VS2010 Qt 这些个开发工具.安装过程都没什么问题,安装完了顺手点了个例子测试下好没好用,于是就出现了标题中的错误提示.之前处理过一次,时间久了就忘 ...

  10. ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层

    今年7月刚刚发布的ArcGIS 10.2为GIS的web开发带来了一个很实在的功能,JSON转要素.以往GIS图层外部数据(如文本数据,数据库数据)动态地写入地图服务中的图层是一件不可想象的事情,如今 ...