- 浏览: 543491 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
一、宏定义和属性常量
(代码段/数据段描述符见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: ... ...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
预习:下面是门描述符
; 门
; 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 字节
发表评论
-
(第三章 8 )特权级——保护模式的特权级检查(DPL,RPL,CPL, 一致代码段,非一致代码段)
2013-03-20 11:14 2365特权级是保护模式下一个重要的概念,CPL,RPL和 ... -
(第6章 1)最简单的进程
2012-10-11 10:56 1034第一步——ring0 --> ring1 ... -
(第4章 2)突破512字节的限制
2012-09-15 11:40 2791一、代码 ... -
(第4章 1)软盘结构及其数据读取
2012-09-14 21:59 1939参考资料: http://blog.cs ... -
(第三章 12)中断
2012-09-11 20:20 1033一、中断和8259A中断控制器 1. ... -
(第三章 8 )特权级——CPL、DPL、RPL
2012-07-11 10:02 2407很久以后,等我大量翻阅关于“保护模式的特权级检 ... -
(第三章 0)保护模式如何“保护”
2012-03-14 07:59 1082IA32中“保护模式”的“保护”二字理解:(P48) ... -
(第一、二章)nasm的汇编和反汇编
2012-02-27 13:36 4973nasm的汇编和反汇编 步骤: 1. 汇编(bo ... -
(第三章 14)克勤克俭用内存——初始化页目录表、页表,开启分页机制
2011-07-22 11:30 249在启动分页机制SetupPaging之前,先调用了Di ... -
(第三章 13)克勤克俭用内存——查看内存块
2011-07-22 09:25 143[SECTION .data1] ALIGN 32 ... -
(第三章 12)克勤克俭用内存——显示字符串
2011-07-21 16:25 116DispStr调用方法: [SECTION . ... -
(第三章 11)根据自己内存情况 使用分页机制
2011-06-11 15:51 1474一、查看内存分布情况 设置“页目录表”和“页 ... -
参考博客-还有哪些人也在看这本书
2011-06-10 22:46 1364这位很详细: http://www.cnblogs.com/ ... -
(第三章 10)“代码段间跳转” 和 “访问数据段”
2011-06-10 15:40 1380下面说明代码段和数据段的访问: 一、代码段间跳转 ... -
(第三章 9)通过调用门进行有特权级变换的转移(二)
2011-06-08 11:29 191本文展示《(第三章 9)通过调用门进行有特权级变换的转移(一) ... -
(第三章 9)“调用门” 和 “利用调用门在高低特权级的转移”
2011-06-08 10:34 2685在此之前,先要熟悉汇编指令“长/短jmp”、“长/短c ... -
(第三章 7)LDT
2011-06-06 09:49 1511先展示一下效果图: 直接看代码: ... -
(第三章 6)保护模式下,读写大地址内存 & 从32位保护模式跳回16位实模式(二)
2011-06-06 09:15 1484三、关于保护模式和实 ... -
(第三章 5)保护模式下,读写大地址内存 & 从32位保护模式跳回16位实模式(一)
2011-06-05 13:53 2072一、主要功能 ... -
(第三章 4)A20地址线
2011-06-03 20:43 2067A20地址线困惑我了很久,这篇文章终于揭开了这个谜 ...
相关推荐
3. **属性查看**:这部分代码会解析从数据段描述符中读取的信息,并将其以用户友好的方式显示出来,例如通过状态条组件显示。状态条文本可能是通过“置状态条文本”命令更新的,这在易语言中用于改变控件(如状态条...
在IT领域,尤其是在操作系统设计和编程中,数据段描述符是至关重要的概念。这段源码是用易语言编写的,易语言是一种中国本土的、面向对象的、可视化的编程语言,旨在降低编程门槛,使非专业程序员也能进行软件开发。...
本压缩包文件“易语言源码数据段描述符属性查看易语言源码.rar”包含了与易语言源码相关的数据段描述符属性查看的源代码。数据段描述符是计算机系统中处理内存管理和访问权限的关键部分,特别是在保护模式下运行的...
主机在初始化阶段会按照这样的顺序获取描述符:首先获取设备描述符,接着根据设备描述符中的配置数量来获取配置描述符,然后根据配置描述符中的接口数量获取接口描述符,最后根据接口描述符中的端点数量获取端点描述...
在这段代码中,我们可以看到报告描述符是如何逐步构建起来的: 1. **用途页** (USAGE_PAGE): 指定了报告中的数据属于哪个用途页,这里是通用桌面设备。 2. **用途** (USAGE): 指明了具体的用途,此处为键盘。 3. **...
在Symbian操作系统中,描述符(Descriptor)是一种用于管理I/O操作的数据结构,它扮演着连接应用程序与系统内核的角色。描述符转换是Symbian操作系统中的一个重要概念,主要涉及如何将应用程序对数据的访问请求转化...
下面是不同类型的数据段和代码段描述符的总结: | 段类型 | Type 编码 | 说明 | | --- | --- | --- | | 数据段 | 0 | 只读 | | 数据段 | 1 | 只读、已访问 | | 数据段 | 2 | 读/写 | | 数据段 | 3 | 读/写、已访问 ...
#### 知识点三:键盘描述符解析 接下来是关于键盘描述符的定义: - **键盘的定义**: - `0x05,0x01` 和 `0x09,0x06` 定义键盘设备。 - `0xa1,0x01` 开始一个新的应用集合。 - **按键映射**: - `0x05,0x07` ...
2. **定义结构**:XML文件的基本结构包括`<CodeSnippet>`标签,其中包含`<Header>`部分来定义元数据,如代码段的标题、作者和分类;`<Code>`部分则是实际的代码内容。例如: ```xml <CodeSnippets xmlns="http:/...
在易语言编程环境中,数据段描述符属性是一个关键的概念,它涉及到程序运行时的数据管理和内存组织。本源码提供了一种方法来查看和理解这些属性,这对于深入学习易语言及其底层工作原理非常重要。以下是关于“数据段...
在type字段中还有一个a位,Accessed,是否已访问过,无论x是0还是1,这个段是数据段还是代码段,都有一个a位,表示该描述符描述的段,最近是否访问过,或
1. **词法分析**:这是编译器的第一步,负责识别输入源代码中的标识符、关键字、运算符、分隔符和常量等基本符号。在`all.c`中,可能包含了词法分析器的实现,它会将源代码分解成一个个Token流。 2. **语法分析**:...
- **存储段描述符**:主要描述存储段(即数据段或代码段)的信息。根据存储段的不同用途,存储段描述符中包含了关于访问、可执行性等方面的属性。 - **系统段描述符**:主要用于描述系统段(例如TSS或LDT)的信息。 ...
GDT 是一个线性表,包含了系统中所有段描述符的信息,用于记录代码段、数据段、堆栈段和门描述符的信息。 GDT 中的每一个段描述符都包含了该段的基址、限长、优先级等属性信息。段描述符是 8 个字节 64 位的结构,...
10. **部署描述符(web.xml)**:部署描述符是Web应用的配置文件,用于定义Servlet、过滤器、监听器以及它们之间的映射关系。理解和编辑web.xml对于Web应用的部署和配置至关重要。 以上就是JavaWeb第六章可能会涵盖...
#### 三、堆分配描述符 除了TBuf之外,SymbianOS还提供了一种动态分配的描述符——HBufC,它是在堆上分配的内存块。HBufC的主要特点是可以动态调整大小,非常适合于处理不确定长度的字符串或其他数据。 1. **创建...
以下是根据标题和描述所涉及的C#第四章知识点的详细解释: 1. **类与对象**: - **类**:类是C#中的蓝图,它定义了数据(字段)和操作数据的方法(方法)。类是创建对象的模板。 - **对象**:对象是类的实例,它...