为什么bios将mbr装载到0x7c00地址

   一、你知道x86汇编程序编程中的神奇数字“0x7C00”吗?

   “0x7C00”是BIOS将MBR(主引导记录,hdd/fdd中的第一个扇区)加载到的内存地址。OS或引导加载程序开发人员必须假设其汇编程序代码已加载,并从0x7C00开始。

   但是首先,你可能会感到奇怪。

“我阅读了所有的英特尔x86(32位)程序员手册,但没有找到神奇的数字0x7C00。”

   是的.0x7C00与x86 CPU无关。很自然,你在英特尔的cpu规格中找不到它。然后,你会想,“是谁决定的?”

   第二,你可能会想:

“0x7C00是十进制数的32KiB-1024B。这个数字是什么意思?”

   任何人都决定了。但是,为什么他/她决定这样一个折中的地址?

    哼……魔法数字“0x7C00”周围有两个问题(谜团)。

  1. 谁决定“0x7C00”?
  2. “0x7C00=32KiB-1024B”是什么意思?

    好了,让我们和我一起深入了解现代 x86(32bit)PC的祖先“IBM PC 5150”的BIOS秘密。。。!!

    “0x7C00”首次出现在IBM PC 5150 ROM BIOS INT 19h处理器中。
    在x86 IBM Compatible PC的历史上徘徊,您知道IBM PC 5150是现代x86(32位)IBM PC/AT Compatible电脑的祖先。
    这款PC于1981年8月发布,采用Intel 8088(16位)和16KiB RAM(最小内存型号)。BIOS和Microsoft BASIC存储在ROM中。

 

     开机后,BIOS处理“POST”(Power On Self Test)程序,然后调用INT 19h。在INT 19h处理器中,BIOS检查PC是否有软盘/硬盘/固定软盘。

     如果电脑有任何可用的磁盘,BIOS会将第一个扇区(512B)的磁盘加载到0x7C00中。

  现在,您明白了为什么在x86文档中找不到这个神奇的数字。这个神奇的数字属于BIOS规范。

  二、0x7C00的出身

      围绕IBM PC DOS、Microsoft和SCP的86-DOS的故事是著名的故事. See: "A Short History of MS-DOS".

     SCP的“86-DOS”(1980年)是IBM PC DOS 1.0的参考操作系统。
     请 参看: dos操作系统时间线
     86-DOS(早期称为“QDOS”)是用于8086/8088 cpu的CP/M兼容操作系统。1979年,Digital Research Inc还没有为8086/8088 cpu开发CP/M。

     SCP销售了两个S-100总线板,一个是8086 CPU板,两个是“CPU监视器”rom板。
     “CPU监视器”程序提供了引导加载器和调试器。此“CPU监视器”引导加载程序将MBR加载到“0x200”,而不是“0x7C00”。
     1981年,IBM PC DOS是8086/8088的下一个类似CP/M的操作系统。

     所以,我告诉你“0x7C00首次出现在IBM PC 5150 ROM BIOS中”。
    上一个,SCP的CPU监视器引导加载程序加载到0x200,而不是0x7C00。

  三、为什么CPU监视器的加载引导程序将MBR改为“0x200”?

        关于 “0x200”有三个原因。

  1. 8086中断矢量使用0x0-0x3FF。
  2. 86-DOS从0x400加载。
  3. 86-DOS没有使用0x200-0x3FF之间的中断向量。

      这些原因意味着0x200-0x3FF需要保留,并且不能妨碍操作系统,无论86-DOS或用户应用程序要加载到哪里。

      所以 Tim Paterson(86-DOS开发人员)选择0x200作为MBR加载地址。

      Q: 谁决定“0x7C00”?-A: IBM PC 5150 BIOS开发团队。

    “0x7C00”由 IBM PC 5150 BIOS开发团队(David Bradley博士)决定。
     如上所述,这个神奇的数字诞生于1981年,“IBM PC/at Compat”PC/BIOS供应商并没有为BIOS和操作系统的向后兼容性更改这个值。

    英特尔(8086/8088供应商)和微软(操作系统供应商)都没有做出决定。

Q: “0x7C00=32KiB-1024B”是什么意思?A: 受操作系统要求和CPU内存布局的影响。

  IBM PC 5150最小内存型号只有16KiB RAM。所以,你可能有一个问题。

最小内存型号(16KiB)能否从磁盘加载操作系统?BIOS将MBR加载到32KiB-1024B地址,但物理RAM不够

不,那个例子没有考虑。作为IBM PC 5150 ROM BIOS开发团队成员之一,David Bradley博士表示:

“DOS 1.0至少需要32KB,所以我们不担心16KB的启动。”

(注意:DOS 1.0要求最低16KiB?还是32KiB?我找不出哪个正确。但至少在1981年的早期BIOS开发中,他们认为32KiB是DOS的最低要求。)

  BIOS开发团队决定0x7C00,原因是:

  1. 他们希望为操作系统留出尽可能多的空间,以便在32KiB内加载自己。
  2. 8086/8088使用 0x0-0x3FF 作为中断向量,BIOS数据区位于其后。
  3. 引导扇区(mbr)为512字节,用于引导程序的堆栈/数据区域需要更多512字节。
  4. 因此,选择了0x7C00,即32KiB的最后1024字节。
    1字节(byte)=8位(bit)1024字节=1K 1024k=1M

Once OS loaded and started, boot sector is never used until power reset. So, OS and application can use the last 1024B of 32KiB freely.

After OS loaded, memory layout will be:

+--------------------- 0x0| Interrupts vectors+--------------------- 0x400| BIOS data area+--------------------- 0x5??| OS load area+--------------------- 0x7C00| Boot sector+--------------------- 0x7E00| Boot data/stack+--------------------- 0x7FFF| (not used)+--------------------- (...)

That are the origin and reasons of "0x7C00", the magic number survived for about three decades in PC/AT Compat BIOS INT 19h handler.

 

  四、为什么RAM总不是为空的?
       因为在O/S执行之前,BIOS也会在RAM中创建中断表。(这就是为什么您可以按f2、f10或delete等键并进入BIOS设置。如果没有中断处理程序,您将无法执行此操作。)这就是RAM不为空的原因。即使是开始,RAM也不会为空。因此,它将无法使用0x00000。

 

References

86-DOS related:

  • "8086 Monitor Instruction Manual"(MON 86 - V1.4)
  • "86-DOS(TM) User's Manual Version 0.3"
  • "86-DOS(TM) Programmer's Manual Version 0.3"
  • "86-DOS(TM) Instruction Manual Version ??"

IBM PC 5150 related:

  • "IBM Personal Computer Hardware Reference Library", "Technical Reference" (IBM Personal Computer Technical Reference manual)
  • "IBM Personal Computer XT Hardware Reference Library", "Technical Reference" (IBM Personal Computer XT Technical Reference manual)

Intel 8086/8088 data sheets:

  • "8086 16-BIT HMOS MICROPROCESSOR"
  • "M80C86/M80C86-2 16-BIT CHMOS MICROPROCESSOR"
  • "8088 8-BIT HMOS MICROPROCESSOR"

CP/M related:

86-DOS related:

And all related Wikipedia pages.

Special Thanks To...

Special Thanks To:

  • Tim Peterson
  • David Bradley
for japanese article, see:
"Assembler/なぜx86ではMBRが"0x7C00"にロードされるのか?(完全版)"
http://www.glamenv-septzen.net/view/614
posted @ 2023-03-01 21:28  jinzi  阅读(23)  评论(0编辑  收藏  举报