Chinaunix首页 | 论坛 | 博客

  • 博客访问: 134641
  • 博文数量: 46
  • 博客积分: 2310
  • 博客等级: 大尉
  • 技术积分: 505
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-18 19:13
文章存档

2011年(14)

2010年(32)

我的朋友

分类: LINUX

2010-03-16 16:04:57

 
PC加电后X86CPU自动进入实模式,并从地址0XFFFF0处开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址。PC机的BIOS将执行某些系统的检测,并从物理地址0处开始初始化中断向量。此后,它将可启动设备的第一个扇区(磁盘引导扇区,512字节)读入内存绝对地址0X7C00处,并跳转到这个地址。启动设备通常是软驱伙食硬盘。
 
Linux0.11最前面的部分是用8086汇编语言编写的,它有?BIOS入内存绝对地址0X7c00处(31KB)。当她被执行时,他就会把自己移动到内存绝对地址0x90000(576KB)处,并把启动代码setup.s度入到内存0X90200处(2KB大小)。
bootsect.s代码是磁盘引导块程序,驻留在磁盘的第一个扇区中0磁道,0磁头,第一个扇区。PC加电ROM BIOS自检之后,ROM BIOS会把引导扇区代码bootsect.s加载到内存地址)0X7c00开始并执行之。在bootsect代码执行期间,它会把自己移动到内存绝对地址0X9000开始出并继续执行。该程序的主要作用是首先把从磁盘第2个扇区开始的4个扇区的setup模块(由setup.s编译生成)加载到内存紧接着bootsect后面位置处(0x90200),然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数,接着在屏幕上显示“loading system”字符串。再者把磁盘上setup模块后面的system模块加载到内存0x10000开始的地方。随后确定根文件系统的设备号,若没有指定,则根据所保存的引导盘的每个磁道扇区数判别出盘的类型和种类(是1.44M A盘吗?)并保存其设备号与root_dev (引导块的508地址处),最后长跳转到setup程序的开始出(0x90200)执行setup程序。在磁盘上,引导块、setup模块和system模块的扇区位置和大小示意图如下所示。
 
从硬盘启动系统,通常需要使用其他多操作系统引导系统加载,例如Shoelace、LILO或Grub等操作系统引导程序。此时bootsect.s所完成的任务会由这些程序来完成,bootsect程序就不会被执行了。因为如果从硬盘启动系统,那么内核映像文件Image会存放在活动分区的根文件系统中。因此你就需要知道内核映像文件Image处于文件系统中的位置以及时什么文件系统,即你的引导扇区程序需要能够识别并访问文件系统,并从中读取内核映像文件。
从硬盘启动的基本流程是:系统上电后,可启动硬盘的第一个扇区(主引导记录MBR-Master Boot Record)会被BIOS加载到内存Ox7c00处并开始执行。该程序首先把自己向下移动到内存0x600处,然后根据MBR中分区表信息所指明活动分区中的第一个扇区(引导扇区)加载到内存0X7c00处,然后开始执行之。如果直接使用这种方式来引导系统就会碰到这样一个问题,即根文件系统不能与内核映像文件Image共存。
 
 
阅读(1771) | 评论(0) | 转发(0) |
0

上一篇:Linux内核代码

下一篇:setup.s程序

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