分类: LINUX
2009-05-24 23:27:13
------------------------------------------------
本文系本站原创,欢迎转载!
首先我们来讲下大致过程
1.当你按重启键时,机子从BIOS时运行,BIOS检测硬件。
2.BIOS将0头0道1扇区也就是MBR读入内存地址0x
3.MBR就是我们可以控制的了,这个也是分水岭。
如果我们安装window,window的安装程序就会将ntldr的pre_load填充到mbr,如果装linux,则将grub安装到mbr,其实这个还不是真正的引导程序。
下面将以先安装window时后,然后安装linux过程,来说明引导程序的变迁。
(1)首先说下硬盘的分区结构
首先硬盘的第一扇区是mbr,这个是所有程序的开端,然后是第一分区,在mbr和第一分区间有62的保留扇区,这个对GURB作用大了,但是对于window引导没有用处。
(2)当我们安装windows时,安装程序会做如下操作:
1。根据分区表填充MBR的分区表,且加载pre-boot到mbr。pre-boot作用分析:它就是根据pt找到活动分区,然后读取这个活动扇区的引导扇区即下面的setup,就是1,0,1(如果装在c就是c盘的第一个扇区,注意这个和mbr有62扇区的保留扇区)。
2。将能够识别具体文件系统的setup安装到活动分区的引导扇区,这里如果C盘是FAT格式的,那么就会将FAT文件系统的setup程序安装到这里,然后这个setup会加载跟目录下(c:/)的ntldr,ntldr就比较强大了。
2, 当加载NTLDR的时候系统仍然是处于实模式下.所以,NTLDR的第一件大事就是将CPU从实模式转换到保护模式下.当 NTLDR将所有的
3,NTLDR根据BOOT.INI的内容提示用户可选的操作系统.当用户在缺省的时间内没有选择.NTLDR就引导缺省的操作系统. (BOOTSECT.DOS是DOS引导扇区的COPY件.),引导DOS系统运行。
[boot loader]
timeout=3
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=AlwaysOff
C:\GRLDR="深度一键“
#下面是BOOT.INI的一些说明
[BOOT LOADER]即操作系统加载器,指定系统选择菜单默认等待时间和默认引导的操作系统。
OPERATING SYSTEMS]段指定操作系统列表,由双引号括起来的部分就是列表所显示的内容。
例如MULTI(0)DISK(0)RDISK(0)PARTITION(1)格式的语句被称为ARC路径,
它的格式为:
MULTI()——指定磁盘控制器(若为SCSI控制器,则此处应替换为SCSI());
DISK()——指定SCSI设备编号(对于MULTI该处值始终为0);
RDISK()——指定IDE设备编号(对于SCSI,此处被忽略);
PARTITION()——指定分区编号。
#除分区编号由1开始外,其余编号均从0开始。
参数:
FASTDETECT表示禁用串行鼠标检测,是系统默认值;
MAXMEM——指定Windows XP可用内存容量;
BASEVIDEO——使用标准VGA显示驱动程序;
NOGUIBOOT——启动过程中不显示图形屏幕;
SOS——加载设备驱动程序时显示其名称。
在操作系统选择菜单中的中文字体由位于活动分区根目录下的BOOTFONT.BIN文件提供。
小提示:NTLDR启动后,如果在系统根目录下发现有Hiberfil.sys文件且该文件有效,那么NTLDR将读取Hiberfil.sys文件里的信息并让系统恢复到休眠以前的状态,这时并不处理Boot.ini文件。
4, 若”深度一键“ 系统被选中,NTLDR加载grldr,然后将控制全交给grldr,这个也是一个引导器,如果你要用window引导器引导linux,这个grldr可以换成grubfordos即gruldr,这个文件有176kb,可想应该有很多功能了,能够识别出文件系统,估计也有网络功能(这个会读取跟目录下的menulist,如果没有则提供commandline ,find menulist,等选项,一段延时后会度/boot/grub/下的menulist,如果都没有就进入commandline方式。
5,若默认操作系统被选定.上面的multi(0)disk(0)rdisk(0)partition(1)\WINDOWS指定了内核的根目录,接下来被加载的2个文件组成了WINDOWSxp的核心.那就是:NTOSKRNL.EXE(NT系统内核),HAL.DLL(硬 件抽象层).这2个文件都在内核根目录的SYSTEM32文件夹下,它们在装载时将被检测PE校验和,如果有问题或找不到.NT会提示找不到文件.有一点要说明.单处 理器和多处理器的NTOSKRNL.EXE是不同的.加载完这2个文件后,NTLDR再加载所有引导必须的驱动程序,然后加载 HKEY_LOCAL_MACHINE\SYSTEM \Services里的值SERVICE_BOOT_START的DRIVER.(时不初始化.)。然后NTLDR就会锁定NTOSKRNL.EXE的 main()函数,然后将控制转移给NTOSKRNL.EXE.
6,NTOSKRNL.EXE开始装载并初始化设备驱动程序,以及启动WIN32子系统和WINDOWS XP服务。
7,开始登录进程。由WIN32子系统启动WINLOGON.EXE,并由它启动LOCAL SECURITY AUTHORITY(LSASS.EXE)显示登录对话框。用户登录后,WINDOWS XP会继续配置网络设备和用户环境。最后,伴随着微软之声和我们熟悉的个性化桌面,WINDOWS XP漫长的启动过程终于完成。
(3)然后现在开始装linux构成双系统平台。
装linux时就会采用grub引导系统,
1.装linux时,装window时填充的mbr中pre_boot就会被grub的stage1代替,不过grub的stage1和pre_boot不一样,stage1是去读取0头0道2扇区(而不是读取活动分区的引导扇区)然后闪人。。。0头0道2扇区的内容就是grub源代码里\stage2\start.s编译后也是一个512字节。。。stage1将start.s读入内存地址0x8000然后跳过去执行
2、start.s就是stage1.5 or stage2的入口。。。一般情况下stage2还是放在需要具体的文件系统下的。。。这个时候需要读取stage1.5。。。但是注意。。。这里的stage1.5不是/boot目录下的那些文件。。。你都能读取/boot目录了还要stage1.5干嘛。。。
所以这里的stage1.5是将/boot目录对应的分区格式的stage1.5文件复制到了0头0道3扇区开始向后的位置。。。,刚才说了mbr后面有62个保留扇区,stage1.5文件一般就10几k。。。够放了。。。
3。stage1.5这样就可以顺利的识别文件系统然后转入读取/boot/grub/stage2的运行了。。。stage2的入口在asm.S
4.下面来说说stage2。它负责显示启动菜单和提供用户交互接口,读取/boot/grub/menu.list并根据用户选择或默认配置加载操作系统内核。同前两个文件不同,stage2是存放在磁盘上/boot/grub下
title Ubuntu
root (hd0,7)
kernel /boot/vmlinuz-
initrd /boot/initrd.img-
quiet
title Ubuntu
root (hd0,7)
kernel /boot/vmlinuz-
initrd /boot/initrd.img-
# on /dev/sda1
title Microsoft Windows XP Professional
root (hd0,0)
savedefault
makeactive
chainloader +1 <--代表第一个sector从第一扇区启动
5.如果选择的是windows,那么就会读取活动分区的引导扇区,就是c盘的引导扇区,由于先装window,且装linux时只是填充mbr及c分区前的保留扇区,故c分区的引导扇区还是ntldr的部分(setup部分),这样就到了ntldr引导时的第二步,那么也就说交给了ntldr引导器,就变成window引导器。
6.如果是选linux则是读取initrd,和kernel然后运行,而不是加载分区的引导扇区。
注意:
活动分区的如果是fat,或nfs,这个分区的引导扇区,出了引导程序还有bpb数据引导扇区的前三个字节必须是合法的可执行的基于x86的CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。
跳转指令之后是8字节长的OEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。为了保留与MS-DOS的兼容性,通常Windows 2000格式化该盘是在FAT16和FAT32磁盘上的该字段中记录了“MSDOS
接下来的从偏移0x0B开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为BPB(BIOS Parameter Block),BPB一般开始于相同的位移量,因此,标准的参数都处于一个已知的位置。磁盘容量和几何结构变量都被封在BPB之中。由于引导扇区的第一部 分是一个x86跳转指令。因此,将来通过在BPB末端附加新的信息,可以对BPB进行扩展。只需要对该跳转指令作一个小的调整就可以适应BPB的变化。
DBR的偏移0x
DBR扇区的最后两个字节一般存储值为0x55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。上面提到的其他几个参与os引导的扇区也需以0x55AA为合法结束标志。
附带grub安装注意:
grub安装有三种方式:
setup
install
grub_install
grub_install其实是调用setup,所以可以看成一样。
通过install安装的没有stage1.5,读取stage2是通过stage2所在block读取的,所以即使文件删除后,由于只是删除i节点位图,数据还是在block上,所以还是可以运行
但是,如果是通过grub>install方式安装的grub,删除/boot/grub/stage2就没有问题,why?因为通过 grub>install安装grub,stage1是直接通过stage2所在的blocklist找stage2,我们删除或者改名 stage2文件,文件的存放位置是不变的,因此能找到。而通过grub-install脚本,或者grub>setup,会智能的找到相应的 stage1.5,例如:/grub/e2fs_stage1_5,然后通过stage1.5认识文件系统,是通过文件名去找stage2的,所以通过这 两种方式安装的grub,不可删除或者改名除/boot/grub/stage2。
也就是说如果用块号可以指出stage2文件的所在处,这样就没有文件系统的概念了