`

(第三章 3)数据段/代码段描述符

阅读更多

一、宏定义和属性常量

(代码段/数据段描述符见P32;门描述符见P51)

下面是对代码段/数据段描述符的宏定义,目的是为了方便编写描述符。

 

; 描述符
; usage: Descriptor Base, Limit, Attr
;        Base:  dd  -->段基址4字节
;        Limit: dd (low 20 bits available)  -->段界限20位,放心大胆地用4字节(32位)表示界限,只不过经转换只用到其中20位
;        Attr:  dw (lower 4 bits of higher byte are always 0)  -->%3 & 0F0FFh,因为高字节的第4位为段界限2的位置
%macro Descriptor 3
	dw	%2 & 0FFFFh				; 段界限1
	dw	%1 & 0FFFFh				; 段基址1
	db	(%1 >> 16) & 0FFh			; 段基址2
	dw	((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)	; 属性1 + 段界限2 + 属性2
	db	(%1 >> 24) & 0FFh			; 段基址3
%endmacro ; 共 8 字节
 

下面定义一些常量,便于在编写描述符时设置属性:

 

; 描述符类型
DA_32		EQU	4000h	; 32 位段

DA_DPL0		EQU	  00h	; DPL = 0
DA_DPL1		EQU	  20h	; DPL = 1
DA_DPL2		EQU	  40h	; DPL = 2
DA_DPL3		EQU	  60h	; DPL = 3

; 存储段描述符类型
DA_DR		EQU	90h	; 存在的只读数据段类型值
DA_DRW		EQU	92h	; 存在的可读写数据段属性值
DA_DRWA		EQU	93h	; 存在的已访问可读写数据段类型值
DA_C		EQU	98h	; 存在的只执行代码段属性值
DA_CR		EQU	9Ah	; 存在的可执行可读代码段属性值
DA_CCO		EQU	9Ch	; 存在的只执行一致代码段属性值
DA_CCOR		EQU	9Eh	; 存在的可执行可读一致代码段属性值

; 系统段描述符类型
DA_LDT		EQU	  82h	; 局部描述符表段类型值
DA_TaskGate	EQU	  85h	; 任务门类型值
DA_386TSS	EQU	  89h	; 可用 386 任务状态段类型值
DA_386CGate	EQU	  8Ch	; 386 调用门类型值
DA_386IGate	EQU	  8Eh	; 386 中断门类型值
DA_386TGate	EQU	  8Fh	; 386 陷阱门类型值

注意到代码段和数据段描述符中和属性相关的字段(从Byte0算起,Byte5和Byte6),如下:

Byte5:

     0~3位:  TYPE

     4位:        S

     5~6位:  DPL

     7位:        P

Byte6:

     0~3位:  段界限2

     4位:        AVL

     5位:        固定为0

     6位:        D/B

     7位:        G

 

 

二、宏和属性常量的使用(重点在属性的设置上):

 

[SECTION .gdt]
; GDT
;                              段基址,      段界限     , 属性
LABEL_GDT:	   Descriptor       0,                0, 0           ; 空描述符
LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_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]

...

 

1、设置属性:

 

理解“32位代码段”中对属性的设置(DA_C+DA_32):

1)DA_32——32位段

 

DA_32		EQU	4000h	; 32 位段

     4000h=0100,0000,0000,0000b,也就是将“D/B位”设置为1,由P36对“D/B位”的说明可知,当这个段是可执行代码段时,称为D位。D=1,则在默认情况下指令使用32位地址及8位操作数(因此,在这个段中用“选择子”代替“段基值”);D=0,则默认情况下用16位地址及16位或8位操作数。

2)DA_C——在内存中存在的可执行代码段/数据段

 

DA_C		EQU	98h	; 存在的只执行代码段属性值

     98h=0000,0000,1001,1000b,也就是将

     TYPE设置为1000,表示可执行。见P36

     S设置为1,表示是数据段/代码段描述符(如果S=0,表示是系统段/门描述符)。见P36

     P设置为1,表示在内存中存在。见P35

 

理解“显存段”中对属性的设置(DA_DRW):

1)DA_DRW——在内存中存在的可读写代码段/数据段

 

DA_DRW		EQU	92h	; 存在的可读写数据段属性值

     92h=0000,0000,1001,0010,也就是将

 

     TYPE设置为0010,表示可读写。见P36

     S设置为1,表示是数据段/代码段描述符(如果S=0,表示是系统段/门描述符)。见P36

     P设置为1,表示在内存中存在。见P35

 


2、设置段基址:

 

LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 其中段基址在后面代码中再指定(略)
LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW	     ;

1)在[SECTION .s16]中设置了第一行这个32位对应的段基址(该段做从实模式转入保护模式前的准备工作):

      ... ...

 [SECTION .s16]
[BITS	16]
LABEL_BEGIN:
        ... ...

	; 初始化 32 位代码段描述符
	xor	eax, eax
	mov	ax, cs
	shl	eax, 4
	add	eax, LABEL_SEG_CODE32
	mov	word [LABEL_DESC_CODE32 + 2], ax
	shr	eax, 16
	mov	byte [LABEL_DESC_CODE32 + 4], al
	mov	byte [LABEL_DESC_CODE32 + 7], ah

        ... ...

	; 真正进入保护模式
	jmp	dword SelectorCode32:0	

[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS	32]
LABEL_SEG_CODE32:
	... ...
2)显存段的段基址固定为0B8000h,故在编写描述符时就写好了
3)gdt开始那个段规定为全0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

预习:下面是门描述符

 

; 门

; usage: Gate Selector, Offset, DCount, Attr

;        Selector:  dw

;        Offset:    dd

;        DCount:    db

;        Attr:      db

%macro Gate 4

dw (%2 & 0FFFFh) ; 偏移1

dw %1 ; 选择子

dw (%3 & 1Fh) | ((%4 << 8) & 0FF00h) ; 属性

dw ((%2 >> 16) & 0FFFFh) ; 偏移2

%endmacro ; 共 8 字节

 

分享到:
评论

相关推荐

    易语言数据段描述符属性查看

    3. **属性查看**:这部分代码会解析从数据段描述符中读取的信息,并将其以用户友好的方式显示出来,例如通过状态条组件显示。状态条文本可能是通过“置状态条文本”命令更新的,这在易语言中用于改变控件(如状态条...

    数据段描述符属性查看易语言源码.rar

    在IT领域,尤其是在操作系统设计和编程中,数据段描述符是至关重要的概念。这段源码是用易语言编写的,易语言是一种中国本土的、面向对象的、可视化的编程语言,旨在降低编程门槛,使非专业程序员也能进行软件开发。...

    易语言源码数据段描述符属性查看易语言源码.rar

    本压缩包文件“易语言源码数据段描述符属性查看易语言源码.rar”包含了与易语言源码相关的数据段描述符属性查看的源代码。数据段描述符是计算机系统中处理内存管理和访问权限的关键部分,特别是在保护模式下运行的...

    USB的描述符及各种描述符之间的依赖

    主机在初始化阶段会按照这样的顺序获取描述符:首先获取设备描述符,接着根据设备描述符中的配置数量来获取配置描述符,然后根据配置描述符中的接口数量获取接口描述符,最后根据接口描述符中的端点数量获取端点描述...

    USB_HID报告及报告描述符简介

    在这段代码中,我们可以看到报告描述符是如何逐步构建起来的: 1. **用途页** (USAGE_PAGE): 指定了报告中的数据属于哪个用途页,这里是通用桌面设备。 2. **用途** (USAGE): 指明了具体的用途,此处为键盘。 3. **...

    symbian描述符转换。

    在Symbian操作系统中,描述符(Descriptor)是一种用于管理I/O操作的数据结构,它扮演着连接应用程序与系统内核的角色。描述符转换是Symbian操作系统中的一个重要概念,主要涉及如何将应用程序对数据的访问请求转化...

    linux内核笔记——进程管理_80386基础

    下面是不同类型的数据段和代码段描述符的总结: | 段类型 | Type 编码 | 说明 | | --- | --- | --- | | 数据段 | 0 | 只读 | | 数据段 | 1 | 只读、已访问 | | 数据段 | 2 | 读/写 | | 数据段 | 3 | 读/写、已访问 ...

    键盘鼠标描述符

    #### 知识点三:键盘描述符解析 接下来是关于键盘描述符的定义: - **键盘的定义**: - `0x05,0x01` 和 `0x09,0x06` 定义键盘设备。 - `0xa1,0x01` 开始一个新的应用集合。 - **按键映射**: - `0x05,0x07` ...

    创建代码段

    2. **定义结构**:XML文件的基本结构包括`&lt;CodeSnippet&gt;`标签,其中包含`&lt;Header&gt;`部分来定义元数据,如代码段的标题、作者和分类;`&lt;Code&gt;`部分则是实际的代码内容。例如: ```xml &lt;CodeSnippets xmlns="http:/...

    数据段描述符属性查看易语言源码-易语言

    在易语言编程环境中,数据段描述符属性是一个关键的概念,它涉及到程序运行时的数据管理和内存组织。本源码提供了一种方法来查看和理解这些属性,这对于深入学习易语言及其底层工作原理非常重要。以下是关于“数据段...

    liulinboyi#x86#99.存储器的段描述符-段的类型和段的特权级1

    在type字段中还有一个a位,Accessed,是否已访问过,无论x是0还是1,这个段是数据段还是代码段,都有一个a位,表示该描述符描述的段,最近是否访问过,或

    清华大学编译原理的PL/0源代码

    1. **词法分析**:这是编译器的第一步,负责识别输入源代码中的标识符、关键字、运算符、分隔符和常量等基本符号。在`all.c`中,可能包含了词法分析器的实现,它会将源代码分解成一个个Token流。 2. **语法分析**:...

    进程管理_80386基础.doc

    - **存储段描述符**:主要描述存储段(即数据段或代码段)的信息。根据存储段的不同用途,存储段描述符中包含了关于访问、可执行性等方面的属性。 - **系统段描述符**:主要用于描述系统段(例如TSS或LDT)的信息。 ...

    GDTR GDT LDTR LDT寄存器说明

    GDT 是一个线性表,包含了系统中所有段描述符的信息,用于记录代码段、数据段、堆栈段和门描述符的信息。 GDT 中的每一个段描述符都包含了该段的基址、限长、优先级等属性信息。段描述符是 8 个字节 64 位的结构,...

    Javaweb第六章的代码

    10. **部署描述符(web.xml)**:部署描述符是Web应用的配置文件,用于定义Servlet、过滤器、监听器以及它们之间的映射关系。理解和编辑web.xml对于Web应用的部署和配置至关重要。 以上就是JavaWeb第六章可能会涵盖...

    SymbianOS中的描述符.txt

    #### 三、堆分配描述符 除了TBuf之外,SymbianOS还提供了一种动态分配的描述符——HBufC,它是在堆上分配的内存块。HBufC的主要特点是可以动态调整大小,非常适合于处理不确定长度的字符串或其他数据。 1. **创建...

    S1的C#第四章作业上机阶段作业加理论作业的原代码

    以下是根据标题和描述所涉及的C#第四章知识点的详细解释: 1. **类与对象**: - **类**:类是C#中的蓝图,它定义了数据(字段)和操作数据的方法(方法)。类是创建对象的模板。 - **对象**:对象是类的实例,它...

Global site tag (gtag.js) - Google Analytics