段地址寄存器.docx
- 文档编号:11969908
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:11
- 大小:29.01KB
段地址寄存器.docx
《段地址寄存器.docx》由会员分享,可在线阅读,更多相关《段地址寄存器.docx(11页珍藏版)》请在冰豆网上搜索。
段地址寄存器
segment寄存器的真实结构
返回
SegmentRegister 也可以称作 SelectorRegister,它在整个 x86/x64体系下实在太重要了。
这里讲解的是 usersegment寄存器,包括:
∙Code段寄存器:
CS
∙Data段寄存器:
ES, SS, DS, FS 以及 GS
这些段寄存器由 usersegmentdescriptor 装载进去。
我们很有必要先去了解 segment 寄存器的真实结构:
上图是我画的 SegmentRegisters 内部结构图,这分为4个部分:
∙Selector
∙Attribute
∙Limit
∙Base
图中已经标出灰色部分是 processor内部使用的,仅仅只有 Selector 部分可以由用户使用
但是在 64 位模式下,它很特别:
∙Base 是 64 位的,但是对于 CS, ES, DS 和 SS 来说 Base是无效的,而对于 FS 和 GS 来说,它们是有效的,64 位的 Baseaddress 可以由用户设定
∙Attribute 只有少数几个属性位是有效的
∙Limit 对于所有的 segmentregisters 来说都是无效的。
注意上面所说的是针对在64位模式下。
segmentregisters结构体现了protectedmode下的几大元素:
∙selector
∙descriptor
∙descriptortable
1.提供基址
Segmentregisters的base提供基址,无论是realmode下还是protectedmode下,其地址的计算方法都是:
base+offset
如果有下面代码:
jmpnext
next:
目标代码地址在 CS.base+eip
2.SegmentRegisters的Attribute部分
SegmentRegisters的Attribute是描述段的属性,它在装载 segmentdescriptor 的时候加载进去设置的,它包括:
∙G 属性:
segmentlimit 的粒度,G=1 是 4K bytes粒度, G=0 是 1 byte粒度
∙D/B 属性:
有两重意义:
oD 属性:
对于 codesegment 来说代表 defaultoperands,D=1 时 32 位 defaultoperands,D=0 时 16 位 defaultoperands
oB 属性:
对于 stacksegment 来说代表 defaultstacksize,B=1 时 32 位 stacksize, B=0 时 16 位 stacksize
∙P 属性:
present位,表示是否加载到内存中
∙DPL 属性:
Privilege-Level(权限级别)范围从 0-3 级
∙S 属性:
S=0 是系统数据segment, S=1 用户segment
∙Type 属性:
代表 segment 类别
在realmode下segmentregisters的Attribute一般情况下是初始状态。
在protectedmode下它随着descriptor而改变。
2.164模式下的segmentregistesattribute
在 64 位模式下大多数属性位都是无效的,并且在 code segmentregister和 data segmentregister之间也存在差别:
2.1.1CS寄存器
在 CS 寄存器里新增了一个属性位:
∙L 属性:
它用来指示 processor 当前处于 64bit 模式还是 compatibility 模式:
o当 CS.L=1 时,processor处于64bit模式
o当 CS.L=0 时,processor处于compatibility横式
在 64 位下 CS 寄存器只有下面的一些属性位是有效的:
∙D 属性
∙L 属性
∙P 属性
∙DPL 属性
∙C 属性
但是请注意:
你必须要设置CS寄存器的 S 属性和 C/D 属性:
∙CS.S=1 表示:
用户的段寄存器
∙CS.C/D=1 表示:
该segmentregister是代码段寄存器
这也就是说:
加载到CS寄存器的 codesegmentdescriptor 你必须将它的 S 属性设为1,C/D 属性设为1才能加载到CS寄存器中
S 属性用来设置 system 还是 user 的段寄存器,属性system的段寄存器有:
LDTR 寄存器和 TR 寄存器
C/D 属性用来指示是 Code 还是 Data 段。
对 CS 寄存器来说,您必须设置这两个属性位为 1 表明它是用户代码段寄存器,否则会产生 #GP 异常
2.1.2Datasegmentregisters(ES,DS,FS以及GS寄存器)
对于这几个 data 段寄存器(SS 寄存器有些特别,除外)来说,只有下面这个属性才有效:
∙P 属性
但是同样需要注意:
必须设置data段寄存器的 S 属性和 C/D 属性(以DS寄存器为例):
∙DS.S=1 表示:
用户的段寄存器
∙DS.C/D=0 表示:
它是Data段寄存器
但是有一种例外:
∙使用 NULLselector 加载到 datasegmentregister是允许的,processor将加载 invalid 不可用的descriptor到segmentregisters中
也就是说:
除了使用 NULLselector 加载外,datasegmentdescriptor的 S 属性需设为 1,C/D 属性需设为 0 才能加载到datasegmentregisters中
对 DS 段寄存器来说,S 必须为 1 并且 C/D 为 0 表明它是用户的数据段寄存器,否则会产生#GP异常
2.1.3SS寄存器
SS 寄存器是datasegmentregister的其中一种,除了要遵循上面的datasegmentregister规则外。
它还必须:
在 SS 寄存器的attribute域的 type 里:
∙W=1(Writable)
∙E 忽略
∙A 忽略
这表示:
由 SS 寄存器访问的 stacksegment必须是可写的,因此:
加载到SS寄存器的datasegmentdescriptor它的 W 属性必须设为 1(表示可写)
在 64 位模式下可以使用 NULLselector 加载到 SS 寄存器中,processor不会去读取GDT表中的第1项,而是以 invalidunused 的segment到SS寄存器中
但是在 legacyx86 模式和 compatibility 模式下是不能使用NULLselector加载来SS寄存器的。
3.更新segmentregister的base
了解segmentregisters结构有什么好处呢?
我们来了解一下segmentregister的base更新情况。
base 的更新在 realmode 和 protectedmode 下是不同的。
3.1 realmode下的base更新
我们来看一下在 realmode 下segmentregister的情形
以上面的代码为例:
movax,cs
movds,ax
这两条代码是在 realmode 下,它有什么奥秘呢?
∙指令 movax,cs 中是将 CS 寄存器的 selector 赋给ax,也就是:
movax,CS.selector
指令 movds,ax 改变了 DS 寄存器的两个值:
∙DS.selector = ax
∙DS.base=DS.selector<<4
DS 寄存器的 selector 得到更新,同时 base 也得到更新,这个DS寄存器的base的更新规则就是realmode下的寻址方式:
∙address= segment*16+offset
3.2protectedmode下base的更新
在 protectedmode 下,base的更新是在加载descriptor进入registers时发生:
base 被更新为 segmentdescriptor 的 base 域
4.segmentregister的limit值
在realmode下segmentregister的limit一般情况下固定为 0xFFFF(64K大小),这个值在processor初始化时设定。
在protectedmode下这个值最大范围为 0xFFFFFFFF(4G大小)依赖于加载的descriptor的limit值。
5.SegmentRegisters的装载
下面代码是在protectedmode下执行:
bits32
code32_entry:
movax,data32_sel
movds,ax
将datasegmentdescriptor的selector赋给ax,下面的指令:
∙movds,ax
将会引发processor做一系列的工作:
∙获取 datasegmentdescriptor
∙检查访问权限
∙更新 DS 寄存器内部结构
通过权限检查后 processor 将 datasegmentdescriptor 相应的信息更新 DS内部结构,包括:
∙selector更新
∙attribulte更新
∙limit更新
∙base更新
但是在 realmode 下如果不转到protectedmode下更新,segmentregister的 attribute 和 limit 是永远得不到更新的。
它的limit值固定为 0xFFFF
关于realmode 下segment的 attrbiute 属性,请参见:
里有详细描述。
前面已经讲过,selector 会得到更新,而 base 会被更新为 selector<<4
看看下面这段伪代码:
structSELECTOR selector=8; /*selector=0x08*/
structDESCRIPTOR descriptor= get_descriptor(selector); /*getsegmentdescriptor*/
/*updateDSregister...*/
DS.selector=selector;
DS.attribute=descriptor.attribute;
DS.limit=descriptor.G?
descriptor.limit*4096+0xfff :
descriptor.limit;
DS.base=descriptor.base;
使用了selector为8获得descriptor后进行DS寄存器的更新,对base的更新要视乎 G 标志位:
∙G=1 时,表示粒度为 4K,limit乘4K后加上值0xfff,这是为了保证0xFFFFFFFF的最大limit值
∙G=0 时,表示粒度为 1byte,limit就等于descriptor的limit值
6.描述segmentregister结构
下面是C代码的描述:
structSEGMENT_REGISTER{
unsignedshortselector;
unsignedshortattribute;
unsignedintlimit;
#ifdef__x64__
unsignedlonglongbase;
#else
unsignedintbase;
#endif
};
上一篇:
segmentation情景分析 返回 下一篇:
CS寄存器
版权mik所有,转载请注明出处
IA-32CONCEPT
一 Concept
1.OperatingMode:
TheIA-32architecturesupportsthreeoperatingmodesandonequasi-operatingmode:
Protectedmode, Real-addressmode, Systemmanagementmode(SMM) and Virtual-8086 mode.
Note:
PEflagincontrolregisterCR0controlswhethertheprocessorisoperatinginreal-addressorprotectedmode.
2.MemoryModel
FlatModel:
memoryappearstoaprogramasasingle,continuousaddressspace,calledalinearaddressspace.Code(aprogram’sinstructions),data,andtheprocedurestackareallcontainedinthisaddressspace.
SegmentedModel:
code,data,andstacksaretypicallycontainedinseparatesegments
Real-Address:
Thereal-addressmodeusesaspecificimplementationofsegmentedmemoryinwhichthelinearaddressspacefortheprogramandtheoperatingsystem/executiveconsistsofanarrayofsegmentsofupto64KBytesinsizeeach.
3.OperatingModevs.MemoryModel
Protectedmode:
theprocessorcanuseanyofthememorymodelsdescribedinthissection.(Thereal-addressingmodememorymodelisordinarilyusedonlywhentheprocessorisinthevirtual-8086mode.)
Real-addressmode:
Wheninreal-addressmode,theprocessoronlysupportstherealaddress
modememorymodel.
4. Address
Physicaladdress:
theaddressprocessoraddressesonitsbus.
Linearaddress:
a4Gsingle,continuousspaceaddress.
Logicaladdress:
consistsofasegmentselectorandanoffset.
二. Basicexecutionenvironment
Inprotectedmode,allmemoryaccessespassthrougheithertheglobaldescriptortable(GDT)orthe(optional)localdescriptortable(LDT),
1. Registers
General-PurposeRegisters(EAX,EBX...32-bit)
Control Registers(CR0,CR1...32-bit)
SegmentRegisters(DS,CS...16-bit):
Hold16bit segmentselector
Memorymanagementregisters(GDTR,LDTR,IDTR,TR48bit)
2. DataStructures
SegmentDescriptor:
providesthebaseaddressofasegmentandaccessrights,type,andusageinformation
SegmentSelector:
providesanindexintotheGDTorLDT(toitsassociatedsegmentdescriptor),aglobal/localflag(thatdetermineswhetherthesegmentselectorpointstotheGDTortheLDT),andaccessrightsinformation.
SystemSegment:
thetask-statesegment(TSS)andtheLDT.
Gate:
provideprotectedgatewaystosystemproceduresandhandlersthatoperateatdifferentprivilegelevelsthanapplicationprogramsandprocedures.
Note:
TheGDTandIDT arenotconsideredasegmentbecauseitisnotaccessedbymeansofasegmentselectorandsegmentdescriptor.
PageDirecotryEntry andPageTableEntryallcontainthe"physicaladdress" of apage(BecausetheyareusedtotranlateLinearAddress,theycannotuseLinearAddress)
Whenwritingapplicationcode,programmersgenerallycreatesegmentselectorswithassemblerdirectivesandsymbols.Theassemblerandothertoolsthencreatetheactualsegmentselectorvaluesassociatedwiththesedirectivesandsymbols.Ifwritingsystemcode,programmersmayneedtocreatesegmentselectorsdirectly.
Whenusingtheflat(unsegmented)memorymodel,thesegmentregistersareloadedwithsegmentselectorsthatpointtooverlappingsegments,eachofwhichbeginsataddress0ofthelinearaddressspace
3.32-Bitvs.16-BitAddressandOperandSizes
32-bitaddressandoperandsizes:
themaximumlinearaddressorsegmentoffsetisFFFFFFFFH,andoperandsizesaretypically8bitsor32bits.
16-bitaddressandoperandsizes:
themaximumlinearaddressorsegmentoffsetisFFFFH(216-1),andoperandsizesaretypically8bitsor16bits.
Whenusing32-bitaddressing,alogicaladdress(orfarpointer)consistsofa16-bitsegmentselectoranda32-bitoffset;whenusing16-bitaddressing,itconsistsofa16-bitsegmentselectoranda16-bitoffset.
Whenoperatinginprotectedmode,thesegmentdescriptorforthecurrentlyexecutingcodesegmentdefinesthedefaultaddressandoperandsize.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地址 寄存器
![提示](https://static.bdocx.com/images/bang_tan.gif)