计算机启动时为什么将MBR加载到的内存地址是0x7c00?

leewez 2007-12-09 09:49:32
我的意思是0x7c00 是一个偶然还是有什么必然的原因吗? 为什么不加载到别的地址如 0x7000 或者ox9000等等 谢谢回答
...全文
797 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hou_Rj 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 nosachow 的回复:]
系统启动过程主要由一下几步组成(以硬盘启动为例):

  1. 开机 :-)
  2. BIOS 加电自检 ( Power On Self Test -- POST )
    内存地址为 0ffff:0000
  3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)
    读入内存地址 0000:7c00 处.
  4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于
    则转去尝试其他启动介质, 如果没有其他启动介质则显示
    "No ROM BASIC" 然后死机.…
[/Quote]
顶上楼,但也不是完全乱选的区域,CPU被家电时,最初的1M内存空间的每一个字节都由BIOS安排好了:
0x00000-0x003ff:中断向量表
0x00400-0x004ff:BIOS数据区
0x00500-0x07bff:自由内存区
0x07c00-0x07dff:引导程序加载区
0x07e00-0x9ffff:自由内存区
0xa0000-0xbffff:显示内存区
0xc0000-0xfffff:BIOS中断处理程序区
希望这样可以更清楚一点。
当然,如果要问为什么这样安排,保证一定有深层的道理,只是汗颜我还没有参悟到。
xiston 2009-02-09
  • 打赏
  • 举报
回复
因为0x7c00以下的地址还有从BIOS加载进来的中断向量表,启动程序一般都要用到这个中断向量表,所以便规定从0x7c00开始,以免覆盖掉0x7c00以下的数据
wangxy200696 2008-04-02
  • 打赏
  • 举报
回复
顶一下
zmwgreenrain 2008-01-18
  • 打赏
  • 举报
回复
就是一个约定,不知道为什么。
就好像0x000b8000地址被用作显存地址映射一样,一个既定事实
zmwgreenrain 2008-01-18
  • 打赏
  • 举报
回复
就是一个约定,不知道为什么。
就好像0x000b8000地址被用作显存地址映射一样,一个既定事实
alan001 2008-01-17
  • 打赏
  • 举报
回复
学习楼上
xiao2003ran 2008-01-17
  • 打赏
  • 举报
回复
约定而已
其实BIOS将MBR调入内存7C00后交出系统控制权后,MBR又将自己写到600处,再将DBR写到7C00处。
nosachow 2008-01-16
  • 打赏
  • 举报
回复
系统启动过程主要由一下几步组成(以硬盘启动为例):

  1. 开机 :-)
  2. BIOS 加电自检 ( Power On Self Test -- POST )
    内存地址为 0ffff:0000
  3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)
    读入内存地址 0000:7c00 处.
  4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于
    则转去尝试其他启动介质, 如果没有其他启动介质则显示
    "No ROM BASIC" 然后死机.
  5. 跳转到 0000:7c00 处执行 MBR 中的程序.
  6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.
  7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动
    分区或有不止一个活动分区, 则转停止.
  8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.
  9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则
    显示 "Missing Operating System" 然后停止, 或尝试
    软盘启动.
  10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.
  11. 启动系统 ...

  以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10
步由MBR中的引导程序完成.


至于为什么计算机启动时为什么将MBR加载到的内存地址是0x7c00,这个没有必要去深究了,好多的东西都是约定好的,正如楼上的兄弟所说,IBM在当初制定好多规范,一直沿用下来,足见他的强大。

你想了解这一块的内容,可以看看int13,和int19的调用规则。
pig_xp 2008-01-16
  • 打赏
  • 举报
回复
当初IBM在设计PC时加载到7c00h,后来bios厂商为了兼容就约定了,再也没有改过
leewez 2008-01-10
  • 打赏
  • 举报
回复
楼上的能不能说得详细点? 我想了解这一块的内容 该看那些的资料? 谢谢
nosachow 2007-12-18
  • 打赏
  • 举报
回复
这是协议呀,在启动OS时是调用INT19的,Read O/S boot block in at 0000:7C00h and jumps to it.
robotom 2007-12-18
  • 打赏
  • 举报
回复
这是机器人自动发贴吗?
zhgwbzhd 2007-12-14
  • 打赏
  • 举报
回复
同意2楼
ShardowM 2007-12-14
  • 打赏
  • 举报
回复
标准
EFIBIOS 2007-12-14
  • 打赏
  • 举报
回复
觉得buaawr说的很正确
agaric 2007-12-12
  • 打赏
  • 举报
回复
约定。 标准。
fhb13 2007-12-12
  • 打赏
  • 举报
回复
必然
buaawr 2007-12-11
  • 打赏
  • 举报
回复
应该是约定,至少微软的系统我看到的都是这样,你想啊,一开机的时候,跑的BIOS由BIOS公司来写,之后运行的操作系统则是由微软等公司来写,这两个软件系统如何交接对CPU的控制权呢,当然就是通过7C00h了,MBR是操作系统写的,而从硬盘读取MBR以及拷贝到内存7C00H的动作由BIOS来完成,之后BIOS讲CPU的IP指针跳到7C00H(far jump 7c00h)来执行就完成了交接工作。就是这样
m60a1 2007-12-11
  • 打赏
  • 举报
回复
我在书里面没有看到过有这方面答案,也可能是我书看得比较少。
可能是楼上所说的那样吧,LZ可以跟踪一下,看看是否系统加载
前每次都到寻那个地址!
flypig_007 2007-12-09
  • 打赏
  • 举报
回复
是约定

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧