文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>GRUB系统引导全分析

GRUB系统引导全分析

时间:2009-05-24  来源:sjj0412

------------------------------------------------
本文系本站原创,欢迎转载!

转载请注明出处:http://sjj0412.cublog.cn/ ------------------------------------------

首先我们来讲下大致过程

1.当你按重启键时,机子从BIOS时运行,BIOS检测硬件。

2.BIOS将0头0道1扇区也就是MBR读入内存地址0x7c00处。。。然后检查0x7dfe是否等于0xaa55(WORD)确认是有效MBR后开始执行。

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将所有的1M以下的内存页描述符创建好后,NTLDR再开启页映射功能,现在NT可以访问4G内存了.然后,NTLDR通过内建的文件系统代码来查找根目录下的BOOT.INI.(NTLDR,有FAT和NTFS2种文件系统的只读代码)

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 8.04.2, kernel 2.6.24-24-generic

root        (hd0,7)

kernel            /boot/vmlinuz-2.6.24-24-generic root=UUID=34798c5d-4985-4628-98cd-17aab6ad53d4 ro quiet splash locale=zh_CN

initrd              /boot/initrd.img-2.6.24-24-generic

quiet

 

title         Ubuntu 8.04.2, kernel 2.6.24-24-generic (recovery mode)

root        (hd0,7)

kernel            /boot/vmlinuz-2.6.24-24-generic root=UUID=34798c5d-4985-4628-98cd-17aab6ad53d4 ro single

initrd              /boot/initrd.img-2.6.24-24-generic

 

 

# 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 5.0”,在NTFS磁盘上(关于ntfs,另述),Windows 2000记录的是“NTFS”。通常在被Windows 95格式化的磁盘上OEM ID字段出现“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁盘上OEM ID字段出现“MSWIN4.1”。
    接下来的从偏移0x0B开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为BPB(BIOS Parameter Block),BPB一般开始于相同的位移量,因此,标准的参数都处于一个已知的位置。磁盘容量和几何结构变量都被封在BPB之中。由于引导扇区的第一部 分是一个x86跳转指令。因此,将来通过在BPB末端附加新的信息,可以对BPB进行扩展。只需要对该跳转指令作一个小的调整就可以适应BPB的变化。

     DBR的偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00开始的跳转指令所指向的。在图8所列出的偏移0x00~0x02的跳转指令"EB 58 90"清楚地指明了OS引导代码的偏移位置。jump 58H加上跳转指令所需的位移量,即开始于0x5A。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。大多数的资料上都说win98, 构建于fat基本分区上的win2000,winxp所使用的DBR只占用基本分区的第0扇区。他们提到,对于fat32,一般的32个基本分区保留扇区 只有第0扇区是有用的。实际上,以FAT32构建的操作系统如果是win98,系统会使用基本分区的第0扇区和第2扇区存储os引导代码;以FAT32构 建的操作系统如果是win2000或winxp,系统会使用基本分区的第0扇区和第0xC扇区(win2000或winxp,其第0xC的位置由第0扇区 的0xAB偏移指出)存储os引导代码。所以,在fat32分区格式上,如果DBR一扇区的内容正确而缺少第2扇区(win98系统)或第0xC扇区 (win2000或winxp系统),系统也是无法启动的。如果自己手动设置NTLDR双系统,必须知道这一点。
     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文件的所在处,这样就没有文件系统的概念了

相关阅读 更多 +
排行榜 更多 +
保卫萝卜4内购正式版

保卫萝卜4内购正式版

休闲益智 下载
变身快快跑

变身快快跑

休闲益智 下载
丰新教育

丰新教育

学习教育 下载