⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 起源 .txt

📁 会变语言实现的一些程序
💻 TXT
字号:
起源 
    作者:iKs 于2007-10-15上传   

--------------------------------------------------------------------------------
   一位著名的科学家(据说是贝特郎·罗素)曾经作过一次关于天文学方面的讲演。他描述了地球如何绕着太阳运动,以及太阳又是如何绕着我们称之为星系的巨大的恒星群的中心转动。演讲结束之时,一位坐在房间后排的矮个老妇人站起来说道:"你说的这些都是废话。这个世界实际上是驮在一只大乌龟的背上的一块平板。"这位科学家很有教养地微笑着答道:"那么这只乌龟是站在什么上面的呢?""你很聪明,年轻人,的确很聪明,"老妇人说,"不过,这是一只驮着一只一直驮下去的乌龟群啊!" 



时间简史 第一章 我们的宇宙图像 



   无论是初学电脑的还是玩电脑许多年的人,都会对PC如何启动非常感兴趣。遗憾的是这方面的资料非常少,我下面要介绍的就是PC如何启动第一条指令,它在什么地方。

   陈旧的资料都会说第一条指令在1MB之下的一点点,随便打开一个BIOS,在文件的末尾都会有这样的指令:

   

    使用Debug工具反编译就是下面的语句:
   
   -U F000:FFF0
   F000:FFF0 EA5BE000F0    JMP     F000:E05B 
   
    
   直接察看你的电脑也是这样的结果。但是,资料中又说BIOS ROM是处在4G下面开始的位置的。具体举例,一个2MB的BIOS,他的文件尾吧正好处在4G下面一点的位置,文件的头是处于 4G-2MB 的位置。量化表示就是这样的对应关系:
   
   影射在内存寻址空间            文件偏移
   FFD0,0000<―――――――――>0hdcmap
   FFEF,FFF0<―――――――――>F,FFF0hdcmap
   FFE7,FFF0<―――――――――>17,FFF0hdcmap
   FFFF,FFF0<―――――――――>1F,FFF0hdcmap
   

   开机时,CPU 将会从 0FFFF,FFF0h 处开始执行,就是对应在 2MB 文件 1F,FFF0h 的位置。这里有2点问题:
   
   1.我们开机不插内存,它是到哪里执行的?
   2.你怎么知道 CPU 是从这个位置执行而不是那个位置?
   
   
   第一个问题是:它是在 BIOS ROM 中开始执行的。目前的 BIOS ROM 是一种可擦写的 Flash ROM,通常在南桥上。

   

    开机之后,CPU 要访问 0FFFFFFF0h 处的数据,问北桥,北桥看看不在他的掌控下回头就去问南桥,南桥继续通过 LPC 或者 SPI 总线问 BIOS,取出来再一路返回给 CPU,然后 CPU 就知道了执行各种指令。

   第二个问题,CPU 的 Spec 上是这样讲的[参考1]:
   
   

   就是说开机之后,CPU 实际上是处在保护模式下的,Base=FFFF0000h 加上 EIP 就刚好是 4G 下面一点点。
   
   

   我做了一点试验来验证上面的,但是还不完全。

   试验环境:MSI 7365 主板 
   NB:  BearLake
   SB:  ICH9
   SPI: 1MB(板载1MB但是我们有特殊设备,可以直接使用2MB)


   此外,还有一块强大的Debug卡,它有8个数码管,能够显示发送到Port 300h上的32位数据。

   Step1. 生成一个2MB的文件:我选用 WinHex
   
   

   选择生成2MB的

   

   命名为our.bin


   新生成的文件是全0填充的,我再使用 UltraEdit-32 打开,替换
   
   "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
   "90 90 90 90 90 90 90 90 90 90 90 90 90 90 eb e0"
   

   其中的 90是 NOP 指令,EB E0 是跳转指令,意思是跳转到上面 16 个字节处。
   
   比如:

   

   1FFFF0h 后面的 EB E0 就会跳转到 1FFFE0h 处继续执行。

   这样,整个文件都成为一个可以执行的程序"链条",我们要做的只是用我们的代码的机器码取代 90h 就可以了。

   我在文件的末端写入 
   
   2E668B06F0FF   mov  eax,cs:[0fff0]
   BA0003         mov  dx,300h  ;(我在PCI上插了一个能截获丢到300h端口的Debug卡)
   66ef           out  dx,eax
   ebfe           jmp  $
   

   

   运行之后,我们的卡上会出现068B662E ,这里我们无法使用 mov eax,[esi]
   这样的指令,因为ds es似乎还没有处于保护模式下,使用的结果只有死机。
   开机之后,没有Ram可以使用,因此暂时没有办法将EIP装到EAX中并且显示出来。
   (本文涉及内容请不要随便试验,因为在没有刷新设备的情况下进行BIOS更新会导致无法开机)

参考1:
   Intel? 64 and IA-32 Architectures
   Software Developer's Manual
   Volume 3A:
   System Programming Guide, Part 1
   Order Number: 253668-024US
   August 2007
   第 382 页 为了方便参考阅读,我将相关内容抓图放在下面。
   

   

   

   收稿日期:2007年10月1日

--------------------------------------------------------------------------------
<<<上一篇  欢迎访问AoGo汇编小站:http://www.aogosoft.com 下一篇>>>  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -