linux内核学习之保护模式(一)
来源:http://blog.csdn.net/yishuige/article/details/50434746
这一章涉及intel8086系列cpu的保护模式编程,应该是学习内核编程,驱动编程及嵌入式编程一些基础知识。不过对于没接触过底层编程的我来说,感觉还是好复杂
。
不过里面也有许多以前汇编学过的东西,大部分还是能看懂的
。我觉得图表就能说明大部分内容了,细节东西,不能都做笔记,所以大部分笔记都是图表- -。
1,首先是关于8086cpu的各个标志寄存器,其内容如下:

2,内存管理的寄存器,主要用于实现分段内存管理机制,GDTR是全局段描述符表寄存器,IDTR是中断向量表寄存器,TR是任务寄存器,LDTR是局部描述符表寄存器。
其中,GDTR的内容基本上是不变的,一个系统一般只有一个全局段描述符表。LDTR则是在切换任务时重新加载,每个任务都有自己的局部描述符表。

3,控制寄存器,cr0~cr3,很重要的寄存器,控制cpu操作模式及当前任务的特性等等。具体各个寄存器的用法内容太多,还是看书吧 = =.
CR0:含有控制处理器操作模式和状态的系统控制标志。
CR1:保留不用。。。
CR2:含有导致页错误的线性地址,用于分页机制。
CR3:含有页目录表物理内存地址,也被称为页目录基地址寄存器PDBR。

用于操作以上寄存器的指令列表:

4,内存寻址方面,8086汇编都有讲过了。这里主要是分段管理机制与分页管理机制。
虚拟地址:http://baike.baidu.com/view/1499823.htm

分段机制中,每个段的大小不是固定的,因此使用段时必需通过查找段描述符表来获得段的信息。而分页机制中页的大小刚是固定的,每个页大小为4KB,。
分页存储是实现虚拟内存的关键,没有使用分页的话,要将整个段在主存与磁盘的虚拟内存之间移动,在效率及实现上都是不可接受的,通过分页,每次移4KB的数据是较好的方式。
由于线性地址为4GB,可分为1024*1024个页面,每个记录页表信息的页表项大小为4B,总共需要4MB的内存空间,这在早期物理内存只有可怜的几MB的计算机上是不允许的。所以又采用了二级页表的方式,通过一个4KB的页目录表可寻址到1024个页表,每个页表4KB存放1024个页表项。这样做并没有减少使用的内存总量,反而还多了4KB,之所以这样做是因为可以将二级页表整个移动到虚拟内存空间中,同一时间内只有几个活动的页表,可以节省大量的空间(对那个时候来说,0.12版只能支持最大16MB的主存 = =)。
没有使用分页机制的话,计算出来的线性地址将直接作为物理内存的地址。
分段跟分页都可以有保护机制,分页的保护比分段更底层,分段保证对段的访问有正确的权限及范围,而分页由图可以看出在分段保护通过后还会再进行分页机制的保护,保护内容主要是读写及访问权限。保护有任务之间的保护,保证任务不会访问到其他任务的内存空间,还有特权级的保护,控制系统任务与用户任务之间的访问关系。
5,分段的细节:
内容太多了,还是弄弄图就好了。




段与段之间并不一定是完全分开的,有可能交叉甚至重叠。
访问段,通过选择符定位找到段描述符表中的一个描述符,再通过段描述符访问具体的段。一个描述符表只有2^13=8192个描述符,所以选择符前三个位不用于定位,前两位用于表示特权级,第三位用于表示要访问的段是在全局描述符表中还是局部描述符表中。
局部描述符表也作为一个段,其段描述符保存在全局描述符表中
linux内核学习之保护模式(一)的更多相关文章
- Window内核学习之保护模式基础
段寄存器 段寄存器有6个分别是 cs,ss,ds,es,fs,gs.这些段寄存器包含16位的可见部分和80位的隐藏部分,共90位. 16位的可见部分就是我们知道的cs等段寄存器的值,我们可以在od中查 ...
- 关于Linux内核学习的误区以及相关书籍介绍
http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html 写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实 ...
- Linux内核分析——Linux内核学习总结
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...
- linux内核学习之一:环境搭建--安装Debian7.3
本系列文章假设读者已对linux有一定的了解,其实学习linux内核不需要有很深的关于linux的知识,只需要了解以下内容:linux基础知识及基本shell命令:现代操作系统的基本概念:C语言和gc ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习趣谈
本文原创是freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/9304991 从大二开始学习Linux内核,到现在已经 ...
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
- Linux 内核学习的经典书籍及途径
from:http://www.zhihu.com/question/19606660 知乎 Linux 内核学习的经典书籍及途径?修改 修改 写补充说明 举报 添加评论 分享 • 邀请回答 ...
- linux内核学习之二:编译内核
在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...
随机推荐
- Visual C++中的ADO编程
摘 要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法. 关键字:ADO:连接对象:OLE D ...
- LCS,LIS,LCIS学习
for(int i = 1;i <= n;i++) { int dpmax = 0; for(int j = 1;j <= m;j++) { dp[i][j] = dp[i-1][j]; ...
- bootstrap 问题
less; sass: css预处理:可以直接使用.css,也可以修改.less,生成定制化的css CDN: 服务,使用这个效果会更好.theme一般不引入,jquery一般在js之前引入. 使用b ...
- cassandra集群缩容与剔除问题节点
今天在操作cassandra集群数据迁移时发生了一些意料之外的事情,服务器迁移前与迁移后同样为5台,但是不知道是什么原因导致的,迁移过后的节点居然多出了一台cassandra节点,个人瞬间感觉莫名其妙 ...
- ASP.NET MVC ScriptBundle 不能加载.min.js文件
比如我用 bundles.Add(new ScriptBundle("~/bundles/easyui").Include( "~/Content/easyui/jque ...
- tf中softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits
其实这两个都是计算交叉熵,只是输入数据不同. #sparse 稀疏的.稀少的 word_labels = tf.constant([2,0]) predict_logits = tf.constant ...
- 初探Angular_03 组件中模板数据绑定
这里将介绍三种情况的数据绑定 需要TypeScript的基本知识,如TS数据类型 一.模板属性绑定数据 1.模板属性其实HTML的属性,如class,style,title等 2.先在header.c ...
- visual studio 2015 update 3 简体中文企业版下载地址
文件名: cn_visual_studio_enterprise_2015_with_update_3_x86_x64_dvd_8923298.iso语言: Chinese - SimplifiedS ...
- .Net 百度经纬度转高德
1.需求 由于我们项目里面的经纬坐标是百度的,而对接的第三方需要的是高德的经纬坐标,两者之间是有位差区别的,不能直接使用,我们需要通过一个算法将百度经纬度转化为高德经纬度,在百度官网上,有java算法 ...
- Android - Android Studio 3.0去掉方法参数提示
升级到3.0之后,最明显的一个就是在调用方法的时候多了一个参数提示.有利有弊,看着不是很舒服.就想去掉. 提示样式如下: 去掉提示: 原文地址: https://blog.csdn.net/stude ...
