Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1454067
  • 博文数量: 150
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 3415
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 10:30
个人简介

游戏后台开发

文章分类

全部博文(150)

文章存档

2020年(1)

2019年(4)

2017年(3)

2016年(6)

2015年(4)

2014年(45)

2013年(86)

2012年(1)

分类: LINUX

2012-11-26 20:34:19

 从开机到mian函数的执行分三步完成,其目的是从启动盘加载操作系统程序,完成执行main函数所需要的准备工作。第一步,启动BIOS,准备实模式下的中断向量表和中断服务程序;第二部,从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步中准备的中断服务程序实现的;第三部,为执行32位的main函数做过度工作。

    1.启动BIOS,准备实模式下的中断向量表和中断服务程序

    计算机的运行时离不开程序的。然而,加电的一瞬间,计算机的内存中,准确地说是RAM中,什么程序也没有。硬盘里虽然有操作系统程序,但CPU的逻辑电路设计为只能运行内存中的程序,它没有能力直接从硬盘运行操作系统。如果要运行硬盘中的操作系统,必须将软盘中的操作系统加载到内存中。

    1.1.1 BIOS的启动原理

    在了解BIOS是如何将操作系统程序加载到内存中之前,先来了解一下BIOS程序自身是如何启动的。

    行体系的角度看,不难得出这样的结论:既然软件方法不可能执行BIOS,那就只能靠硬件方法完成了。

    从硬件角度看,80X86系列的CPU可以分别在16位实模式和32为保护模式下运行。为了兼容,也为了解决最开始的启动问题,80X86系列CPU的硬件都设计为加电即进入16位实模式状态运行。同时,CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xF000,IP的值置为0xFFF0,这样CS:IP就指向0xFFFF0这个地址位置。如果计算机加电之后这个位置没有可执行代码,那计算机就此死机。反之,如果这个位置有可执行代码,计算机将从这里的代码开始,沿着后续程序一直执行下去。BIOS程序的入口地址就是0xFFFF0,也就是说,BIOS程序的第一条指令就设计在这个位置。

    1.1.2 BIOS在内存中加载中断向量表和中断服务程序

    BIOS程序在内存最开始的位置0x00000用1KB的内存空间0x00000-0x003FF构建中断向量表,并在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400-0x004FF),在大约56KB以后的位置(0x0E2CE)加载了8KB左右的中断向量表相应的若干中断服务程序。中断向量表中有256个中断向量,每个中断向量占4个字节,其中两个字节是CS的值,两个字节是IP的值,每个中断向量都指向一个具体的中断服务程序。

    然后利用这些中断服务程序把系统内核从硬盘加载至内存。

    (中断向量表:实模式中断机制的重要组成部分,表中记录所有中断号对应的中断服务程序的内存地址)

    (中断服务程序:通过中断向量表中的索引对中断进行响应服务,是一些具有特定功能的程序)

    1.2 加载操作系统内核程序并为保护模式做准备

    从现在开始就要执行真正的boot操作了,即把软盘中的操作系统程序加载至内存。对于Linux0.11操作系统而言,计算机将分三批次逐次加载操作系统代码。第一批由BIOS中断int0x19把第一扇区bootsect的内容加载到内存;第二批和第三批在bootsect的指挥下,分别把其后的四个扇区和随后的240个扇区的内容加载至内存。

    1.2.1 加载第一部分代码-引导程序(bootsect)

    计算机硬件体系结构的设计与BIOS联手操作,会使CPU接收到一个int 0x19中断,CPU接收到这个中断后,会立即在中断向量表中找到int 0x19中断向量。接下来,中断向量把CPU指向0x0E6F2,这个位置就是int 0x19想对应的中断服务程序的入口地址,即“启动加载服务程序”的入口地址。这个中断服务程序的左右就是把软盘的第一个扇区的程序加载到内存中的指定位置。这个中断服务程序的功能是BIOS事先设计好的,代码是固定的,与Linux操作系统无关,无论Linux0.11的内核是如何设计的,这段BIOS程序所要做到就是“找到软盘”并“加载第一扇区”。其余的它什么都不知道,也不必知道。

   按照上面的规则,int 0x19中断向量所指向的中断服务程序(即启动加载服务程序)将软驱0号磁头对应盘面的0磁道1扇区的内容拷贝至内存0x07C00处。这个扇区里的内容就是Linux0.11操作系统的引导程序,也就是bootsect,其作用就是陆续把硬盘中的操作系统程序载入内存。这样制作的第一个扇区就称为启动扇区。第一扇区程序载入标志着Linux0.11操作系统中的代码即将发挥作用了。

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

上一篇:没有了

下一篇:未决信号与信号阻塞

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