打印

关于系统引导过程的几个疑问

关于系统引导过程的几个疑问

http://www.linuxfans.org/bbs/thread-5880-1-46.html上面,有系统的引导过程如下:

1、开机
2、BIOS加电自检(Power On Self Test 缩写为POST),此时的内存地址为0FFFF:0000
3、将硬盘0头0磁道1扇区,即BOOT SECTOR 读入内存0000:7C00处
4、检查0000:7DFE是否等于0xAA55,若不等于,则转而引导其它介质,若无其它介质,则死机
5、跳转到0000:7C00处执行MBR中的程序
6、MBR首先将自己复制到0000:0600处
7、在主分区表中搜索标志为活动的分区,若搜索失败(没有活动分区或不只一个活动分区),则停止
8、将活动分区的第一个扇区读入内存的0000:7C00处
9、检查0000:7DEF是否等于0xAA55,若不等于,则显示“Missing Operating System”后停止或从软盘启动
10、跳转到0000:7C00处继续执行特定的启动程序
11、启动系统
其中:2、3、4、5由BIOS引导程序完成,6、7、8、9、10由MBR中的引导程序完成

这里有几个疑问:
1、第2步中,“此时的内存地址为0FFFF:0000”是不是说“因为程序要放入内存中再执行,所以应该是:硬件电路将BIOS中ROM的程序加载到内存地址0FFFF:0000处,然后执行”?这里又有个问题:如果内存不够,就没有地址0FFFF:0000,那怎么将程序加载到0FFFF:0000呢?
2、第7步中,“若搜索失败,则停止”这个地方不懂,有多个活动分区则应该要用户选择一个吧?

TOP

哦,谢谢万能的涛哥!

现在还有几个问题:
1、linux源码的head.S代码编译后是生成的原始二进制文件吧?然后将生成的二进制代码写入硬盘的MBR中?我这样想是因为:linux源码中启动部分的代码中,没有使用像intel汇编一样的org 07c0h这样的伪指令来指定将程序加载到0x7c00的位置执行。如果编译成原始二进制文件后,直接将要执行的代码写到MBR它就会直接被加载到0x7c00位置执行,这样就不要指定加载到0x7c00了。
2、MBR中只有446字节来存放可执行的代码;现在linux一般都是用grub来引导,只要MBR中的代码加载部分grub,将跳转到grub的代码就可以过渡到grub了。但是,我曾经在计算机上装了windows和linux,在windows下删除linux分区并格式化后,没有用fdisk /mbr来修复MBR,这样,重启后就连windows都不能引导了。这里有一个问题:既然MBR只有446字节存放代码,应该不可能装得下grub的所有代码,那在windows中删除linux后,只有MBR部分不是windows的了,那grub怎么可能会还有呢,我的意思是MBR中应该只能加载grub部分代码,这样会使grub都没办法全部启动,怎么还可能提供windows的启动配置后,还可以启动windows呢?难道说grub的引导系统那部分的核心程序包含在那446字节中了?那也太小了吧。如果不是,那grub的代码包含在哪呢?

[ 本帖最后由 zz_6_3 于 2010-12-9 13:20 编辑 ]

TOP

额,涛哥回答得真够犀利的啊 膜拜一下

看样子我还要找资料仔细研究研究。不过这方面的资料不好找啊,网上垃圾一大堆

TOP

打算过几天自己台机子,就不用用公司这慢得死的机子了。搞翘了的话,装个VS要花N久时间,还有SQL Sever也要好久,并且不一定装得好。在自己机子上装个虚拟机,想咋弄咋弄

用dd把数据读出来,还要搞个东西反汇编什么的吧,要不然搞出一堆数字也看不懂。有好的反汇编器推荐没?

linux里面应该有,但没用过。我先找找看

[ 本帖最后由 zz_6_3 于 2010-12-10 13:35 编辑 ]

TOP