精华内容
下载资源
问答
  • x86中内存段描述符

    千次阅读 2012-07-28 13:15:28
    一、 保护模式中80x86 提供了4GB的物理地址空间。这是处理器在其地址总线上可以寻址的地址空间。这个地址空间是平坦的,地址范围从0到0xFFFFFFFF。这个物理地址空间可以映射到读写内存、只读内存以及内存映射I/O...
    看本文章的朋友。
    请支持一次我个人写的搜索页面    
    “速谷歌”“ http://www.sugoogle.com

    谢谢!!


    一、段

    保护模式中80x86 提供了4GB的物理地址空间。这是处理器在其地址总线上可以寻址的地址空间。这个地址空间是平坦的,地址范围从0到0xFFFFFFFF。这个物理地址空间可以映射到读写内存、只读内存以及内存映射I/O中。分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存块单元。80386虚拟地址空间中的虚拟地址(逻辑地址)由一个段部分和一个偏移部分构成。段是虚拟地址到线性地址转换机制的基础。每个段由以下几个参数定义:

    (1)段基地址(Base Address):指定段在线性地址空间中的开始地址。基地址是线性地址,对应于段中偏移0处。

    (2)段限长(Limit):是虚拟地址空间中段内最大可用偏移位置。它定义了段的长度。

    (3)段属性(Attributes):指定段的特性。例如该段是否可读、可写或可作为一个程序执行;段的特权级等。

    段限长定义了在虚拟地址空间中段的大小。段基址和段限长定义了段所映射的线性地址范围或区域。段内0到limit的地址范围对应线性地址中范围Base到Base+Limit。偏移量大于段限长的虚拟地址是无意义的,如果使用则会导致异常。另外,若访问一个段并没有得到段属性许可则也会导致异常。例如,如果你试图写一个只读的段,那么80386就会产生一个异常。另外,多个段映射到线性地址中的范围可以部分重叠或覆盖,甚至完全重叠,如图4-6所示。在本书介绍的Linux 0.1x系统中,一个任务的代码段和数据段的段限长相同,并被映射到线性地址完全相同而重叠的区域上。

     
    图4-6  虚拟(逻辑)地址空间中的段映射到线性地址空间

    段的基地址、段限长以及段的保护属性存储在一个称为段描述符(Segment Descriptor)的结构项中。在逻辑地址到线性地址的转换映射过程中会使用这个段描述符。段描述符保存在内存中的段描述符表(Descriptor Table)中。段描述符表是包含段描述符项的一个简单数组。前面介绍的段选择符即用于通过指定表中一个段描述符的位置来指定相应的段。

    即使利用段的最小功能,使用逻辑地址也能访问处理器地址空间中的每个字节。逻辑地址由16位的段选择符和32位的偏移量组成,如图4-7所示。段选择符指定字节所在的段,而偏移量指定该字节在段中相对于段基地址的位置。处理器会把每个逻辑地址转换成线性地址。线性地址是处理器线性地址空间中的32位地址。与物理地址空间类似,线性地址空间也是平坦的4GB地址空间,地址范围从0到0xFFFFFFFF。线性地址空间中含有为系统定义的所有段和系统表。

     
    图4-7  逻辑地址到线性地址的变换过程

    为了把逻辑地址转换成一个线性地址,处理器会执行以下操作:

    (1)使用段选择符中的偏移值(段索引)在GDT或LDT表中定位相应的段描述符(仅当一个新的段选择符加载到段寄存器中时才需要这一步)。

    (2)利用段描述符检验段的访问权限和范围,以确保该段是可访问的并且偏移量位于段界限内。

    (3)把段描述符中取得的段基地址加到偏移量上,最后形成一个线性地址。

    如果没有开启分页,那么处理器直接把线性地址映射到物理地址,即线性地址被送到处理器地址总线上。如果对线性地址空间进行了分页处理,那么就会使用二级地址转换把线性地址转换成物理地址。页转换将在稍后进行说明。

    二、段描述符

    段描述符表是段描述符的一个数组,如图4-8所示。描述符表的长度可变,最多可以包含8192个8字节描述符。有两种描述符表:全局描述符表GDT(Global Descriptor Table)和局部描述符表LDT(Local Descriptor Table)。

     
    图4-8  段描述符表结构

    描述符表存储在由操作系统维护着的特殊数据结构中,并且由处理器的内存管理硬件来引用。这些特殊结构应该保存在仅由操作系统软件访问的受保护的内存区域中,以防止应用程序修改其中的地址转换信息。虚拟地址空间被分割成大小相等的两半。一半由GDT来映射变换到线性地址,另一半则由LDT来映射。整个虚拟地址空间共含有214个段:一半空间(即213个段)是由GDT映射的全局虚拟地址空间,另一半是由LDT映射的局部虚拟地址空间。通过指定一个描述符表(GDT或LDT)以及表中描述符号,我们就可以定位一个描述符。

    当发生任务切换时,LDT会更换成新任务的LDT,但是GDT并不会改变。因此,GDT所映射的一半虚拟地址空间是系统中所有任务共有的,但是LDT所映射的另一半则在任务切换时被改变。系统中所有任务共享的段由GDT来映射。这样的段通常包括含有操作系统的段以及所有任务各自的包含LDT的特殊段。LDT段可以想象成属于操作系统的数据。

    图4-9表明一个任务中的段如何能在GDT和LDT之间分开。图中共有6个段,分别用于两个应用程序(A和B)以及操作系统。系统中每个应用程序对应一个任务,并且每个任务有自己的LDT。应用程序A在任务A中运行,拥有LDTA,用来映射段CodeA和DataA。类似地,应用程序B在任务B中运行,使用LDTB来映射CodeB和DataB段。包含操作系统内核的两个段CodeOS和DataOS使用GDT来映射,这样它们可以被两个任务所共享。两个LDT段:LDTA和LDTB也使用GDT来映射。

     
    图4-9  任务所用的段类型

    当任务A在运行时,可访问的段包括LDTA映射的CodeA和DataA段,加上GDT映射的操作系统的段CodeOS和DataOS。当任务B在运行时,可访问的段包括LDTB映射的CodeB和DataB段,加上GDT映射的段。

    这个例子通过让每个任务使用不同的LDT,演示了虚拟地址空间如何能够被组织成隔离每个任务。当任务A在运行时,任务B的段不是虚拟地址空间的部分,因此任务A没有办法访问任务B的内存。同样地,当任务B运行时,任务A的段也不能被寻址。这种使用LDT来隔离每个应用程序任务的方法,正是关键保护需求之一。

    每个系统必须定义一个GDT,并可用于系统中所有程序或任务。另外,可选定义一个或多个LDT。例如,可以为每个运行任务定义一个LDT,或者某些或所有任务共享一个LDT。

    GDT本身并不是一个段,而是线性地址空间中的一个数据结构。GDT的基线性地址和长度值必须加载进GDTR寄存器中。GDT的基地址应该进行内存8字节对齐,以得到最佳处理器性能。GDT的限长以字节为单位。与段类似,限长值加上基地址可得到最后表中最后1字节的有效地址。限长为0表示有1个有效字节。因为段描述符总是8字节长,因此GDT的限长值应该设置成总是8的倍数减1(即8n-1)。

    处理器并不使用GDT中的第1个描述符。把这个"空描述符"的段选择符加载进一个数据段寄存器(DS、ES、FS或GS)并不会产生一个异常,但是若使用这些加载了空描述符的段选择符访问内存时就肯定会产生一般保护性异常。通过使用这个段选择符初始化段寄存器,那么意外引用未使用的段寄存器肯定会产生一个异常。

    LDT表存放在LDT类型的系统段中。此时GDT必须含有LDT的段描述符。如果系统支持多LDT的话,那么每个LDT都必须在GDT中有一个段描述符和段选择符。一个LDT的段描述符可以存放在GDT表的任何地方。

    访问LDT需使用其段选择符。为了在访问LDT时减少地址转换次数,LDT的段选择符、基地址、段限长以及访问权限需要存放在LDTR寄存器中。

    当保存GDTR寄存器内容时(使用SGDT指令),一个48位的"伪描述符"被存储在内存中。为了在用户模式(特权级3)避免对齐检查出错,伪描述符应该存放在一个奇字地址处(即 地址 MOD 4 = 2)。这会让处理器先存放一个对齐的字,随后是一个对齐的双字(4字节对齐处)。用户模式程序通常不会保存伪描述符,但是可以通过使用这种对齐方式来避免产生一个对齐检查出错的可能性。当使用SIDT指令保存IDTR寄存器内容时也需要使用同样的对齐方式。然而,当保存LDTR或任务寄存器(分别使用SLTR或STR指令)时,伪描述符应该存放在双字对齐的地址处(即 地址 MOD 4 = 0)。

    展开全文
  • 下面是对代码/数据段描述符的宏定义,目的是为了方便编写描述符。   ; 描述符 ; usage: Descriptor Base, Limit, Attr ; Base: dd -->基址4字节 ; Limit: dd (low 20 bits available) ...

    一、宏定义和属性常量

    (代码段/数据段描述符见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 字节

     

    展开全文
  • 逻辑地址

    2021-06-27 10:04:35
    逻辑地址是指在计算机体系结构中是指... 逻辑地址往往不同于物理地址(physical address),通过地址翻译器(address translator)或映射函数可以把逻辑地址转化为物理地址。中文名逻辑地址外文名logical address; logic...

    逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元(memory cell)、存储单元(storage element)、网络主机(network host)的地址。 逻辑地址往往不同于物理地址(physical address),通过地址翻译器(address translator)或映射函数可以把逻辑地址转化为物理地址。

    中文名

    逻辑地址

    外文名

    logical address; logic address;含    义

    访问指令给出的地址

    也    叫

    逻辑地址简介

    编辑

    语音

    在有地址变换功能的计算机中,访内指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址。要经过寻址方式的计算或变换才得到内存储器中的实际有效地址,即物理地址。

    各种计算机的寻址方式 (地址变换功能)都有所不同,在用汇编语言编写程序时,要先熟悉这个机器的指令系统。

    逻辑地址工具书解释

    1、在有地址变换功能的计算机中,访问指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址。要经过寻址方式的计算或变换才得到内存储器中的物理地址。

    2、把用户程序中使用的地址称为相对地址即逻辑地址。

    3、逻辑地址由两个16位的地址分量构成,一个为段基值,另一个为偏移量。两个分量均为无符号数编码。[1]

    逻辑地址学术文献解释

    1、这样该存储单元的地址就可以用段基址(段地址)和段内偏移量(偏移地址)来表示,段基址确定它所在的段居于整个存储空间的位置,偏移量确定它在段内的位置,这种地址表示方式称为逻辑地址,通常表示为段地址:偏移地址的形式。

    2、所谓逻辑地址是指按数据的逻辑块号给出的磁盘的位置(l块=512字l字=64位)而物理地址则是由磁盘的柱面、头、段等物理位置所确定的地址。

    逻辑地址产生背景

    编辑

    语音

    追根求源,Intel的8位机8080CPU,数据总线(DB)为8位,地址总线(AB)为16位。那么这个16位地址信息也是要通过8位数据总线来传送,也是要在数据通道中的暂存器,以及在CPU中的寄存器和内存中存放的,但由于AB正好是DB的整数倍,故不会产生矛盾!

    但当上升到16位机后,Intel8086/8088CPU的设计由于当年IC集成技术和外封装及引脚技术的限制,不能超过40个引脚。但又感觉到8位机原来的地址寻址能力2^16=64KB太少了,但直接增加到16的整数倍即令AB=32位又是达不到的。故而只能把AB暂时增加4条成为20条。则2^20=1MB的寻址能力已经增加了16倍。但此举却造成了AB的20位和DB的16位之间的矛盾,20位地址信息既无法在DB上传送,又无法在16位的CPU寄存器和内存单元中存放。于是应运而生就产生了CPU段结构的原理。

    逻辑地址线性地址

    编辑

    语音

    一个逻辑地址由两部份组成,段标识符和段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。引号,可以理解为数组的下标——而它将会对应一个数组,它又是什么的索引呢?这就是“段描述符(segment descriptor)”,段描述符具体地址描述了一个段(对于“段”这个字眼的理解:我们可以理解为把虚拟内存分为一个一个的段。比如一个存储器有1024个字节,可以把它分成4段,每段有256个字节)。这样,很多个段描述符,就组了一个数组,叫“段描述符表”,这样,可以通过段标识符的前13位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个段,我刚才对段的抽像不太准确,因为看看描述符里面究竟有什么东东——也就是它究竟是如何描述的,就理解段究竟有什么东东了,每一个段描述符由8个字节组成,如图1:

    a76217c2fd906be63f2d98aa8b304db8.png

    图1

    这些东东很复杂,虽然可以利用一个数据结构来定义它,不过,我这里只关心一样,就是Base字段,它描述了一个段的开始位置的线性地址。

    Intel设计的本意是,一些全局的段描述符,就放在“全局段描述符表(GDT)”中,一些局部的,例如每个进程自己的,就放在所谓的“局部段描述符表(LDT)”中。那究竟什么时候该用GDT,什么时候该用LDT呢?这是由段选择符中的T1字段表示的,=0,表示用GDT,=1表示用LDT。

    GDT在内存中的地址和大小存放在CPU的gdtr控制寄存器中,而LDT则在ldtr寄存器中。

    好多概念,像绕口令一样。图2看起来要直观些:

    f13b8254e225f98314b792eb3b2278ce.png

    图2

    首先,给定一个完整的逻辑地址[段选择符:段内偏移地址],

    1、看段选择符的T1=0还是1,知道当前要转换是GDT中的段,还是LDT中的段,再根据相应寄存器,得到其地址和大小。我们就有了一个数组了。

    2、拿出段选择符中前13位,可以在这个数组中,查找到对应的段描述符,这样,它了Base,即基地址就知道了。

    3、把Base + offset,就是要转换的线性地址了。

    逻辑地址相关区别

    编辑

    语音

    逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。

    物理地址(Physical Address) 是指出现CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。

    虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的任务。在Linux 0.11内核中,给每个程序(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。

    有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。

    逻辑地址与物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。[2]

    词条图册

    更多图册

    参考资料

    1.

    蔡平胜, 闫乐林. 《计算机网络》课程中通信地址的讲解与探讨[J]. 中国科技信息, 2010(13):201-202.

    2.

    邵珠富, 杨惠英. 关于TCP/IP网络环境下逻辑地址、物理地址及相互转换[J]. 吉林广播电视大学学报, 2004(3):59-60.

    展开全文
  • 寄存器和基址

    千次阅读 2016-02-24 16:20:49
    寄存器是因为对内存的分段管理而设置的。...需要用8个字节(64位)存储这些信息,但寄存器只有16位,因此寄存器中只能存储段号(segment selector,也译作“选择”),再由段号映射到存在内存中的GD
    段寄存器是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用(类似于硬盘分页)。在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但段寄存器只有16位,因此段寄存器中只能存储段号(segment selector,也译作“
    段选择符”),再由段号映射到存在内存中的GDT(global (segment) descriptor table,
    全局段号记录表),读取段的信息。[1] 
    
    16位CPU有四个16位段寄存器,所以,其程序可同时访问四个不同含义的段。
    8086CPU有20根地址线,最大可寻址内存空间为1MB。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为2^4,即16个段,每段不超过64KB(2^16,16位数据线就可以寻址)。在8086中设置4个16位的段寄存器,用于管理4种段:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。把内存分段后,每一个段就有一个段基址, 段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
    展开全文
  • 这样,很多个段描述符,就组了一个数组,叫“段描述符表”,这样,可以通过标识符的前13位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个,我刚才对的抽像不太准确,因为看看描述符里面...
  • 描述符是和数据分开存放的,专门用来描述所要访问的数据是整块数据还是单个数据,访问该数据块或单个元素所需要的地址以及其他特征信息等。 数据描述符举例:B6700 以B6700的描述符为例,其数据描述符和数据的形式...
  • 描述符数据表示为向量、数组的的实现提供了支持,有利于简化高级语言程序编译中的代码生成,可以比变址法更快地形成数据元素的地址。但描述符数据表示并不支持向量、数组数据结构的高效实现。而在有向量、数组数据...
  • 大致可以认为就是段描述符的索引,也就是通过这个索引去找到段描述符,所以叫选择子。 这个选择子里面还有一点属性。 这个 T1 就是标明要去哪个表找,而 RPL 就是特权级了,一共分为四层,0 为最高特权级,3 为最低...
  •  在本章最基本代码(P25、chapter3/a/)的基础上实现大地址(超过1M)的读写。在前面程序的基础上新建一个,这个以5MB为基址,远远超过1MB的界限。先读出开始处8字节的内容,然后写入一个字符串,再从中读出8...
  • 描述符数据表示为向量、数组的的实现提供了支持,有利于简化高级语言程序编译中的代码生成,可以比变址法更快地形成数据元素的地址。但描述符数据表示并不支持向量、数组数据结构的高效实现。而在有向量、数组数据...
  • 22、进入保护模式

    2021-12-14 10:52:16
    05、段描述符--的类型和基地址 06、界限及访问控制位 07、安装存储器的段描述符 08、加载全局描述符表寄存器GDTR 09、开启处理器的第21根地址线 10、设置寄存器CR0的PE位进入保护模式 11、描述符高速缓存器和...
  • 关于内存访问你可能听过分段,分页,还有页式。但是为什么要分段?又为什么要分页?有了分页为什么还要分段?这就需要看一看历史的发展,知晓历史之后就知道这一切其实都是自然而然的。这些概念也不是硬塞出来的。...
  • 上一篇介绍了core-site.xml的配置,本篇继续介绍hdfs-site.xml的配置。... 处理所有客户端请求的RPC地址,若在HA场景中,可能有多个namenode,就把名称ID添加到进来。该属性的格式为nn-host1:rpc-port。 d
  • 寄存器是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用(类似于硬盘分页)。在描述内存分段时,需要有如下的信息:1.... selector,也译作“选择”),再由...
  • IOS逆向之汇编基础

    千次阅读 2017-08-12 23:33:45
    原文出处 学习汇编前你应该知道的知识   1、汇编需要什么工具和程序,到哪里下载?   目前阶段,汇编程序仅需要两个程序就够了。 masm.exe,link.exe。...段基值 : 偏移地址 ( 相对地址 ) ,如:23A0:1500 ---...
  • 寄存器的种类和作用:1、代码寄存器CS,用于存放当前正在运行的程序代码所在。2、数据寄存器DS,用于存放数据。3、堆栈寄存器SS,存放堆栈。...在描述内存分段时,需要有如下的信...
  • 大部分微处理器运用了基于栈的体系结构,但调用一个方法时,把它的返回地址和参数压入栈,但方法返回时,那些数据出栈,栈操作就嵌入在微处理器中。 栈是一个概念上的辅助工具,提供限定性的访问方法push()和pop()...
  • 计算机组成原理-作业参考答案.doc第1章 计算机系统概论5. 冯诺依曼计算机的特点是...4 指令由操作码、地址码两大部分组成,操作码用来表示操作的性质,地址码用来表示操作数在存储器中的位置;5 指令在存储器中顺序...
  • 但卷一描述列表对应的行为是压入,继续(continue)和下一个(next) MPLS数据平面操作– push(压入) 标签 RP/0/0/CPU0:R1#show cef 44.1.1.1 detail Thu Apr 12 16:59:04.601 UTC 44.1.1.1/32, ...
  • 上下文是由程序正确运行所需的状态组成的,这个状态包括存放在内存中程序的代码和数据,栈,通用目的寄存器的内容,程序计数器,环境变量以及文件描述符的集合。 作用:进程为应用程序提供两个抽象,一是独立的逻辑...
  • Intel X86 CPU系列的寄存器

    千次阅读 2015-05-07 11:03:47
    一、32位CPU系统级寄存器和数据结构 二、寄存器分类介绍 通用寄存器:8个,分别为EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI 标志寄存器:1个,EFLAGS 控制寄存器:5个,分别为CR...16位寄存器:6个,分别为CS,DS,ES,FS,GS,SS
  • 1] 指令系统-数据表示前言[2.1.1] 数据表示与数据类型[2.1.2] 高级数据表示自定义数据表示采用标志符数据表示方法的主要优点采用标志符数据表示方法的主要缺点自定义(Self-defining)数据表示数据描述符向量、数组...
  • 1. Object java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间 接... // 默认-比较两个对象的地址 //return super.equals(obj); // 重写比较内容 if (this == o) ret
  • 关于计算机结构的考试题(答案)

    千次阅读 2020-12-03 20:29:22
    3、自定义数据表示又可分为带标志符数据表示和 数据描述符 两类。 4、标志符与每个数据相连,合存于同一存储单元,用于描述 _单个数据 的类型特征 5、计算机仿真用微程序解释,计算机模拟用 机器语言程序 解释。 6...
  • 将PC初始化为这程序的入口地址,即图中的标号entry标定的地址,取出的第一条指令是“call 40”。 第一条指令将PC设置为40,那么去地址40处取出指令、执行指令。地址40处的指令应当是"mov 1, [300],
  • 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU转换成物理地址才能够被访问到。例如可以写一个简单的C函数获取变量的逻辑地址: void show_var_addr() { int a = 0; ...
  • 一、主要功能 在本章最基本代码(P25、chapter3/a/)的基础上实现大地址(超过1M)的读写。在前面程序的基础上新建一个,这个以5MB为基址,远远超过1MB的界限。先读出开始处8字节的内容,然后写入一个字符串,...
  • Linux内核0.11版本 fork.c文件

    千次阅读 2017-03-21 17:30:24
    当进程切换时,LDTR中自动载入新进程描述符的选择子(其实是该描述符在GDT中的索引),地址转换时,若相应寄存器(DS,CS,SS,ES)TI=1时,会根据LDTR中的描述符选择子(索引)在GDT中找到LDT的描述符,该描述符中...
  • 9.3 中断向量表的发展

    2019-09-20 21:03:10
    计算机组成 9 中断和异常 9.3 中断向量表的发展 现在这个手册的制造者已经说了,他在第一页就留好了一个表格...这是8086的总共一兆的地址空间,在这其中最低的1K字节固定用来放置中断向量表。这个中断向量表当中包...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 615
精华内容 246
关键字:

段描述符的基值地址