上一篇文章初步进入保护模式的学习。首先学习了全局描述符表GDT。点击链接查看上一篇文章:全局描述符表

本篇文章继续学习,GDT中存放的条目:描述符,确切的说是段描述符。学习段描述符的作用以及段描述符的格式。

1、段描述符的格式

实模式和保护模式,在内存访问上是由区别的,在保护模式下,你不能说访问哪个段就访问哪个段,在访问之前,必须在GDT内定义要访问的内存段。这个定义就是段的描述符。

描述符不是用户自己建立的,而是用户程序被操作系统加载时,有操作系统根据用户程序的结构而建立的。用户程序是无法自己修改和建立GDT的。用户程序只能老老实实的在自己的地盘上工作。这个时候操作系统为用户程序建立了几个段(定义了几个段描述符),用户程序就只能在这些段内工作,超出这个范围,或者未按预定的方法访问这些段,都将被处理器阻止。

一旦确定了GDT在内存中的位置,下一步就是确定要访问的段,并在GDT中为这些段定义各自的段描述符。

如下图,每个段描述符都是8字节大小。图中下面是低32位,上面是高32位。

很明显,描述符制定了32位的段起始地址(段基地址),以及20位的段边界。

在32位模式下,段地址与实模式下的段地址不一样。在实模式先段地址不是真正的物理地址,它还需要左移4位。而保护模式下,段地址是32位的线性地址,它就是真实的物理地址(未开启分页功能,分页功能后面学习)。

描述符中段基址和段界限不是连续的。这是历史的问题与兼容的问题。

20位的段界限是用来限制段的扩展范围。

下面来介绍段描述符各个字段的意思。

2、段描述符各个字段的意义

下面的表格列出了上述段描述符的各个位的意思,如果现在不理解这些位也无所谓,后面的学习会慢慢深入理解。

G: 粒度位 用于解释段界限的含义。当G位是0时,段界限以字节为单位。此时段的扩展范围是从1字节到1M字节,因为描述符中的界限值是20位的。相反,如果该位是1,那么段界限是以4KB位单位。这样段的扩展范围是4KB到4GB
S: 类 型 位 当该位是0时,表示是一个系统;为1时,表示是一个代码段或者数据段(栈段也是特殊的数据段)。系统段将在后面的文章中学习
DPL 特权级 这两位用于指定描述符的特权级。共有4中处理器支持的特权级别,分别是0、1、2、3 ,其中0是最高的特权级,3是最低的特权级别。刚进入保护模式时执行的代码具有最高特权级0(可以看成是从处理器那里继承来的)这些代码通常是操作系统代码,因此它的特权级最高。每当操作系统加载一个用户程序,它通常都会制定一个低的特权级,比如3特权级。不同特权级的程序是互相隔离的,其访问是严格限制的,而且有些处理器指令只能由0特权级的程序来执行,为的就是安全。在这里,描述符的特权级是用于指定访问该段所必须具有的最低特权级。
P: 段存在位 P位用于指示描述符所对应的段是否存在。一般来说,描述符所对应的段是在内存中。但是当内存空间紧张时,有可能指示建立了描述符,对应的内存空间并不存在,这时就应当把描述符的P位清零,表示段并不存在。另外,同样是在内存空间紧张的情况下,会把很少用到的段换出到硬盘中,腾出空间给当前急需内存的进程使用,这时同样要把P位清零,当再次轮到它执行时,再将其装入内存,然后P位置1。 **P是由处理器负责检查的。**每当通过描述符访问内存段时,如果P位是0,处理器就会产生一个异常中断。通常,该中断处理过程是由操作系统提供的,该处理过程的任务是将该段从硬盘换回内存,并将P位置1。在多用户、多任务的系统中,这是一种常用的虚拟内存调度策略。
D/B: 默认的操作数大小 设置该标志位,主要是为了能够在32位处理器上兼容运行16位保护模式的程序。 该标志位对不同的段有不同的效果。对于代码段,此位称为D位,用于指定指令中默认的的偏移地址和操作数尺寸。D=0时表示指令中的偏移地址或者操作数是16位的。D=1时,表示32位的偏移地址和操作数。对于栈段来说,该位是B位,用于在进行隐式的栈操作中(push,pop,call等),是使用SP寄存器还是使用ESP寄存器。当B=0时,在访问哪个段时,使用SP寄存器,否则就使用ESP寄存器。同时,B位的值,也决定了栈段的上边界。如果B=0,那么栈的上边界是0xFFFF;如果B=1,那么栈段的上边界是0xFFFFFFFF。
L:64位代码段标志 保留此位给64位处理器使用。目前我们将它置0即可
TYPE:描述符子类型 对于数据段来说,这4位分别是X,E,W,A,对于代码段来说这4位分别是X,C,R,A。他们具体的含义见下面的表格。
AVL:软件可以使用的位 通常由操作系统来用,处理器并不使用它。

下面表格是代码段和数据段的TYPE字段

X E W A 描述符类别 含义
0 0 0 X 数据段 只读
0 0 1 X 数据段 读、写
0 1 0 X 数据段 只读,向下扩展
0 1 1 X 数据段 读、写,向下扩展
  • X 表示是否可执行。对于数据段,总是不可执行。所以为0
  • E 表示段的扩展方向。E=0是向上扩展的。E=1是向下扩展的
  • W 指示段的读写属性,W=0是不允许写入的,W=1是可以正常写入的
  • A 是已访问位,用于指示它所指向的段最近是否被访问过。
X C R A 描述符类别 含义
1 0 0 X 代码段 只执行
1 0 1 X 代码段 执行、读
1 1 0 X 代码段 只执行、依从的代码段
1 1 1 X 代码段 执行、读、依从的代码段
  • X 表示是否可执行。代码段总是可执行,所以为1
  • C 指示段是否为特权级依从的。C=0时,表示非依从的代码段,这样的代码段是可以从与它特权级相同的代码段调用,或者通过门调用;C=1时表示允许从低特权级的代码转移到该段执行。
  • R 指示代码段是否允许读出。代码段总是可以执行的,但是为了防止程序破坏,它是不允许写入的。至于是否有读出的可能,由R位决定。R=0时表示不能读出。R=1时,则代码段是可以读出的。
  • A 是已访问位,用于指示它所指向的段最近是否被访问过。

3、总结

今天学习段描述符的格式,以及段描述符各个字段的含义。

笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。

学习探讨加个人:
qq:1126137994
微信:liu1126137994

【OS学习笔记】十四 保护模式二:段描述符相关推荐

  1. 【OS学习笔记】十七 保护模式五:保护模式下如何进行内存保护 与 别名段的意义与作用

    上一篇文章学习了如何进入保护模式,以及如何在保护模式下进行内存访问.点击链接查看上一篇文章:进入保护模式与在保护模式下访问内存 首先说明本片文章有对应的汇编代码,点击链接查看:点击查看 本篇文章接着学 ...

  2. 【OS学习笔记】十三 保护模式一:全局描述符表(GDT)

    上一篇文章,我们大致领略了现代处理器的结构和特点.点解链接查看上一篇文章:现代处理器的结构和特点 本篇文章开始,学习保护模式下的的各种机制.什么是保护模式呢? 一般来说,操作系统负责整个计算机软硬件的 ...

  3. 【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码

    本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十 ...

  4. 【OS学习笔记】三十四 保护模式十:中断和异常区别

    上几篇文章学习了分页机制的一些原理: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 今天继续学习保护模式下的关于中断与异 ...

  5. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  6. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  7. CPU保护模式 分页表 描述符 段选择子

    第一:实模式下程序的运行回顾. 程序运行的实质是什么?其实很简单,就是指令的执行,显然CPU 是指令得以执行的硬件保障,那么CPU如何知道指令在什么地方呢? 对了,80x86系列是使用CS寄存器配合I ...

  8. 【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章学习了保护模式下的任务与任务隔离,以及简单介绍了保护模式下 ...

  9. 【OS学习笔记】六 实模式:编写主引导扇区代码

    上一篇文章学习了:计算机的启动过程(点击链接查看上一篇文章) 这篇文章学习记录为:编写主引导扇区代码. 参考:<X86汇编语言-从实模式到保护模式>-李忠.纯学习笔记,更详细内容请阅读正版 ...

最新文章

  1. 一文初识:美、日、中3国药品GMP特点
  2. 1091 线段的重叠
  3. python一个月能学成嘛-学过 Python 的人没有告诉你,年入百万有多难
  4. python读取中文文件报错-Python3 解决读取中文文件txt编码的问题
  5. android 打包报错,android 打包报错,请问有没有好的解决办法
  6. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异
  7. SAP系统和微信集成的系列教程之一:微信开发环境的搭建
  8. cmd如何默认以管理身份运行
  9. 数据库封装 sql server mysql_mysql操作数据库进行封装实现增删改查功能
  10. sql语句中单引号嵌套问题
  11. 第6次结对作业--郑锦伟古维城
  12. Windows 下Temp帐号处理
  13. xunsearch全文检索初体验
  14. 求数组中最大值和次大值
  15. Android 2.3 版本中链接边框问题解决
  16. java高校贫困生助学贷款系统ssm框架毕业设计
  17. 记录第一次面试的体会(字节跳动实习生招聘)
  18. python七巧板房子_七巧板拼图技巧,房子用简单的七巧板怎么拼 请给图
  19. Unity Editor 基础篇(三):自定义窗口
  20. hone hone clock 与小松鼠驾到~还有牛顿摆等一些其他好玩的东西

热门文章

  1. spring mvc学习(39):restful的crud实现删除方式
  2. angular路由传递参数_Angular路由——在路由时候传递数据
  3. 如何阻止表单的默认提交事件
  4. 采用python解决实际问题_Python编程语言解决几种常见的实际问题
  5. mysql 获取结果_【原创】7. MYSQL++中的查询结果获取(各种Result类型)
  6. ES6笔记 -- 变量/语句声明
  7. 【数组】—冒泡排序选择排序---【巷子】
  8. Anaconda日志
  9. SEO笔记—网页结构优化(四)
  10. AS3 CookBook学习整理(八)