打印

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

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

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、我记得这是虚构地址,bios启动部分过程是在bios的epprom中运行的。自检某步骤后,才会吧bios读到内存中继续运行。
2。mbr里面才446字节的程序存储空间。没那么多地方放这些功能代码。多个活动空间属于分区数据错误。但mbr里面的程序应该是启动第一个。不过这文章写的内容是msdos/windows的mbr启动。grub不是这么做的。

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

1、如果没记错,linux内核根本没有任何启动功能。包括将自己读入内存的特殊启动区域的功能都没有(具体什么位置忘了)。linux必须由grub或者别的bootloader读取到内存并且运行他才行,head.s 好像是内核被运行后初始化环境的最开始的代码,内核里面的启动过程我没研究过。
2、grub分stage1,stage1.5,stage2,这里面有几步是通过硬盘绝对地址读取的代码。而且mbr之后还有几个扇区的未定义扇区可以用(硬盘好像分配分区空间不是按扇区的,而是16k或者什么数量来分)。所以删除并且快速格式化分区有的时候不会弄死grub。具体这要看格式化的改写的内容了。

TOP

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

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

TOP

其实 GRUB 的问题你用虚拟机就能试出来。dd 命令的应该够你尝试用了。

TOP

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

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

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

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

TOP