Chinaunix首页 | 论坛 | 博客
  • 博客访问: 507526
  • 博文数量: 95
  • 博客积分: 5168
  • 博客等级: 大校
  • 技术积分: 1271
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-28 23:31
文章分类

全部博文(95)

文章存档

2013年(2)

2012年(3)

2011年(1)

2010年(8)

2009年(81)

分类: LINUX

2009-05-24 23:27:13

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

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

首先我们来讲下大致过程

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

2.BIOS001扇区也就是MBR读入内存地址0x7c00处。。。然后检查0x7dfe是否等于0xaa55WORD)确认是有效MBR后开始执行。

3.MBR就是我们可以控制的了,这个也是分水岭。

   如果我们安装windowwindow的安装程序就会将ntldrpre_load填充到mbr,如果装linux,则将grub安装到mbr,其实这个还不是真正的引导程序。

 

下面将以先安装window时后,然后安装linux过程,来说明引导程序的变迁。

 

(1)首先说下硬盘的分区结构

 

首先硬盘的第一扇区是mbr,这个是所有程序的开端,然后是第一分区,在mbr和第一分区间有62的保留扇区,这个对GURB作用大了,但是对于window引导没有用处。

 

(2)当我们安装windows时,安装程序会做如下操作:

 

1。根据分区表填充MBR的分区表,且加载pre-bootmbrpre-boot作用分析:它就是根据pt找到活动分区,然后读取这个活动扇区的引导扇区即下面的setup,就是1,0,1(如果装在c就是c盘的第一个扇区,注意这个和mbr62扇区的保留扇区)

2。将能够识别具体文件系统的setup安装到活动分区的引导扇区,这里如果C盘是FAT格式的,那么就会将FAT文件系统的setup程序安装到这里,然后这个setup会加载跟目录下(c:/)ntldr,ntldr就比较强大了。

2, 当加载NTLDR的时候系统仍然是处于实模式下.所以,NTLDR的第一件大事就是CPU从实模式转换到保护模式. NTLDR将所有的1M以下的内存页描述符创建好后,NTLDR再开启页映射功能,现在NT可以访问4G内存了.然后,NTLDR通过内建的文件系统代码来查找根目录下的BOOT.INI.(NTLDR,FATNTFS2种文件系统的只读代码)

3,NTLDR
根据BOOT.INI的内容提示用户可选的操作系统.当用户在缺省的时间内没有选择.NTLDR就引导缺省的操作系统. (BOOTSECT.DOSDOS引导扇区的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可以换成grubfordosgruldr,这个文件有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_STARTDRIVER.(时不初始化.)然后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时填充的mbrpre_boot就会被grubstage1代替,不过grubstage1pre_boot不一样,stage1是去读取002扇区(而不是读取活动分区的引导扇区)然后闪人。。。002扇区的内容就是grub源代码里\stage2\start.s编译后也是一个512字节。。。stage1start.s读入内存地址0x8000然后跳过去执行
 

2、start.s就是stage1.5 or stage2的入口。。。一般情况下stage2还是放在需要具体的文件系统下的。。。这个时候需要读取stage1.5。。。但是注意。。。这里的stage1.5不是/boot目录下的那些文件。。。你都能读取/boot目录了还要stage1.5干嘛。。。
所以这里的stage1.5是将/boot目录对应的分区格式的stage1.5文件复制到了003扇区开始向后的位置。。。,刚才说了mbr后面有62个保留扇区,stage1.5文件一般就10k。。。够放了。。。

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时只是填充mbrc分区前的保留扇区,故c分区的引导扇区还是ntldr的部分(setup部分),这样就到了ntldr引导时的第二步,那么也就说交给了ntldr引导器,就变成window引导器。

6.如果是选linux则是读取initrd,kernel然后运行,而不是加载分区的引导扇区。

 

注意:

    活动分区的如果是fat,或nfs,这个分区的引导扇区,出了引导程序还有bpb数据引导扇区的前三个字节必须是合法的可执行的基于x86CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。
   
跳转指令之后是8字节长的OEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。为了保留与MS-DOS的兼容性,通常Windows 2000格式化该盘是在FAT16FAT32磁盘上的该字段中记录了“MSDOS 5.0”,在NTFS磁盘上(关于ntfs,另述)Windows 2000记录的是“NTFS”。通常在被Windows 95格式化的磁盘上OEM ID字段出现“MSWIN4.0”,在被Windows 95 OSR2Windows 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 建的操作系统如果是win2000winxp,系统会使用基本分区的第0扇区和第0xC扇区(win2000winxp,其第0xC的位置由第0扇区 0xAB偏移指出)存储os引导代码。所以,在fat32分区格式上,如果DBR一扇区的内容正确而缺少第2扇区(win98系统)或第0xC扇区 (win2000winxp系统),系统也是无法启动的。如果自己手动设置NTLDR双系统,必须知道这一点。
     DBR
扇区的最后两个字节一般存储值为0x55AADBR有效标志,对于其他的取值,系统将不会执行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安装grubstage1是直接通过stage2所在的blockliststage2,我们删除或者改名 stage2文件,文件的存放位置是不变的,因此能找到。而通过grub-install脚本,或者grub>setup,会智能的找到相应的 stage1.5,例如:/grub/e2fs_stage1_5,然后通过stage1.5认识文件系统,是通过文件名去找stage2的,所以通过这 两种方式安装的grub,不可删除或者改名除/boot/grub/stage2

也就是说如果用块号可以指出stage2文件的所在处,这样就没有文件系统的概念了

阅读(1875) | 评论(0) | 转发(0) |
0

上一篇:mini2440 gdb远程调试

下一篇:djyos操作系统

给主人留下些什么吧!~~