欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

自各儿动手写操作系统

更新时间: 2014-01-05 03:17:56 责任编辑: Author_N1

 

自己动手写操作系统
;pm.inc
; 宏 ------------------------------------------------------------------
;
; 描述符
; usage: Descriptor Base, Limit, Attr
;        Base:  dd
;        Limit: dd (low 20 bits available)
;        Attr:  dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
dw %2 & 0FFFFh ; 段界限 1 (2 字节)
dw %1 & 0FFFFh ; 段基址 1 (2 字节)
db (%1 >> 16) & 0FFh ; 段基址 2 (1 字节)
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性 1 + 段界限 2 + 属性 2 (2 字节)
db (%1 >> 24) & 0FFh ; 段基址 3 (1 字节)
%endmacro ; 共 8 字节

;源文件
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.com
; ==========================================

%include "pm.inc" ; 常量, 宏, 以及一些说明

org 0100h
jmp LABEL_BEGIN

[SECTION .gdt]
; GDT
;                                         段基址,      段界限     , 属性
LABEL_GDT: Descriptor        0,                0, 0      ; 空描述符
LABEL_DESC_CODE32: Descriptor        0, SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 32
LABEL_DESC_VIDEO: Descriptor  0B8000h,           0ffffh, DA_DRW ; 显存首地址
; GDT 结束

GdtLen equ $ - LABEL_GDT ; GDT长度
GdtPtr dw GdtLen - 1 ; GDT界限
dd 0 ; GDT基地址

; GDT 选择子
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
; END of [SECTION .gdt]

[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
。。。
我想知道开头的Descripqor 后面三个0代表什么意思?

--参考方法--
那个是空描述符 GDT必须的开头必写。
--参考方法--
网上抄的关于空描述符

首先让我们先来熟悉一下概念。一个任务(Task )通常会涉及多个段,每个段需要一个描述符号来描述(当然不是绝对的一对一关系,一个段也可以由多个段描述符来对应,视具体应用而定),为了便于组织管理,80386把描述符组织成线性表。由描述符组成的线性表称为描述符表。在80386中有三种类型的描述符表(Descriptor Table),分别是全局描述符表GDT(Global Descriptor Table),局部描述符表(Local Descriptor Table)和中断描述符表IDT(Interrupt Descriptor Table)。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张,局部描述符表可以有若干张,每个任务可以有一张。

    在实模式下,逻辑地址是由段基址和段内偏移构成的。保护模式下,规则发生了很大变化,虚拟地址空间(相当于逻辑地址空间)中存储单元的地址由段选择子和段内偏移两部分组成,与实模式相比,段选择子代替了原来的段基址。从本质上来讲,段选择子最终还是要转化成段基址,那么选择子是如何转化为段基址的呢?让我们来看看选择子的结构和用法:

 

    段选择子长16位,其格式如上图所示。从图中可见,段选择子的高13位是描述符的索引值。所谓描述符索引是指描述符在描述符表中的序号。由于描述符总是8个字节的,所以将描述符索引值逻辑左移3位即可得到对应描述符在描述符表中的偏移地址,再加上描述符表起始地址就可以确定描述符的位置,这算是一个小技巧。段段选择子的第2位是引用描述符表指示位,标记为TI(Table Indicator),TI=0表示该选择子指示的是全局描述符表GDT中的描述符,TI=1表示该选择子指示的是局部描述符表LDT中的描述符。第0和第1位称为RPL(Request Privilege Level请求特权级),用于特权级控制,在上一个问题中有详细描述。通过段选择子,我们可以从GDT或LDT中找到需要的段描述符,段描述符中存储着目标段的基址(起始地址),界限(段的范围)以及其他一些控制信息,由此,我们完成了段选择子到段基址的转化。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:17:56
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20552/
本文WWW.DOC100.NET DOC100.NET版权所有。