`
lobin
  • 浏览: 382835 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

386:第3篇

 
阅读更多

 

 

内存

 

内存区间

 

低内存(Low Memory)区间

低内存(Low Memory)区间在0x00000到0xfffff之间的1M大小的内存区间。

 

Real Mode IVT

BDA即BIOS data area,BIOS数据区

这里有一部分自行约定使用的内存区

主引导程序加载区

这里有一部分自行约定使用的内存区

EBDA即Extended BIOS Data Area,扩展BIOS数据区

VGA显示内存区

Video BIOS区

Mapped hardware & Misc区

Motherboard(母板) BIOS区

 

高内存("Upper" Memory)区间

大于1M的内存区间

 

寻址

 

寻址方式

立即数寻址

直接寻址

寄存器寻址

寄存器间接寻址

寄存器相对寻址

基址变址寻址

基址变址相对寻址

 

除了立即数寻址和寄存器寻址,其他的寻址方式本质上是一样的。

立即数寻址

mov cs, 7C00H

寄存器寻址

mov ds, cs

直接寻址

mov si, [0H]

寄存器间接寻址

mov si, cs:[bx]

寄存器相对寻址

mov si, cs:[bx + 0H]

基址变址寻址

mov ax, cs:[bx][si]

基址变址相对寻址

mov ax, cs:0H[bx][si]

 

以上例子中都只是mov举例说明各种寻址方式。

寻址是无处不在的,除了上面的例子,数据传送,数据运算,跳转等都会涉及到寻址。

 

比如在程序跳转的时候,如JMP,CALL,甚至是RET,IRET等。

 

内存寻址

有些架构如arm是不能直接访问内存的,x86可以直接访问内存。x86不管运行在哪种模式下,实模式,保护模式,虚拟8086模式,首先都是采用的是分段寻址。x86实模式和保护模式的分段寻址是不一样的。

 




 

 

 

内存管理

 

分段管理

 

段选择子

写道
A segment selector is a 16-bit identifier for a segment (see Figure 3-6). It does not point directly to the segment,
but instead points to the segment descriptor that defines the segment. A segment selector contains the following
items:
Index (Bits 3 through 15) — Selects one of 8192 descriptors in the GDT or LDT. The processor multiplies
the index value by 8 (the number of bytes in a segment descriptor) and adds the result to the base
address of the GDT or LDT (from the GDTR or LDTR register, respectively).
TI (table indicator) flag
(Bit 2) — Specifies the descriptor table to use: clearing this flag selects the GDT; setting this flag
selects the current LDT.
Requested Privilege Level (RPL)
(Bits 0 and 1) — Specifies the privilege level of the selector. The privilege level can range from 0 to
3, with 0 being the most privileged level. See Section 5.5, “Privilege Levels”, for a description of the
relationship of the RPL to the CPL of the executing program (or task) and the descriptor privilege
level (DPL) of the descriptor the segment selector points to.
The first entry of the GDT is not used by the processor. A segment selector that points to this entry of the GDT (that
is, a segment selector with an index of 0 and the TI flag set to 0) is used as a “null segment selector.” The processor
does not generate an exception when a segment register (other than the CS or SS registers) is loaded with a null
selector. It does, however, generate an exception when a segment register holding a null selector is used to access
memory. A null selector can be used to initialize unused segment registers. Loading the CS or SS register with a null
segment selector causes a general-protection exception (#GP) to be generated.
Segment selectors are visible to application programs as part of a pointer variable, but the values of selectors are
usually assigned or modified by link editors or linking loaders, not application programs.

 


保护模式下,段寄存器实际上就是段选择子,而不是像实地址模式那样的段基址。通过段选择子中的索引index找到描述符表中对应的段描述符。

描述符表中的每个描述符大小为8个字节,处理器将段选择子中的索引index乘以8加上描述符表的基地址得到描述符表中对应段描述符的基地址。

 

段描述符(Segment Descriptor)


Segment Limit字段:

表示段大小,Segment Limit字段由两部分组成,Segment Limit 15:00和Seg Limit 19:16,总共20位。在G标志位没有置位的情况下,表示字节数,可以看出它能表示的范围为1byte <= Segment Limit < 1M,如果G标志位置位,表示4K字节数,可以看出它能表示的范围为4K bytes <= Segment Limit < 4G

 

G标记位:粒度

写道
G (granularity) flag
Determines the scaling of the segment limit field. When the granularity flag is clear, the segment limit is interpreted in byte units; when flag is set, the segment limit is interpreted in 4-KByte units. (This flag does not affect the granularity of the base address; it is always byte granular.) When the granularity flag is set, the twelve least significant bits of an offset are not tested when checking the offset against the segment limit. For example, when the granularity flag is set, a limit of 0 results in valid offsets from 0 to 4095.

如果G标记位没有设置,表示segment limit field个字节。如果被设置,表示(segment limit field)*4K字节。

 

Base Address字段:

段的基地址,由3部分组成,总共31位(4字节),

 

Type 字段:

指定段或者门(Gate)的类型以及指定可对段进行的访问类型和增长方向。该字段及其中的每一位取决于S (descriptor type) flag(即S标志)指定的是代码段或数据段描述符还是系统描述符。

 

S标记

也叫描述符类型标记,指定该描述符是代码段或数据段描述符还是系统描述符。

如果该标志位为0,表示系统段描述符,如果该标志位为1,表示代码段或数据段描述符。

 

DPL字段:

也就是描述符特权级字段,用于指定该段的特权级,特权级可以从0到3,即0,1,2,3。其中0特权级为最高特权级。DPL用于控制段的访问权限。

 

DPL和CPL以及RPL的关系可以参考See Section 5.5, "Privilege Levels"这一章节。

 

P标志

也叫segment-present标志,或段可见标志。用于指定该段在内存中可见或不可见。如果设置了该标志位,表示在内存中可见;如果没有设置该标志位,表示在内存中不可见。

 

如果该段在内存中不可见,即没有设置该标志位,当指向该段描述符的段选择子加载到段寄存器时,处理器将产生一个段不存在的异常(#NP),也就是segment-not-present exception (#NP)。

 

D/B标志

即default operation size/default stack pointer size and/or upper bound标志,或者默认的操作大小/默认的栈指针大小以及或者操作大小上限/栈指针大小上限。

 

这里的D表示默认的操作大小/默认的栈指针大小,B表示操作大小上限/栈指针大小上限。

 

取决于该段描述符是可执行代码段、向下扩展的数据段还是堆栈段,而执行不同的功能。

 

对于32位代码段和数据段,这个标志应该总是设置为1.。

对于16为代码段和数据段,这个标志应该总是设置为0。

 

如果是可执行代码段

 

如果是堆栈段(包括堆栈段寄存器指向的数据段)

 

如果是向下扩展的数据段

 

 

下面是一个段描述符例子:

_gdt_5:

# gdt 5, display memory range 0xb0000-0xb7fff, 32K

# base address of segment: 0x000b0000(0xb0000), limit of segment: 0x08000(0000 1000 0000 0000 0000b)

# code or data segment(1), data segment(0010), descriptor privilege level(00)

.word 0x8000# the bit 0-15 of limit of segment.

.word 0x0000# the bit 0-15 of base address of segment.

.byte 0x0b# the bit 16-23 of base address of segment. 

.byte 0b10010010# 0-3: type, 4: s, 5-6: dpl, 7: p

.byte 0b01000000# 0-3: the bit 16-19 of limit of segment, 4: avl, 5: l, 6: d/b, 7: g

.byte 0x00# the bit 24-31 of base address of segment.

 

段描述符(Segment Descriptor, Segment Descriptor When Segment-Present Flag Is Clear)


描述符类型

通常指的是段描述符,比如代码段描述符、数据段描述符。

 

另外还有系统描述符,比如门(Gate)描述符,包括调用门(Call-gate)描述符、中断门(Interrupt-gate)描述符、陷阱门(Trap-gate)描述符以及任务门(Task-gate)描述符。

 

系统描述符除了门(Gate)描述符,还有系统段描述符,包括局部描述符表段(Local descriptor-table segment,LDT segment)描述符和任务状态段(Task-state segment,TSS)描述符。

 

代码段描述符、数据段描述符类型



系统描述符类型

系统描述符类型定义了系统段描述符和门(Gate)描述符类型


段描述符表

写道
A segment descriptor table is an array of segment descriptors (see Figure 3-10). A descriptor table is variable in
length and can contain up to 8192 (2 13 ) 8-byte descriptors.

 

包括2种类型的描述符表:全局描述符表(The global descriptor table,GDT)和局部描述符表(The local descriptor tables,LDT)



 
 
 

 

分页管理

 

 

 

0
1
分享到:
评论

相关推荐

    网管教程 从入门到精通软件篇.txt

    网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    全书一共被压缩为5个rar,这是第三个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何...

    aws-java-sdk-s3-1.12.386.jar中文-英文对照文档.zip

    aws-java-sdk-s3-***.jar中文-英文对照文档.zip,java,aws-java-sdk-s3-***.jar,com.amazonaws,aws-java-sdk-s3,***,com.amazonaws.auth,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,amazonaws,aws,sdk...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    第3部分 jsp篇 第12章 jsp技术 366 12.1 jsp简介 366 12.2 jsp的运行机制 366 12.3 jsp的语法 371 12.3.1 指令元素(directive elements) 371 12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素...

    C++ STL开发技术导引(第5章)

    第三篇 C++ STL容器技术 第6章 vector向量容器 92 6.1 vector技术原理 92 6.2 vector应用基础 94 6.3 本章小结 101 第7章 deque双端队列容器 102 7.1 deque技术原理 102 7.2 deque应用基础 108 7.3 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    第3章 Java中的基本数据类型和运算符 33 教学视频:1小时5分钟 3.1 Java中的基本数据类型 33 3.1.1 基本数据类型——编程语言中的数据原子 33 3.1.2 Java中的基本上数据类型介绍 34 3.1.3 基本数据类型值域 34 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    第3章 Java中的基本数据类型和运算符 33 教学视频:1小时5分钟 3.1 Java中的基本数据类型 33 3.1.1 基本数据类型——编程语言中的数据原子 33 3.1.2 Java中的基本上数据类型介绍 34 3.1.3 基本数据类型值域 34 ...

    C++ STL开发技术导引(第3章)

    第三篇 C++ STL容器技术 第6章 vector向量容器 92 6.1 vector技术原理 92 6.2 vector应用基础 94 6.3 本章小结 101 第7章 deque双端队列容器 102 7.1 deque技术原理 102 7.2 deque应用基础 108 7.3 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    第3部分 jsp篇 第12章 jsp技术 366 12.1 jsp简介 366 12.2 jsp的运行机制 366 12.3 jsp的语法 371 12.3.1 指令元素(directive elements) 371 12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素...

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    第3章 分支结构程序 45 3-1 if语句 46 if语句·其1 46 奇数的判定 47 if语句·其2 48 奇数·偶数的判断 49 非0的判断 49 if语句的结构图 50 相等运算符 52 余数的判断 53 关系运算符 54 嵌套的if语句 55 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    第3部分 jsp篇 第12章 jsp技术 366 12.1 jsp简介 366 12.2 jsp的运行机制 366 12.3 jsp的语法 371 12.3.1 指令元素(directive elements) 371 12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素...

    百度云盘 pdf《大数据架构和算法实现之路:电商系统的技术实战》百度云盘-带标签目录

    第三篇 为顾客发现喜欢的商局: 高级篇 第 5 章方案设计和技术选型: NoSQL 和搜索的整合· .. 195 5.1 问题分析 …… IX 5.2 HBase 简介……….. ... .. .…...... . …. 196 5.3 结合 HBase 和搜索引擎…………...

    21天学通Java-由浅入深

    264 13.7 小结 265 13.8 习题 265 第三篇 应用篇 第14章 Swing桌面程序开发(精彩视频:70分钟) 268 14.1 开发第一个Swing程序 268 14.2 JFrame窗口类 269 14.2.1 JFrame窗口类简介 269 14.2.2 创建简单窗体 269 ...

    Visual C++实践与提高——串口通信与工程应用篇1

    第3章 使用WinAPI串口编程 47 3.1 API串口编程概述 47 3.2 采用同步查询方式的编程方法 47 3.2.1 创建串口 48 3.2.2 关闭串口 53 3.2.3 发送数据 53 3.2.4 接收数据 53 3.2.5 定时接收数据的方法 54 3.3 采用重叠I/O...

    Git权威指南PDF完整版

    第3篇 Git和声 第15章 Git协议与工作协同/ 200 15.1 Git 支持的协议/ 200 15.2 多用户协同的本地模拟/ 202 15.3 强制非快进式推送/ 203 15.4 合并后推送/ 207 15.5 禁止非快进式推送/ 208 第16章 冲突解决/ 210 16.1...

    若干源程序资料12.rar

    2012-06-11 21:22 3,386,253 RTOS_MDK uCOS-II for STM32(LCD5110).rar 2012-06-11 21:19 26,179 Ruby批量编译C源程序.pdf 2012-06-11 21:02 383,822 SPI总线操作E2PROM(本例为25AA020A)实例——浅影.pdf 2012-06-11...

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    全书分起步篇、提高篇和实例篇三篇,共21章。起步篇为第1章~第10章,主要介绍认识Visual C#,C#语言基础,C#语句控制,数组、面向对象编程,熟悉WinForms应用程序,WinForms窗体介绍,WinForms应用程序开发常用控件...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    第3章 基本算法思想 85 3.1 常用算法思想概述 85 3.2 穷举算法思想 85 3.2.1 穷举算法基本思想 86 3.2.2 穷举算法示例 86 3.3 递推算法思想 88 3.3.1 递推算法基本思想 88 3.3.2 递推算法示例 88 3.4 递归...

Global site tag (gtag.js) - Google Analytics