8086的1M地址空间ffff:000f之后回绕问题

昨天在使用Debug工具的时候,想看看BIOS第一条指令的跳转之后是如何的。

在16位80x86的机器上,机器上电,第一条指令的地址在FFFF:0000处。我想尽管我在Win7的cmd命令中的虚拟8086环境下,但在这环境里应该和实际的实模式是差不多的,比如BIOS的所在的位置什么的。

于是使用debug

放心的输入-u ffff:0000

8086的1M地址空间ffff:000f之后回绕问题_第1张图片

随便一看,恩,第一条指令的确是一个长跳转。再仔细一看,不对头啊,怎么还有FFFF:0011及之后的东东呢?按道理讲应该最后顶多是ffff:000f啊。

然后用d命令一看


前面5个字节的长跳转指令,跟着一些BIOS的信息,比如出厂时间等等,然后还真的有FFFF:000F之后的东西啊。

后来想想,难道地址回绕了?溢出之后当从0000:0000开始算起了?

那看一下0000:0000吧

8086的1M地址空间ffff:000f之后回绕问题_第2张图片

发现不对啊,似乎对应不起来,然后就搞不懂了。在网上搜索一番,发现了这个帖子。

转载上来(转载的内容是考虑的FFFF:FFFF的回绕,其实应该从FFFF:000F之后就开始了)

以下部分属于转载:


debug                                                                                                                                              
  -d   ffff:fff0  
  FFFF:FFF0     00   00   00   00   00   00   00   00-00   00   00   00   00   00   00   00  
  -d   0:ffe0  
  0000:FFE0     0A   A3   DC   0A   A3   E8   0A   89-1E   C2   05   26   8A   46   04   FE  
  0000:FFF0     C0   A2   77   05   56   E8   C3   47-73   02   5E   C3   89   3E   BC   05  
   
  注:  
  FFFF0   +   FFF0   =   10   FFE0

这样1最前面的1会出现溢出,从而实际地址应该是0FFE0。但是可以发现,实际上两个地方的内存内容并不一样,为什么呢?

我们使用的DOS(或者是XP下的CMD),它们都是打开A20地址线的,也就是说   d   ffff:fff0其显示的已经是10FFE0的地址的内容了。  
从80286起由于CPU的寻址实际已经超过了1M的限制,MICROSOFT的DOS就使用了一些技术来使用大于1M的内存,比如扩展内存技术和扩充内存技术。如果使用DOS6.22   可以尝试不加载HIMEM.SYS   和EMM386.EXE,然后再使用DEBUG   ,就可以看到想要的地址循环效果了。

早期的8086只有20根地址线,只能访问1M的地址空间。CPU寻址则按段+偏移的方式进行。16位段+16位偏移的可能的范围是0~0x10FFEF   (即0xFFFF0+0xFFFF),即1M+65520字节的范围。由于只有20根地址线,所以在对1M~1M+65520范围进行访问时,会发生“地址回绕”的现象,就是说实际会访问到0~65520的地方。据说某个著名的/臭名昭著的软件利用了这个特点。在80286,386等CPU上,它会失败,因为这些CPU有多于20根的地址线,并不产生“地址回绕”现象。为了保持完全的兼容性,IBM决定在PC   AT系统上加个逻辑,来模仿以上的回绕特征。他们的方法就是把A20和键盘控制器的一个输出进行AND,这样来控制A20的打开和关闭。一开始时A20是被屏蔽的(总为0),直到系统软件去打开它


2011-09-18补充:

今天在某个ppt中发现了下面这么段话 ,并做了实验

逻辑地址和物理地址
通过开放地址线A20,是的IA-32微处理器可以在实模式下访问1MB以上的65520字节的内存空间——HMA(High Memory Area,高端内存区)
IA-32微处理器有一个输入引脚A20M#,用于确定是否开放A20地址线,PC兼容机一般通过92H端口的第1位控制A20M#
开放A20地址线操作:
IN AL,92H
OR AL,02H
OUT 92H,AL
关闭A20地址线操作:
IN AL,92H
AND AL,0FDH
OUT 92H,AL

我在自己的pc上试了下,实验在window7平台cmd命令下的V86模式下测试无效,可能在真正的实模式下有效


你可能感兴趣的:(8086的1M地址空间ffff:000f之后回绕问题)