GDT,LDT,GDTR,LDTR
物理地址逻辑地址虚拟地址的概念
3、把Base + offset,就是要转换的线性地址了。
还是挺简单的,对于软件来讲,原则上就需要把硬件转换所需的信息准备好,就可以让硬件来完成这个转换了。OK,来看看Linux怎么做的。
2、CPU段式内存管理,逻辑地址如何转换为线性地址
一个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。后面3位包含一些硬件细节,如图:
最后两位涉及权限检查,本贴中不包含。
索引号,或者直接理解成数组下标--那它总要对应一个数组吧,它又是什么东东的索引呢?这个东东就是"段描述符(segment descriptor)",呵呵,段描述符具体地址描述了一个段(对于"段"这个字眼的理解,我是把它想像成,拿了一把刀,把虚拟内存,砍成若干的截--段)。这样,很多个段描述符,就组了一个数组,叫"段描述符表",这样,可以通过段标识符的前13位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个段,我刚才对段的抽像不太准确,因为看看描述符里面究竟有什么东东--也就是它究竟是如何描述的,就理解段究竟有什么东东了,每一个段描述符由8个字节组成,如下图:
3、Linux的段式管理
Intel要求两次转换,这样虽说是兼容了,但是却是很冗余,呵呵,没办法,硬件要求这样做了,软件就只能照办,怎么着也得形式主义一样。
另一方面,其它某些硬件平台,没有二次转换的概念,Linux也需要提供一个高层抽像,来提供一个统一的界面。所以,Linux的段式管理,事实上只是"哄骗"了一下硬件而已。
q8分析x86和分段系统操作系统me
查阅资料,分析X86如何实现用户进程与用户进程之间、用户进程与操作系统之间的隔离;分析分段系统和段页式系统的地址变换机制。
X86的隔离机制主要是通过全局描述符表(GDT)和局部描述符表(LDT)来实现,其中全局描述符表里装载的是可供系统中所有任务使用的段描述符。
局部描述符表只含有与系统中某一个给定任务相关联的描述符。
那么什么是段描述符呢,在CPU的保护模式下,把有关一个段的信息即段基址、限长(段的字节数,个人理解是偏移量)、类型、访问权限成为段描述符,简称描述符(Descriptor)其中描述符又分为非系统段描述符和系统段描述符。
非系统段即应用程序段,也就是通常的代码段、数据段、和堆栈段;而系统段包括任务状态段TSS (Task State Segment)和各种门,另外,局部描述符表也作为一种系统段。
任务状态段是多任务系统中的一种特殊数据结构,它对应一个任务的各种信息。
为了查找和识别,把系统中的描述符以线性表的形式来组织,即构成描述符表。
描述符表的每一项就是一个描述符。
描述符表由操作系统建立,并由操作系统维护和管理。
三种类型的描述符表:GDT,LDT和IDT(中断描述符表)·全局描述附表GDT含有可供系统中所有任务使用的段描述符。
·局部描述符表LDT只含有与系统中某一个给定任务相关联的描述符。
· 中断描述符表IDT 含有指出各中断服务程序位置及相关属性信息的描述符。
由于描述符表是位于存储器中的,因此系统中分别用一个寄存器来指出其位置,并称该寄存器为描述符表寄存器——一共有三个描述符表寄存器:GDTR,LDTR,IDTR 。
每个段描述符都有一个与之对应的段选择符。
在保护模式下,16位段寄存器的内容即为段选择符。
段选择符对GDT 或LDT 提供索引、全局/局部标志以及请求特权级信息。
即用段选择赴的高13位来选择描述符表中8192个描述符中的一个描述符(2^13=8192),13次方用段选择符的右数第3位决定是从GDT 中还是从LDT 中选择描述符,用段选择赴的最低两位指出请求特权级。
微机原理与接口技术习题答案2011..
2. 选择题 (3) 在8086最小方式的读操作时序中,外界
将要输入的数据送上AD线时,在D 的前沿 ,此数据被采样送入CPU。 A. T1 B. T2 C. T3 D. T4
3
(4)逻8辑03地86址有三线种性存地储址地址物空理间地,址它们
是
, 和分段 ,这三种分地页址是
的是 C 。
A. 地址总线B. 数据总线C. 控制总线D. 以上都不对
(5) 通常计算机系统中的外围设备是指 A 。
A. 外存储器、输入设备及输出设备 B. 外存储器、输
入设备 C. 外存储器、输出设备 D. 输入设备、输
出设备
3. 判断题 (1) 计算机中的运算器、控制器和内存储器合称为中
央处理机。 ( × )
由全速总线同CPU内核相连。 (√)
7
4. 简答题
(4) 80386CPU如何从逻辑地址得到线性地址?如何从线性地 址得到物理地址? 答:在保护方式下,Pentium对存储器的组织管理采用两级 存储器管理的策略,即所谓的分段管理和分页管理,分别由 Pentium中的分段部件SU和分页部件PU完成。 分段部件接收到逻辑地址后,根据段选择子的表指示器TI的 值选择全局描述符表(GDT)还是局部描述符表(LDT), 当TI=0时选中GDT,TI=1时选中LDT。选择完描述符表后, 通过段选择子高13位的索引从被选中的描述符表中找出相应 的8个字节的段描述符,从中取出32位段基址(B31~B0) ,32位的段基地址与32位的偏移地址相加后就得到了32位的 线性地址,从而完成了分段部件SU的主要任务。
8
分页部件PU用页目录表和页表实现两级地址转换。 高一级的页目录表中,每一项为一个页目录描述符, 包括了下一级页表的信息,对应于一个页表。低一级 是页表,每一项对应物理存储器中的一页。 控制寄存器中的CR3为页目录表基地址寄存器,用来 保存页目录表在存储器中的物理起始地址。DIR作为 页目录索引从4KB的页目录表中选取一个页目录描述 符(占4个字节, ①页目录描述符所在地址为页目录 索引乘以4与页目录表基地址CR3相加得到),② PAGE作为页表索引从页表中选取一个页描述符(同 样,页描述符所在地址为页表索引乘以4再与页表基 地址相加得到),③而页内偏移量则作为页内的偏移 地址与页描述符提供的页基地址相加产生存储器单元 的32位物理地址。
GDT、LDT、GDTR、LDTR、段寄存器一图流
GDT、LDT、GDTR、LDTR、段寄存器⼀图流段描述符表段描述符表简称描述符表,⽤来存储保护⽅式下段描述符的⼀个阵列。
80386/80486 CPU 共有3 种描述符表:全局描述符表GDT、局部描述符表LDT 和中断描述符表IDT。
描述符表由描述符顺序排列组成,占⼀定的内存,由系统地址寄存器(GDTR 、LDTR、IDTR) 指⽰其在物理存储器中的位置和⼤⼩。
全局描述符表GDT 是供所有任务使⽤的描述符表,在物理存储器地址空间中定义全局描述符表GDT。
通常操作系统使⽤的有代码段描述符、数据段描述符、调⽤门描述符、各个任务的LDT 描述符、任务状态段TSS 描述符、任务门描述符等。
局部描述符表LDT 是每⼀项任务运⾏时都要使⽤的描述符表。
在多任务操作系统管理下,每个任务通常包含两部分:与其他任务共⽤的部分及本任务独有的部分。
与其他任务共⽤部分的段描述符存储在全局描述符表GDT内;本任务独有部分的段描述符存储在本任务的局部描述符表LDT 内。
这样,每个任务都有⼀个局部描述符表LDT,⽽每个LDT 表⼜是⼀个段,它也就必须有⼀个对应的LDT 描述符。
该LDT 描述符存储在全局描述符表中。
局部描述符表LDT 中所存储的属于本任务的段描述符通常有代码段描述符、数据段描述符、调⽤门描述符及任务门描述符等。
GDT 和LDT 段描述符表实际上是段描述符的⼀个长度不定的数据阵列,如图8.5 所⽰。
描述符表在长度上是可变的,最多容纳213 个描述符,最少包含⼀个描述符。
每个项有8 个字节长,称为⼀个段描述符。
中断描述符表IDT暂不介绍。
段寄存器(中的TI)、GDT、LDT、GDTR、LDTR关系:1.4 段选择符 段描述符表(GDT、LDT)是通过选择符来索引的,IDT不⽤通过选择符,直接⽤中断号索引。
保护模式下段寄存器存放的都是段选择符。
选择符⼀共16位,格式如下:Index⼀共13位,正好可以索引到GDT或者LDT的最⼤限长。
微型计算机原理习题及解答
微机原理习题1、微处理器、微型计算机和微型计算机系统三者之间有什么不同?答:微型计算机系统:包括微型计算机的硬件系统和必要的系统软件。
微型计算机的硬件系统包括:微型计算机和外围设备。
微型计算机:主要是由微处理器(MPU)、存储器(ROM、RAM)、I/O接口、系统总线组成。
微处理器(MPU):是用微电子技术将中央处理器(CPU)集成在一块芯片中制成的超大规模集成电路(IC),从逻辑的角度看,其内部主要包括:运算器(或称算术逻辑单元(ALU))、控制器和一定数量的寄存器组成。
2、控制总线传输的信号大致有哪几种?答:控制总线用来传输控制信号,协调各部件之间的工作;控制总线是双向的;控制总线包括CPU送往存储器和输入/输出接口电路的控制信号,如读信号、写信号和中断响应信号等;控制总线还包括其他部件送到CPU的信号,比如,时钟信号、中断请求信号和准备就绪信号等。
3、微型计算机采用总线结构有什么优点?答:采用总线结构的优越性主要表现在两个方面:①简化系统的设计,使CPU、RAM、ROM、I/O接口的设计简单化、标准化,使复杂的硬件系统变为面向总线的单一关系。
②方便系统的硬件扩充——一个部件只要符合总线标准,就可以连接到采用这种总线标准的系统中。
4、简述8086 CPU的逻辑结构。
答:从逻辑功能上,8086分为两部分:总线接口部件BIU(Bus Interface Unit);执行部件EU(Execution Unit)。
其中,总线接口部件包括:地址加法器、段寄存器组、IP指针、指令队列缓冲器、和输入输出控制电路;执行部件包括:运算器、通用寄存器组、标志寄存器、和执行部分的控制电路。
5、8086/8088 和传统的计算机相比在执行指令方面有什么不同? 这样的设计思想有什么优点?答:传统的计算机都是按照下面3个步骤循环工作的:①从指令指针所指的内存单元中取一条指令送到指令寄存器。
②对指令进行译码,而指令指针进行增值,以指向下一条指令的地址。
80x86 保护运行模式
80x86 保护运行模式80386 概述80386 是一个高级的32 位微处理器,专门用于多任务的操作系统,并为需要高性能的应用所设计。
32位的寄存器和数据通道支持32 位的寻址方式和数据类型,处理器可以寻址最高可达4GB 的物理内存以及64TB(246字节)的虚拟内存。
芯片上的内存管理包括地址转换寄存器、高级多任务硬件、保护机制以及分页虚拟内存机制。
下面针对系统编程,概要说明使用80386 的这些基本原理。
系统寄存器设计用于系统编程的系统寄存器主要包括以下几类:标志寄存器EFALGS;内存管理寄存器;控制寄存器;调试寄存器;测试寄存器。
系统标志寄存器EFLAGS 控制着I/O、可屏蔽中断、调试、任务切换以及保护模式和多任务环境下虚拟8086 程序的执行。
其中主要标志见下图所示。
31 23 15 7 00 0 0 0 0 0 0 0 0 0 0 0 O 0VMRFNTIOPLOFDFIFTFSFZFAFPF1CF其中系统标志:VM –虚拟8086 模式;RF –恢复标志;NT –嵌套任务标志;IO PL – I/O 特权级标志;IF –中断允许标志。
内存管理寄存器有4 个,用于分段内存管理:GDTR –全局描述符表寄存器(Global Descriptor Table Register);LDTR –局部描述符表寄存器(Local Descriptor Table Register);IDTR –中断描述符表寄存器(Interrupt Descriptor Table Register);TR –任务寄存器。
其中前两个寄存器(GDTR,LDTR)分别指向段描述符表GDT 和LDT。
IDTR 寄存器指向中断向量表。
TR 寄存器指向处理器所需的当前任务的信息。
80386 共有4 个控制寄存器,分别是CR0、CR1、CR2 和CR3。
格式见下图所示。
31 23 15 7 0页目录基地址寄存器Page Directory Base Register (PDBR)保留ReservedCR3附录465页异常线性地址Page Fault Linear AddressCR2保留ReservedCR1PG保留ReservedETTSEMMPPECR0控制寄存器CR0 含有系统整体的控制标志。
实模式与保护模式
摘自“/rosetta/article/details/8933200”64KB-4GB-64TB?我记得大学的汇编课程、组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为什么实模式下最大寻址空间为1MB?段的最大长度不超过64KB?而保护模式下为啥最大寻址能力就变成了64TB?每个段最大也达4GB?更甚者分段和分页这两个高深的概念像我这种菜鸟怎么也理解不了啊!寻址能力都达64TB了,为啥我的电脑内存只有2GB呢?其实不用纠结于这事,这64TB就是所谓的虚拟地址空间,也叫逻辑地址空间,它能够寻址这么多,只是它有这个能力,并不代表你的内存就要装这么大,你内存比它小再多也不会影响你工作,反过来,要是它的寻址能力只有1MB,而你有2GB的内存,那么那1.9GB就没有实际用处了,这就太浪费资源了。
而实际上这个64TB也没有什么实际意义,因为32位的地址总线能寻址的线性地址空间和物理地址空间都是2^32=4GB。
这个64TB是怎么出来的,稍后揭晓。
实模式与保护模式的来历我们先来说一下为什么有实模式和保护模式的区别。
最早期的8086 CPU只有一种工作方式,那就是实模式,而且数据总线为16位,地址总线为20位,实模式下所有寄存器都是16位。
而从80286开始就有了保护模式,从80386开始CPU数据总线和地址总线均为32位,而且寄存器都是32位。
但80386以及现在的奔腾、酷睿等等CPU为了向前兼容都保留了实模式,现代操作系统在刚加电时首先运行在实模式下,然后再切换到保护模式下运行。
再来区别下几个基本概念:逻辑地址、线性地址和物理地址。
这些概念一时没领会没关系。
继续往下看。
三种地址逻辑地址:即逻辑上的地址,实模式下由“段基地址+段内偏移”组成;保护模式下由“段选择符+段内偏移”组成。
线性地址:逻辑地址经分段机制后就成线性地址,它是平坦的;如果不启用分页,那么此线性地址即物理地址。
段页管理
段页管理机制声明:收集转载别人部分自己加工过内存管理分为两种方式:1分段管理逻辑地址->物理地址2段页管理逻辑地址->线性地址->物理地址(一)GDT与LDT保护模式下的段寄存器由 16位的选择器与 64位的段描述符寄存器构成段描述符寄存器:存储段描述符选择器:存储段描述符的索引(GDTR: 48b=32+16;LDTR: 16b)PS:原先实模式下的各个段寄存器作为保护模式下的段选择器,80486中有6个(即CS,SS,DS,ES,FS,GS)80位的段寄存器,同时提供6个段左右机器当前运行的地址空间。
由选择器CS对应表示的段仍为代码段,选择器SS对应表示的段仍为堆栈段(1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT 只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT 的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。
GDTR中存放的是GDT在内存中的基地址和其表长界限。
(2)段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的,如图三①步。
段选择子是一个16位的寄存器(同实模式下的段寄存器相同)如图四段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。
他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符(如图三①步)。
然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址(如图三②步),段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。
80386的寄存器组成
80386共提供7种类型的32位寄存器,如下:1.通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI)2.段寄存器(CS、SS、DS、ES、FS、GS)3.指令指针寄存器和标志寄存器(EIP、EFLAGS)4.系统表寄存器(GDTR、IDTR、LDTR、TR)5.控制寄存器(CR0、CR1、CR2、CR3、CR4)6.调试寄存器(DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7)7.测试寄存器(TR6、TR7)其中后三类寄存器是80386以后的CPU才有的,以前的CPU完全没有。
下图是前四类寄存器的大致示意图:本文只对这些寄存器做一个大致的介绍,其中有些特殊且有较大意义的寄存器,会另文介绍。
一、通用寄存器一组八个通用寄存器是对8086/80286通用寄存器的32位扩展,其用法与在8086/80286中相似,支持8位、16位、32位操作,进行32位操作是,寄存器名称前面冠以“E”。
这八个寄存器的名称如下:EAX(累加器)、EBX(基址)、ECX(计数)、EDX(数据)、ESP(栈指针)、EBP(基址指针)、ESI(源变址)、EDI(目的变址)。
二、段寄存器80386比8086/80286增加了两个段寄存器FS、GS。
除CS支持代码段,SS支持堆栈段外,程序员可以利用其它的所有段寄存器支持数据段。
每个段寄存器对应这一个64位高速缓存器(有些资料中说有96位,但值使用其中的64位),这在8086中是没有的(在80286中为48位),它的具体作用将另文介绍。
三、指令指针寄存器和标志寄存器指令寄存器EIP是对8086/80286指令指针寄存器的32位扩展,它包含着待执行指令的32位偏移量,该值总是相对CS所代表的段基址而言的。
标志寄存器也是对8086/80286标志寄存器的32位扩展,其定义如下(这张图截自Intel关于IA32架构的最新文档):其中OF、DF、IF、TF、SF、ZF、AF、PF和CF在8086中就已经存在,请参考相关资料。
汇编语言程序设计教程(第3版 卜艳萍)参考答案
汇编语言程序设计教程(第3版卜艳萍)参考答案汇编语言程序设计教程(第3版)习题参考答案第1章汇编语言基础知识思考与练习1. 计算机系统分哪几个层次?简述计算机系统的硬件结构。
1)数字逻辑层 2) 微体系结构层 3) 指令系统层 4) 操作系统层 5) 汇编语言层 6) 高级语言层 7) 应用层硬件系统是指构成计算机系统的物理实体或物理装置。
它由控制器、运算器、存储器、输入设备和输出设备等部件构成。
2. 简述用汇编语言进行程序设计的必要性。
1) 程序要具有较快的执行时间,或者只能占用较小的存储容量。
例如,操作系统的核心程序段,实时控制系统的软件,智能仪器仪表的控制程序等。
2) 程序与计算机硬件密切相关,程序要直接、有效地控制硬件。
例如,I/O接口电路的初始化程序段,外部设备的低层驱动程序等。
3) 大型软件需要提高性能、优化处理的部分。
例如计算机系统频繁调用的子程序、动态连接库等。
4) 没有合适的高级语言或只能采用汇编语言的时候。
例如,开发最新的处理器程序时,暂时没有支持新指令的编译程序。
5) 汇编语言还有许多实际应用,例如分析具体系统尤其是该系统的低层软件、加密解密软件、分析和防治计算机病毒等。
3. 汉字编码主要分哪几类?每类的功能如何?汉字编码主要分为四类:汉字输入码、汉字交换码、汉字机内码和汉字字形码。
1) 为了能直接使用西文标准键盘进行输入,就必须为汉字设计相应的编码方法,即用西文标准键盘上的字母数字串表示汉字的编码。
目前,汉字输入编码方法主要有三种:数字编码、拼音编码和字形编码。
2) 汉字交换码:在不同汉字信息处理系统间进行汉字交换时所使用的编码,就是国标码。
无论采用哪种方法输入汉字,一旦输入到计算机中,必须采用统一的国标码标识每个汉字。
3) 汉字机内码是汉字在设备或信息处理系统内部最基本的表达形式,是在设备和信息处理系统内部存储、处理、传输汉字用的编码。
4) 字形编码也称为字模码,是用点阵表示的汉字字形代码,它是汉字的输出形式。
逻辑地址、线性地址、物理地址和虚拟地址理解
逻辑地址(Logical Address)是指由程式产生的和段相关的偏移地址部分。
例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。
只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定代码段、数据段如果完全相同)。
应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的,仅由系统编程人员涉及。
应用程式员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。
线性地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。
程式代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。
如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。
若没有启用分页机制,那么线性地址直接就是物理地址。
Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
物理地址(Physical Address)是指出目前CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。
如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。
如果没有启用分页机制,那么线性地址就直接成为物理地址了。
虚拟内存(Virtual Memory)是指计算机呈现出要比实际拥有的内存大得多的内存量。
因此他允许程式员编制并运行比实际系统拥有的内存大得多的程式。
这使得许多大型项目也能够在具有有限内存资源的系统上实现。
一个非常恰当的比喻是:你不必非常长的轨道就能让一列火车从上海开到北京。
你只需要足够长的铁轨(比如说3公里)就能完成这个任务。
采取的方法是把后面的铁轨即时铺到火车的前面,只要你的操作足够快并能满足需求,列车就能象在一条完整的轨道上运行。
全局描述符表GDT
全局描述符表GDT写在前⾯添油加醋系列第⼆弹——剖析GDT话说C语⾔的话除了刷刷OJ外,就是⽤来实现操作系统这个⼤头了。
C语⾔⽐C++少了很多很多臃肿的语法特性,写起来⾮常优美(⾄少写操作系统是这样的)。
虽说C++有许多的奇技淫巧,⼀个算法有N种实现⽅法,但这会让选择恐惧症患者(⽐如我)难堪,⽐如说⼀个类要怎样写啊等等,,抛开其他不谈,假如⼀个语⾔的语法特性越少,学起来可能越简单(刚试过lua语法很简单)。
OK废话不多说,进⼊本章主题(涉及OS的资料很杂很偏,如有错误望海涵)。
GDT的构成这个⽹址不错(英⽂的):⾸先,根据⽹上资料,GDT(全局描述符表)⼜叫段描述符表,暂且就这样认为吧,如有异议可以提出来。
⼀个GDT可能是这样的():同样也是这样的():在代码中它⼜是这样:// 全局描述符表结构 /hicjiajia/archive/2012/05/25/2518684.html// base: 基址(注意,base的byte是分散开的)// limit: 寻址最⼤范围 tells the maximum addressable unit// flags: 标志位见上⾯的AC_AC等// access: 访问权限struct gdt_entry {uint16_t limit_low;uint16_t base_low;uint8_t base_middle;uint8_t access;unsigned limit_high: 4;unsigned flags: 4;uint8_t base_high;} __attribute__((packed));这时你的内⼼OS:答案是——它们都是GDT。
语⾔的问题:⾸先,可能有些童鞋不知道struct⾥那些冒号是神马意思。
()这⾥叫作“位域”,就是占⼏个⼆进制位。
同时,它⼜涉及关于C语⾔的问题内存对齐的概念()。
涉及__attribute__((packed))的概念()它是⼿动设置对齐⼤⼩。
80x86的进程管理与切换、描述符(表)
80x86的进程管理与切换、描述符(表)【说明】1、 这是网友的资料,本人觉得很好,只是对其稍加整理与补充。
整理时间:2012年11月26日20:58:432、 这并不是针对具体的操作系统的,这只是80x86 CPU 对操作系统进程管理与切换的硬件支持。
80386保护模式下的程序需要经常用到如下一些数据结构·选择符(selector )·描述符表 (descriptor table )·段描述符(segment descriptor )·门描述符(gate descriptor )他们之间的关系如下:1.80386段管理机制80386分段机制需要用到以下数据结构:·段描述符(segment descriptor )·段描述符表 (descriptor table )·选择符(selector )1.1 段80386有两种类型的段。
存储段是存放可由程序直接进行访问的代码和数据的段。
系统段是为了实现存储管理机制所使用的一种特别的段。
在80386中,有两种系统段:任务状态段TSS 和局部描述符表LDT 段。
存储段没有特定的格式,存放的是简单的代码或者数据。
系统段有特殊的格式,LDT 段存放的是局部描述符表,整个段就是一张表,每个表项是8字节的段描述符号。
TSS 段存放的是任务状态,它有特定的数据结构,下面会有介绍。
LDT TSS ⎧⎧⎪⎪⎨⎪⎪⎩⎨⎧⎪⎪⎨⎪⎪⎩⎩代码段存储段数据段80386的段局部描述符表段系统段任务状态段入口 入口1.2 段描述符80386的描述符类型一共两种,除了段描述符还有一种是门描述符,门描述符一共四种类型:任务门、中断门、陷阱门和调用门。
门描述符和段描述符差别很大,很多字段意义完全不同。
80386描述符如下:门描述符后面介绍,本节介绍段描述符。
在保护方式下,每一个段都有一个相应的8字节描述符来描述。
段描述符中保存了段的所有属性,如段基地址,段限长,段特权级等。
x86中内存管理寄存器(GDTR、LDTR、IDTR和TR)
x86中内存管理寄存器收藏一、内存管理寄存器处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定内存分段管理所用系统表的基地址,如图4-2所示。
处理器为这些寄存器的加载和保存提供了特定的指令。
有关系统表的作用请参见4.2节"保护模式内存管理"中的详细说明。
(点击查看大图)图4-2 内存管理寄存器GDTR、LDTR、IDTR和TR都是段基址寄存器,这些段中含有分段机制的重要信息表。
GDTR、IDTR和LDTR用于寻址存放描述符表的段。
TR用于寻址一个特殊的任务状态段(Task State Segment,TSS)。
TSS中包含着当前执行任务的重要信息。
(1)全局描述符表寄存器GDTRGDTR寄存器中用于存放全局描述符表GDT的32位的线性基地址和16位的表限长值。
基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。
指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。
在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。
在保护模式初始化过程中必须给GDTR加载一个新值。
(2)中断描述符表寄存器IDTR与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。
指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。
在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。
(3)局部描述符表寄存器LDTRLDTR寄存器中用于存放局部描述符表LDT的32位线性基地址、16位段限长和描述符属性值。
指令LLDT和SLDT分别用于加载和保存LDTR寄存器的段描述符部分。
包含LDT表的段必须在GDT表中有一个段描述符项。
当使用LLDT指令把含有LDT表段的选择符加载进LDTR时,LDT段描述符的段基地址、段限长度以及描述符属性会被自动地加载到LDTR中。
x86中内存管理寄存器(GDTR、LDTR、IDTR和TR)
x86中内存管理寄存器收藏一、内存管理寄存器处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定内存分段管理所用系统表的基地址,如图4-2所示。
处理器为这些寄存器的加载和保存提供了特定的指令。
有关系统表的作用请参见4.2节"保护模式内存管理"中的详细说明。
(点击查看大图)图4-2 内存管理寄存器GDTR、LDTR、IDTR和TR都是段基址寄存器,这些段中含有分段机制的重要信息表。
GDTR、IDTR和LDTR用于寻址存放描述符表的段。
TR用于寻址一个特殊的任务状态段(Task State Segment,TSS)。
TSS中包含着当前执行任务的重要信息。
(1)全局描述符表寄存器GDTRGDTR寄存器中用于存放全局描述符表GDT的32位的线性基地址和16位的表限长值。
基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。
指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。
在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。
在保护模式初始化过程中必须给GDTR加载一个新值。
(2)中断描述符表寄存器IDTR与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。
指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。
在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。
(3)局部描述符表寄存器LDTRLDTR寄存器中用于存放局部描述符表LDT的32位线性基地址、16位段限长和描述符属性值。
指令LLDT和SLDT分别用于加载和保存LDTR寄存器的段描述符部分。
包含LDT表的段必须在GDT表中有一个段描述符项。
当使用LLDT指令把含有LDT表段的选择符加载进LDTR时,LDT段描述符的段基地址、段限长度以及描述符属性会被自动地加载到LDTR中。
物理地址逻辑地址虚拟地址的概念
一、概念物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。
所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。
也许错误的理解更利于形而上的抽像。
虚拟内存(virtual memory)这是对整个内存(不要与机器上插那条对上号)的抽像描述。
它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory)。
进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。
这个“转换”,是所有问题讨论的关键。
有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。
(拆东墙,补西墙,银行也是这样子做的),甚至多个进程可以使用相同的地址。
不奇怪,因为转换后的物理地址并非相同的。
——可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数A,代码不是call A,而是call 0x0811111111 ,也就是说,函数A的地址已经被定下来了。
没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不通的。
打住了,这个问题再说下去,就收不住了。
逻辑地址(logical address)Intel为了兼容,将远古时代的段式内存管理方式保留了下来。
虚拟机去虚拟化及检测技术攻防
虚拟机去虚拟化及检测技术攻防在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。
这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
通过虚拟机软件(比如VMware,Virtual PC ,VirtualBox),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。
攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。
当发现程序处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者中断执行,以此提高反病毒人员分析恶意软件行为的难度。
本文主要针对基于Intel CPU的虚拟环境VMware中的Windows XP SP3系统进行检测分析,并列举出当前常见的几种虚拟机检测方法。
方法一:通过执行特权指令来检测虚拟机Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在指定功能号0A(获取VMware版本)的情况下,它会在EBX中返回其版本号“VMXH”;而当功能号为0x14时,可用于获取 VMware内存大小,当大于0时则说明处于虚拟机中。
VMDetect正是利用前一种方法来检测VMware的存在,其检测代码分析如下:代码:bool IsInsideVMWare(){ bool rc = true; __try { __asm { push edx push ecx push ebx mov eax, 'VMXh' mov ebx, 0 // 将 ebx设置为非幻数’VMXH’的其它值mov ecx, 10 // 指定功能号,用于获取VMWare版本,当它为0x14时用于获取VMware内存大小mov edx, 'VX' // 端口号in eax, dx // 从端口dx读取 VMware版本到eax//若上面指定功能号为0x14时,可通过判断eax中的值是否大于0,若是则说明处于虚拟机中cmp ebx, 'VMXh' // 判断ebx中是否包含VMware版本’VMXh’,若是则在虚拟机中setz [rc] // 设置返回值pop ebx pop ecx po p edx } } __except(EXCEPTION_EXECUTE_HANDLER) // 如果未处于VMware中,则触发此异常{ rc = false; } return rc;}测试结果:图1如图1所示,VMDetect成功检测出VMWare的存在。
PLC指令的功能分类
带符号BIN乘法
*L
带符号BIN倍长乘法
*U
无符号BIN乘法
*UL
无符号BIN倍长乘法
BCD乘法
*B
BCD乘法
*BL
BCD倍长乘法
BIN除法
/
带符号BIN除法
/L
带符号BIN倍长除法
/U
无符号BIN除法
/UL
无符号BIN倍长除法
BCD除法
/B除
BCD除法
/BL
BCD倍长法
数据转换指令
无符号BIN←→BCD转换
=F、<>F、
<F、<=F、
>F、>=F
单精度浮点
数据比较
FSTR
浮点<单>→字符串转换
FVAL
字符串→浮点<单>转换
部辅助继电器
4,800点(300 CH)1200.00~1499.15(1200~1499 CH)
37,504点(2,344 CH)3800.00~6143.15(3800~6143 CH)
部辅助继电器
8,192点(512 CH)W000.00~W511.15(W0~W511 CH)
暂时存储继电器
16点TR0~TR15
计数器
4,096点C0~C4095
DM区
32K字D0~D32767
注:可通过数据存的初始值传送功能将初始值保存到CPU单元置闪
存,并通过PLC系统设定,在电源为ON时展开到RAM。
CJ系列高功能I/O单元用DM区域:
D20000~D29599(100字×96号机)
CJ系列CPU高功能单元用DM区域:
-
05
通用输入5
-
-
高速计数器2(B相/减法/方向输入)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GDT,LDT,GDTR,LDTR
买了本罗老师的琢石成器,才看前3章就感觉晕晕忽忽,总体觉得要看懂这本书前提是必须会DOS汇编,了解32位汇编基础.DOS汇编本人只看了王爽老师的汇编语言前11章,中断这块还没有看,看来不看还是不行的。
转回来说,罗老师这本书前3章写的很乱,尤其是描述符这块,看了似懂非懂,通而不透。
只能自己抽丝剥茧,捋清头绪,慢慢体会:
段选择器:32位汇编中16位段寄存器(CS、DS、ES、SS、FS、GS)中不再存放段基址,而是段描述符在段描述符表中的索引值,D3-D15位是索引值,D0-D1位是优先级(RPL)用于特权检查,D2位是描述符表引用指示位TI,TI=0指示从全局描述表GDT中读取描述符,TI=1指示从局部描述符中LDT中读取描述符。
这些信息总称段选择器(段选择子).
段描述符:8个字节64位,每一个段都有一个对应的描述符。
根据描述符描述符所描述的对象不同,描述符可分为三类:储存段描述符,系统段描述符,门描述符(控制描述符)。
在描述符中定义了段的基址,限长和访问内型等属性。
其中基址给出该段的基础地址,用于形成线性地址;限长说明该段的长度,用于存储空间保护;段属性说明该段的访问权限、该段当前在内存中的存在性,以及该段所在的特权级。
段描述符表:IA-32处理器把所有段描述符按顺序组织成线性表放在内存中,称为段描述符表。
分为三类:全局描述符表GDT,局部描述符表LDT和中断描述符表IDT。
GDT和IDT 在整个系统中只有一张,而每个任务都有自己私有的一张局部描述符表LDT,用于记录本任务中涉及的各个代码段、数据段和堆栈段以及本任务的使用的门描述符。
GDT包含系统使用的代码段、数据段、堆栈段和特殊数据段描述符,以及所有任务局部描述符表LDT的描述符。
GDTR全局描述符寄存器:48位,高32位存放GDT基址,低16为存放GDT限长。
LDTR局部描述符寄存器:16位,高13为存放LDT在GET中的索引值。
IA-32处理器仍然使用xxxx:yyyyyyyy(段选择器:偏移量)逻辑方式表示一个线性地址,那么是怎么得到段的基址呢?在上面说明中我们知道,要得到段的基址首先通过段选择器xxxx中TI位指定的段描述符所在位置:
当TI=0时表示段描述符在GDT中,如下图所示:①先从GDTR寄存器中获得GDT基址。
②然后再GDT中以段选择器高13位位置索引值得到段描述符。
③段描述符符包含段的基址、限长、优先级等各种属性,这就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最后的线性地址。
当TI=1时表示段描述符在LDT中,如下图所示:①还是先从GDTR寄存器中获得GDT基址。
②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。
③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。
④用段选择器高13位位置索引值从LDT 段中得到段描述符。
⑤段描述符符包含段的基址、限长、优先级等各种属性,这就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最后的线性地址。