您的位置:首页 > 其它

[我的操作系统,我多年的梦] 艰难的启动过程(二)

2009-02-13 11:10 85 查看

     操作系统从诞生的一天起就肩负着管理硬件、软件的重大使命,所以我们写的迷你操作系统也要具有这个能力。今天就说说这个操作系统的设计。
    操作系统启动前,计算机是由BIOS(Basic Input&Output System,基本输入输出系统)把持的,BIOS在进行完计算机硬件的简单自检后,会初始化处理器并在内存中存放一些基本数据。这些过程包括扫描内存、初始化I/O、初始化实模式下的中断系统、在内存中存放硬件信息的描述表以备操作系统取用(比如SMP系统中,BIOS会在内存中放置MP Float Table,这个我们会在后面的章节结合APIC以及PCI总线进行详细说明)。扫描所有可启动介质(比如硬盘)并在发现启动代码后将代码传送到内存的 0x07c00 处。最后BIOS走下舞台,将处理器的CS和IP寄存器指向0x0:0x7c00,这样OS启动时的第一条指令所在内存位置就是 0x07c00,这正是bios从启动介质传送来的引导代码的入口。从此以后,计算机就由OS来统一管理。
    这个具体的引导过程或原理,于渊的《自己动手写操作系统》中写的很清楚了,我不愿意在这里多说(懒得打字),而且以后我们会随着代码进行简单的分析。十分急迫想知道的朋友去 google上百度一下也会很容易的发现好多资源。
    那么OS接过控制权之后都做什么呢?是怎样一个流程呢?我不知道Windows是怎么做的,Linux的内核超级庞大,估计也很少有朋友能完整看完(如果你研究完了Linux内核,建议你别往下看了,你肯定比我理解得深入),那我就简单分步说说我的这个操作系统设计的启动过程,有些步骤在以后的章节中你会发现我并没有实际实现,不过没关系,let's keep it simple。可能我的整个启动过程和别的系统不大一样,以后你就会发现我的用意了:
    boot:(启动代码,又bios复制到0x07c00,最多512B)
    1、初始化实模式下数据段(ds)、扩展段(es),建立堆栈环境
    2、读入内存信息
    3、通过int 13h(bios 中断)装入loader
    4、加载GDT(Global Descriptor Table, 全局描述符表),为跳入保护模式做准备
    5、关闭中断并打开A20地址线(A20后面会有一节专门介绍)
    6、切换到保护模式
    7、长跳转到loader入口并正式进入保护模式
    loader:(系统初始化及内核装入程序,loader由boot负责装入内存)
    1、初始化保护模式下的各种段,并为 BSP(Boot Strap Processor,引导处理器,在多处理器系统中负责引导的处理器,在引导过程中其他处理器要处于睡眠状态)初始化栈空间
    2、启动内存分页机制(在我们的系统中没有起用,因为我写这个操作系统的目的是做一台防火墙,不需要页面管理)
    3、扫描MP Float Table,得到基本硬件信息
    4、初始化保护模式下的中断系统
    5、读取CPUID指令返回的数据,确定CPU支持的操作
    6、初始化Cache
    7、将BSP的信息记录在特定(自己指定)的内存地址,以备多处理器启动后使用
    8、将GDT搬到1M以外,并重新加载
    9、关闭8259A并切换到APIC模式
    10、初始化PCI总线,扫描所有PCI设备
    11、初始化RTC(Real Time Controllor,实时时间控制器),得到当前时间、日期
    12、初始化记时器(现代PC提供了很多种记时方式,在以后的章节详细展开)
    13、估测CPU工作频率
    14、检查所有IDE控制器,找到计算机挂载的硬盘
    15、扫描各硬盘分区,并找出系统启动程序(boot)所在分区(知道自己从哪里出生的)
    16、为每个处理器装入各自的内核和启动程序
    17、广播启动通知,唤醒各处理器
    18、等待所有处理器启动完成,跳入各自的内核执行。
    kernel:(每个处理器一个)
    1、初始化中断系统
    2、装载需要的设备的启动程序
    3、执行各自的工作任务
    这个过程进行完,整个系统启动就告完成。至于再往后的任务调度等就相对简单了。好了,今天就写到这里,上自习去了...

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: