﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-textbox-随笔分类-汇编</title><link>http://www.cnitblog.com/textbox/category/8659.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 09 Jul 2012 03:25:29 GMT</lastBuildDate><pubDate>Mon, 09 Jul 2012 03:25:29 GMT</pubDate><ttl>60</ttl><item><title>About GDT LDT ID (转)</title><link>http://www.cnitblog.com/textbox/archive/2010/10/29/70691.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Fri, 29 Oct 2010 03:38:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/10/29/70691.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/70691.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/10/29/70691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/70691.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/70691.html</trackback:ping><description><![CDATA[
		<p>转自:<a href="http://blog.csdn.net/lihenair/archive/2010/01/10/5168396.aspx">http://blog.csdn.net/lihenair/archive/2010/01/10/5168396.aspx</a></p>
		<p>Intel   Architecture   Software   Developer’s   Manual Volum 3A: SystemProgramming Guide </p>
		<p>段描述符的作用是将代码，数据，堆栈和任务状态段的虚拟地址转换成线性地址，并指明段的类型。段描述符只在局部和全局描述符表中出现。</p>
		<p>选择符16位长，放在段寄存器中，指针的之一部分是用来在全局或局部描述符表中选择一个描述符，以便确定一个虚拟地址空间中的一个特定的存储器段，故叫选择符。</p>
		<p>LDT用于描述相应程序的代码段、数据段和堆栈段。GDT描述系统段，包括操作系统代码和数据。</p>
		<p>GDT LDT GDTR LDTR</p>
		<p>Global and Local Descriptor Tables</p>
		<p>当工作在保护模式时，所有存储器访问都经过全局描述表(GDT)或者一个可选的局部描述表(LDT)。这些表包含的条目称为段描述符。段描述符提供段基址及段访问权限，段类型和使用信息。</p>
		<p>每个段描述符都有一个对应的段选择符。一个段选择符提供了它在GDT或LDT中的索引(对应的段描述符的偏移量)，一个全局/局部flag(决定选择符指向GDT或LDT)和访问权限信息。</p>
		<p>访问段中的一个字节(byte)必须提供一个段选择符和一个偏移量(offset)。段选择符提供访问段描述符的方法(在GDT或LDT中)。从段
描述符，处理器得到线性空间中的段基址。偏移量提供了相对于基址的以字节(byte)为单位的位置。这种机制可用于访问任何有效的代码去，数据区或者堆栈
段，并提供了在处理器工作时根据当前优先级(CPL)可访问的段。CPL被定义为当前执行代码段的保护级别。</p>
		<p>GDT的线性地址的基址位于GDT寄存器(GDTR)中；LDT的线性地址的基址位于LDT寄存器(LDTR)中；</p>
		<p>Global and Local Descriptor Tables in IA-32e Mode</p>
		<p>System Segments, Segment Descriptors, and Gates</p>
		<p>除了构成程序或过程执行环境代码段，数据段和堆栈段，架构还定义了两个系统段: 任务状态段(TSS)和LDT。GDT不被认为是一个段是因为它不可通过段选择符和段描述符访问。TSSs和LDTs有段描述符定义它们。</p>
		<p>架构还定义了一组特殊的描述符，称为门(call gates, interrupt gates, trap gates and task 
gates).这些门提供了保护系统程序和handler的方法。系统程序和handler可能工作在与应用程序和很多程序不同的优先级上。例如，调用门
的请求可以提供访问一个在代码段的程序的方法，而这个代码段可能与当权代码段同级或数字上低优先级。为了由调用门访问程序，调用过程提供调用门的选择符。
处理器接着执行调用门的访问权检查，比较调用门的优先级CPL和调用门指向的目的代码段。</p>
		<p>如果允许访问的目的代码段，则处理器会得到目的代码段的段选择符和代码段在调用门中的偏移量。如果请求需要改变优先级，处理器还会切换到目标优先级的堆栈。新栈的段选择符从当前执行任务的TSS获得。门可以方便的在16位和32为代码段转换，反之亦然。</p>
		<p>Task-State Segments and Task Gates</p>
		<p>TSS定义了任务的执行环境状态。包括通用目的寄存器，段寄存器，EFLAG寄存器，EIP寄存器和特权级为0、1和2的堆栈段选择符和指针。TSS还包括代表LDT对应任务的段选择符和和页结构层次的基址。</p>
		<p>所有在保护模式执行的程序都运行在任务(成为当前任务)的上下文境中。代表当前任务TSS的段选择符存储在任务寄存器中。最简单的任务切换方法使用
call或jump到新任务。这一点上，新任务的TSS的段选择符由CALL或JMP指令给出。切换任务时，处理器执行如下操作：</p>
		<p>1. 储存保持在当前TSS中当前任务的状态</p>
		<p>2. 装载新任务的段选择符到任务寄存器</p>
		<p>3. 通过GDT中的任务描述符访问新TSS</p>
		<p>4. 从新TSS装载新任务状态到通用目的寄存器，段寄存器，LDTR控制寄存器CR3(页结构层次的基址)，EFLAG寄存器和EIP寄存器。</p>
		<p>5. 开始执行新任务</p>
		<p>任务也可以由任务门访问。任务门与调用门类似，除了它提供的是访问TSS的方法而不是代码段。</p>
		<p>Interrupt and Exception Handling</p>
		<p>外部中断，软中断和异常由中断描述符表(IDT)处理。IDT存储门描述符的集合，这些描述符提供访问中断和异常处理程序的方法。如同GDT，IDT也不是一个段。代表IDT基址的线性地址包含着IDT寄存器(IDTR)中。</p>
		<p>IDT中的门描述符可以是中断，陷阱或者任务门描述符。为了访问中断或异常描述符，处理器首先从内部硬件，外部中断控制器或
INT，INTO，INT 3， 
BOUND中接受一个中断向量(中断号)。中断向量提供了IDT中的索引。如果选择的门描述符是一个中断门或陷阱门，对应的处理函数由类似请求调用门的操
作访问。如果描述符是任务门，处理函数由任务切换访问。</p>
		<p>Memory-Management Registers</p>
		<p>
				<br />
		</p>
		<p>处理器提供4个存储器管理寄存器(GDTR，LDTR，IDTR,TR)。</p>
		<p>Global Descriptor Table Register(GDTR)</p>
		<p>GDTR寄存器保存GDT的实模式32位基址和16位限长。基址指明了GDT 0字节的线性地址；表限长指明了表中的字节数。</p>
		<p>上电或重启处理器后，基址置为默认值0，限长置为0FFFFH。新基址在处理器初始化保护模式操作时装入GDTR。</p>
		<p>Local Descriptor Table Register(LDTR)</p>
		<p>LDTR寄存器保存LDT的16位段选择符，基址(保护模式32位)，段限长和描述符属性。基址指明了GDT 0字节的线性地址；表限长指明了表中的字节数。包含LDT的段必须在GDT中有一个段描述符。</p>
		<p>当任务切换时，LDTR自动装入新任务LDT的段选择符和描述符。</p>
		<p>上电或重启处理器后，基址置为默认值0，限长置为0FFFFH。新基址在处理器初始化保护模式操作时装入GDTR。</p>
		<p>Memory Management Overview</p>
		<p>存储器管理功能分为两个部分：分段和分页。分段提供了隔离单独代码，数据和堆栈模块的机制，因此多个程序(或任务)可以在同一个处理器山执行而不被
其他处理器打扰。分页提供了实现常规页请求，虚拟存储器系统(程序执行环境部分可以按需映射到物理地址中)的机制，分页还可以用来分割多任务。</p>
		<p>
				<br />每个系统必须定义一个GDT，可被系统中所有程序和任务使用。可选地，一个或多个LDT可定义。例如，一个LDT可以为每个单独的任务定义，或一些或所以任务共享相同的LDT。</p>
GDT自己不是一个段；相反，它是一个在线性地址空间的数据结构。GDT的线性基址和限长必须装入GDTR寄存器中。GDT的基址必须以8字节对齐以换取最好的处理器性能。GDT的限长以字节代表。如同其他段一样<img src ="http://www.cnitblog.com/textbox/aggbug/70691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-10-29 11:38 <a href="http://www.cnitblog.com/textbox/archive/2010/10/29/70691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>intel指令格式与长度反汇编引擎ADE32分析(转)</title><link>http://www.cnitblog.com/textbox/archive/2010/10/09/69841.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Sat, 09 Oct 2010 03:40:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/10/09/69841.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/69841.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/10/09/69841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/69841.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/69841.html</trackback:ping><description><![CDATA[理解intel指令的二进制结构 原理<br /><br />看雪源连接:<br /><a href="http://bbs.pediy.com/showthread.php?t=54180">http://bbs.pediy.com/showthread.php?t=54180 <br /></a><img src ="http://www.cnitblog.com/textbox/aggbug/69841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-10-09 11:40 <a href="http://www.cnitblog.com/textbox/archive/2010/10/09/69841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fs 的一些参考</title><link>http://www.cnitblog.com/textbox/archive/2010/05/10/65904.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Mon, 10 May 2010 04:00:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/05/10/65904.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/65904.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/05/10/65904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/65904.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/65904.html</trackback:ping><description><![CDATA[经常在r3 下调试经常会看到<br /><br />    mov    eax,fs:[18h]             ；获取TEP 其实就只指向自己fs:[0]<br />    mov    eax,[eax+30h]        ；获取PEB<br />这样的语句。 <br /><br /><span class="highlight">fs</span>段在用户模式（R3）和系统模式（R0）分别指向两个最重要的系统结
构：<br />
Ring3:<br /><span class="highlight">fs</span> --&gt; TEB (Thread Environment Block)结
构表 --&gt; 7FFDE000即“线程环境块”。<br /><br />
Ring0:<br /><span class="highlight">fs</span> --&gt; KPCR (Kernel Processor Control Region)
结构表 --&gt; FFFDF000 即“内核处理器控制域”。<br /><span class="highlight"></span><br /><br /><br /><br />通常在其r3 下fs被用于获取kernel32.dll的基地址 或者其他有关于程序线程和进程的信息。<br /> <br /><br />以下是一些参考资料<br /><br />FS:[0x00]  Win9x and NT Current SEH frame<br />
FS:[0x04]  Win9x and NT Top of stack<br />
FS:[0x08]  Win9x and NT Current bottom of stack<br />
FS:[0x10]  NT Fiber data<br />
FS:[0x14]  Win9x and NT Arbitrary data slot<br />
FS:[0x18]  Win9x and NT Linear address of TIB（TEB--- 也叫做线程信息块 TIB）<br />
FS:[0x20]  NT Process ID<br />
FS:[0x24]  NT Current thread ID<br />
FS:[0x2C]  Win9x and NT Linear address of the thread local storage array<br />
FS:[0x30]  Pointer to PEB<br />
FS:[0x34]  NT Current error number<br />
FS:[0x38]  CountOfOwnedCriticalSections<br />
FS:[0x3c]  CsrClientThread<br />
FS:[0x40]  Win32ThreadInfo<br />
FS:[0x44]  Win32ClientInfo[0x1f]<br />
FS:[0xc0]  WOW32Reserved<br />
FS:[0xc4]  CurrentLocale<br />
FS:[0xc8]  FpSoftwareStatusRegister<br />
FS:[0xcc]  SystemReserved1[0x36]<br />
FS:[0x1a4] Spare1<br />
FS:[0x1a8] ExceptionCode<br />
FS:[0x1ac] SpareBytes1[0x28]<br />
FS:[0x1d4] SystemReserved2[0xA]<br />
FS:[0x1fc] GDI_TEB_BATCH<br />
FS:[0x6dc] gdiRgn<br />
FS:[0x6e0] gdiPen<br />
FS:[0x6e4] gdiBrush<br />
FS:[0x6e8] CLIENT_ID<br />
FS:[0x6f0] GdiCachedProcessHandle<br />
FS:[0x6f4] GdiClientPID<br />
FS:[0x6f8] GdiClientTID<br />
FS:[0x6fc] GdiThreadLocaleInfo<br />
FS:[0x700] UserReserved[5]<br />
FS:[0x714] glDispatchTable[0x118]<br />
FS:[0xb74] glReserved1[0x1A]<br />
FS:[0xbdc] glReserved2<br />
FS:[0xbe0] glSectionInfo<br />
FS:[0xbe4] glSection<br />
FS:[0xbe8] glTable<br />
FS:[0xbec] glCurrentRC<br />
FS:[0xbf0] glContext<br />
FS:[0xbf4] NTSTATUS<br />
FS:[0xbf8] StaticUnicodeString<br />
FS:[0xc00] StaticUnicodeBuffer[0x105]<br />
FS:[0xe0c] DeallocationStack<br />
FS:[0xe10] TlsSlots[0x40]<br />
FS:[0xf10] TlsLinks<br />
FS:[0xf18] Vdm<br />
FS:[0xf1c] ReservedForNtRpc<br />
FS:[0xf20] DbgSsReserved[0x2]<br />
FS:[0xf28] HardErrorDisabled<br />
FS:[0xf2c] Instrumentation[0x10]<br />
FS:[0xf6c] WinSockData<br />
FS:[0xf70] GdiBatchCount<br />
FS:[0xf74] Spare2<br />
FS:[0xf78] Spare3<br />
FS:[0xf7c] Spare4<br />
FS:[0xf80] ReservedForOle<br />
FS:[0xf84] WaitingOnLoaderLock<br />
FS:[0xf88] StackCommit<br />
FS:[0xf8c] StackCommitMax<br />
FS:[0xf90] StackReserve
			<br /><img src ="http://www.cnitblog.com/textbox/aggbug/65904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-05-10 12:00 <a href="http://www.cnitblog.com/textbox/archive/2010/05/10/65904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一般标准的MBR引导过程</title><link>http://www.cnitblog.com/textbox/archive/2009/11/14/62597.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Sat, 14 Nov 2009 08:47:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2009/11/14/62597.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/62597.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2009/11/14/62597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/62597.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/62597.html</trackback:ping><description><![CDATA[
		<br />
		<div class="blogstory">
				<p style="margin-bottom: 0cm;">系统引导过程主要由以下几个步骤组成<font face="文鼎PL中楷Uni, serif">(</font>以硬盘启动为例<font face="文鼎PL中楷Uni, serif">)<br />1</font>、 开机<font face="文鼎PL中楷Uni, serif">;<br />2</font>、 <font face="文鼎PL中楷Uni, serif">BIOS</font>加电自检<font face="文鼎PL中楷Uni, serif">(POST---Power On Self Test),</font>内存地址为<font face="文鼎PL中楷Uni, serif">0fff:0000;<br />3</font>、 将硬盘第一个扇区<font face="文鼎PL中楷Uni, serif">(0</font>头<font face="文鼎PL中楷Uni, serif">0</font>道<font face="文鼎PL中楷Uni, serif">1</font>扇区<font face="文鼎PL中楷Uni, serif">,</font>也就是<font face="文鼎PL中楷Uni, serif">Boot Sector)</font>读入内存地址<font face="文鼎PL中楷Uni, serif">0000:7c00</font>处<font face="文鼎PL中楷Uni, serif">;<br />4</font>、 检查<font face="文鼎PL中楷Uni, serif">(WORD)0000:7dfe</font>是否等于<font face="文鼎PL中楷Uni, serif">0xaa55.</font>若不等于则转去尝试其他介质<font face="文鼎PL中楷Uni, serif">;</font>如果没有其他启动介质<font face="文鼎PL中楷Uni, serif">,</font>则显示 ”<font face="文鼎PL中楷Uni, serif">No ROM BASIC” ,</font>然后死机<font face="文鼎PL中楷Uni, serif">;<br />5</font>、 跳转到<font face="文鼎PL中楷Uni, serif">0000:7c00</font>处执行<font face="文鼎PL中楷Uni, serif">MBR</font>中的程序<font face="文鼎PL中楷Uni, serif">;<br />6</font>、 <font face="文鼎PL中楷Uni, serif">MBR</font>先将自己复制到<font face="文鼎PL中楷Uni, serif">0000:0600</font>处<font face="文鼎PL中楷Uni, serif">,</font>然后继续执行<font face="文鼎PL中楷Uni, serif">;<br />7</font>、 在主分区表中搜索标志为活动的分区<font face="文鼎PL中楷Uni, serif">.</font>如果发现没有活动分区或者不止一个活动分区<font face="文鼎PL中楷Uni, serif">,</font>则停止<font face="文鼎PL中楷Uni, serif">;<br />8</font>、 将活动分区的第一个扇区读入内存地址<font face="文鼎PL中楷Uni, serif">0000:7c00</font>处<font face="文鼎PL中楷Uni, serif">;<br />9</font>、 检查<font face="文鼎PL中楷Uni, serif">(WORD)0000:7dfe</font>是否等于<font face="文鼎PL中楷Uni, serif">0xaa55,</font>若不等于则显示 “<font face="文鼎PL中楷Uni, serif">Missing Operating System”,</font>然后停止<font face="文鼎PL中楷Uni, serif">,</font>或尝试软盘启动<font face="文鼎PL中楷Uni, serif">;<br />10</font>、 跳转到<font face="文鼎PL中楷Uni, serif">0000:7c00</font>处继续执行特定系统的启动程序<font face="文鼎PL中楷Uni, serif">;<br />11</font>、 启动系统<font face="文鼎PL中楷Uni, serif">. </font>以上步骤中<font face="文鼎PL中楷Uni, serif">(2),(3),(4),(5)</font>步由<font face="文鼎PL中楷Uni, serif">BIOS</font>的引导程序完成<font face="文鼎PL中楷Uni, serif">;(6),(7),(8),(9),(10)</font>步由<font face="文鼎PL中楷Uni, serif">MBR</font>中的引导程序完成<font face="文鼎PL中楷Uni, serif">.<br /></font>一般多系统引导程序<font face="文鼎PL中楷Uni, serif">(</font>如<font face="文鼎PL中楷Uni, serif">Smart Boot Manager, BootStar, PQBoot</font>等<font face="文鼎PL中楷Uni, serif">)</font>都是将标准主引导记录替换成自己的引导程序<font face="文鼎PL中楷Uni, serif">,</font>在运行系统启动程序之前让用户选择想要启动的分区<font face="文鼎PL中楷Uni, serif">.</font>而某些系统自带的多系统引导程序<font face="文鼎PL中楷Uni, serif">(</font>如 <font face="文鼎PL中楷Uni, serif">LILO,NT Loader</font>等<font face="文鼎PL中楷Uni, serif">)</font>则可以将自己的引导程序放在系统所处分区的第一个扇区中<font face="文鼎PL中楷Uni, serif">,</font>在<font face="文鼎PL中楷Uni, serif">Linux</font>中即为两个扇区的<font face="文鼎PL中楷Uni, serif">SuperBlock. </font>注：以上步骤中使用的是标准的<font face="文鼎PL中楷Uni, serif">MBR,</font>多系统引导程序的引导过程与此不同<font face="文鼎PL中楷Uni, serif">. </font></p>
				<br />
		</div>
<img src ="http://www.cnitblog.com/textbox/aggbug/62597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2009-11-14 16:47 <a href="http://www.cnitblog.com/textbox/archive/2009/11/14/62597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>