来源: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内核学习之保护模式(一)的更多相关文章

  1. Window内核学习之保护模式基础

    段寄存器 段寄存器有6个分别是 cs,ss,ds,es,fs,gs.这些段寄存器包含16位的可见部分和80位的隐藏部分,共90位. 16位的可见部分就是我们知道的cs等段寄存器的值,我们可以在od中查 ...

  2. 关于Linux内核学习的误区以及相关书籍介绍

    http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html 写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实 ...

  3. Linux内核分析——Linux内核学习总结

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...

  4. linux内核学习之一:环境搭建--安装Debian7.3

    本系列文章假设读者已对linux有一定的了解,其实学习linux内核不需要有很深的关于linux的知识,只需要了解以下内容:linux基础知识及基本shell命令:现代操作系统的基本概念:C语言和gc ...

  5. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  6. Linux内核学习趣谈

    本文原创是freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/9304991 从大二开始学习Linux内核,到现在已经 ...

  7. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

  8. Linux 内核学习的经典书籍及途径

    from:http://www.zhihu.com/question/19606660 知乎 Linux 内核学习的经典书籍及途径?修改 修改 写补充说明 举报   添加评论 分享 • 邀请回答   ...

  9. linux内核学习之二:编译内核

    在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...

随机推荐

  1. MFC中添加新的对话框

    MFC工程中,除了系统自动生成的一些对话框之外,还需要根据自己的需求,添加新的对话框.这里总结下自己最近使用的方法. 首先,找到Resource View中自己新建的工程,然后右键,选择Add Cla ...

  2. windows下C++实现遍历本地文件

    1.假设本地 d:/ 下存放着0.txt,1.txt两个文件 2.开发工具VS,开发语言C++,怎么遍历得到两个文件呢? 废话不多,具体代码请看下面: /** * 入参:文件存放文件夹路径,例如D:\ ...

  3. 个人封装JavaScript函数

    function get_next_day(str_date){ var d=""; d=new Date(str_date); d.setDate(d.getDate()+1); ...

  4. web.xml中Filter,Listener,Servlet的区别

    一.Servlet Servlet是基本的服务端程序,他来自接口Servlet,接口中有方法service.而Servlet的一个重要实现类,则是tomcat服务器的核心,那就是HttpServlet ...

  5. Toad 实现 SQL 优化

    It is very easy for us to implement sql tuning by toad.  We need to do is just give complex sql stat ...

  6. boot分区剩余空间不足

      Linux boot分区用于存放内核文件以及Linux一些启动配置文件,一般情况下分区大小为500M足够使用,如果出现空间不足的问题可以使用以下方法来解决. 查看已经安装的内核 dpkg --ge ...

  7. cassandra集群缩容与剔除问题节点

    今天在操作cassandra集群数据迁移时发生了一些意料之外的事情,服务器迁移前与迁移后同样为5台,但是不知道是什么原因导致的,迁移过后的节点居然多出了一台cassandra节点,个人瞬间感觉莫名其妙 ...

  8. System.IO.FileLoadException:“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。”

    解决方案: 在app.config新增如下配置节: <?xml version="1.0"?> <configuration> <startup us ...

  9. s11 day 101 python Linux环境安装 与路飞项目支付功能

    from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = ...

  10. 检查网卡是否支持 SR-IOV

    [root@node1 ~]# lspci -nn | grep Eth 08:00.0 Ethernet controller [0200]: Intel Corporation I350 Giga ...