首页 > 其他 > 详细

第四天、保护模式之一 段机制

时间:2015-11-02 21:29:18      阅读:227      评论:0      收藏:0      [点我收藏+]

    新写操作系统,直接就是32位的,不用考虑兼容16位。那就只考虑保护模式。滚蛋吧,实模式君!

    以我目前的理解,所谓保护模式,就是内存的分段管理机制,就是人为的把内存分成几个小段(Segment),各段独立使用。

    为什么要把内存分成很多小段使用呢?原因一是要多个程序同时运行:开QQ勾搭妹子,开网易云音乐听歌,开浏览器看网页。。。。。。好几个程序一起开着呢!如果几个程序都用同一块内存,那就乱了!所以,把内存分成几段:QQ用一段,别的程序不能访问;网易云音乐用另一段,其他程序也不能访问。。。。。。原因二是不同程序的权力不一样:操作系统可以启动、关闭应用程序,应用程序可不能对操作系统指手画脚,也就是各段内存的被访问权限是不同的。

    很明显,要准确定义一个段要三个参数:该段从物理内存的哪个位置开始(段开始的实际内存地址)、该段占用多大的内存空间(段的长度)、该段能被哪些程序访问(段的属性),用专业术语说就是段基址(Segment Base)、段界限(Segment Limit)、段属性(Segment Attritbute)。

    用一个数据结构来描述段的三个属性,这个数据结构就叫描述符(Descriptor)。由于历史的原因(为了和80286兼容),这个数据结构看起来相当纠结(看下面的注释,三个参数竟然不各自独立连续存放,而是被拆开混存的!)。为了方便使用,可以用宏运算自动分离参数存放到合适的位上,NASM汇编代码如下:

; 描述符宏
; 调用格式:Descriptor Base, Limit, Attribute
;         Base  : dd
;         Limit : dd      ; 低 20 位有效
;         Attribute : dw  ; 高字的低 4 位为 0
%macro Descriptor 3       ; 接受 3 个参数
	dw %2 & 0FFFFh                          ; 段界限低 16 位
	dw %1 & 0FFFFh                          ; 段基址低 16 位
	db (%1 >> 16) & 0FFh                    ; 段基址中间 8 位
	dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)  ; 段属性 1 + 段界限高 4 位 + 段属性 2
	db (%1 >> 24) & 0FFh                    ; 段基址高 8 位
%endmacro    			  ; 共占用 8 个字节

    段基址和段界限好理解。段属性包含的内容好多,今天先跳过不管,以后再补吧!

   既然内存被分成了很多段,每个段都由一个描述符定义,这些个数量不定的描述符可以用线性表来存储。这个存放描述符的线性表就叫描述符表(Descriptor Table)。管理全部物理内存的描述符表叫全局描述符表(Global Descriptor Table)。如果一个程序占用的那部分内存也分成几个段管理,那管理自身内存段的描述符表就叫局部描述符表(Local Descriptor Table)。还有一种中断描述符表(Interrupt Descriptor Table),也放以后再回头看吧。

    要引用描述符表中的某一项,只要知道该描述符在描述符表中的序号就行,即描述符索引(Index),专业术语叫段选择子(Segment Selector)。实际上,段选择子里除了放了描述符索引之外,还存了描述符表指示位(Table Index)、请求特权级(Requested Privilege Level)。一个段选择子 16 位,低 2 位(第0、1位)为请求特权级,用于特权检查;第 2 位为描述符指示位,= 0 表示从全局描述符表中读取描述符, = 1 表示从局部描述符表中读取描述符;高 13 位是描述符索引,即描述符在描述符表中的序号。

    现在可以用描述符宏定义一个全局描述符表(GDT)了,NASM汇编语言代码如下:

; 定义全局描述符表(GDT)
;                               段基址         段界限         段属性
LABEL_GDT:         Descriptor      0, 0, 0  ; 全局描述符表的第一项必须留空
LABEL_DESC_CODE32: Descriptor      0,     SegCode32Len - 1, DA_C + DA_32  ; ???
LABEL_DESC_VIDEO:  Descriptor  0B80000h,       0FFFFh,         DA_DRW     ; 显存
; GDT 结束

    照书抄的代码,全局描述符表的第一项必须留空是规定,第三项描述显存,第二项是什么鬼?又要留待以后解决了。





第四天、保护模式之一 段机制

原文:http://my.oschina.net/u/580100/blog/525003

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!