前言

本篇文章并不旨在完整的讨论一个多引导系统程序怎样去引导不同的操作系统,而只打算从编写操作系统的角度出发,谈谈计算机怎样从加电开始,从无到有,将操作系统运行起来,在其中将尽量详尽的描述从实模式到保护模式的过渡,目的只在于能将所学与广大爱好者更享,为希望开发操作系统的朋友留下一点资料,也为自己留下一点心得。本篇文章将以开发中的 pyos 系统引导程序为例,pyos 是一个正在开发中的实验型操作系统,它并不打算以目前任何一种运行中的操作系统为模式,而只想通过自己编写一个从头到尾的操作系统来学习知识,积累技术,如果你有兴趣,非常欢迎你的加入!本篇纯属学习过程中的一点心得体会,如果你发现其中有错误或不当之处,非常希望你来信指教。

一、计算机从加电开始都做了什么?

当机算机的电源键被按下时,同这个键相联的电信号线就会送出一个电信号给主板,主板将此电信号传给供电系统,供电系统开始工作,为整个系统供电,并送出一个电信号给BIOS,通知 BIOS 供电系统已经准备完毕。随后 BIOS启动一个程序,进行主机自检,主机

自检的主要工作是确保系统的每一个部分都得到了电源支持, 内器、 主板上的其它芯片、键盘、鼠标、磁盘控制器及一些 I/O 端口正常可用,此后,自检程序将控制权还给 BIOS。接下来 BIOS 读取 BIOS 设置,得到引导驱动器的顺序,然后依次检查,直到找到可以用来引导的驱动器(或说可以用来引导的磁盘,包括软盘、硬盘、光盘等) ,然后调用这个驱动器上磁盘的引导扇区进行引导。BIOS 是怎么知道或说分辨哪一个磁盘可以用来引导的呢?

二、认识引导程序

BIOS 将所检查磁盘的第一个扇区(512B)载入内存,放在 0x0000:0x7c00处(见图三) ,如果个扇区的最后两个字节是“55 AA” ,那么这就是一个引导扇区,这个磁盘也就是一块可引导盘。 通常这个大小为 512B 的程序就称为引导程序 (boot) 。 如果最后两个字节不是 “55AA” ,那么 BIOS 就检查下一个磁盘驱动器。通过上面的表述我可可以总结出如下三点引导程序所具有的特点:

1.  它的大小是 512B,不能多一字节也不能少一字节,因为 BIOS 只读 512B 到内存中去。

2.  它的结尾两字节必须是“55 AA” ,这是引导扇区的标志。

3.  它总是放在磁盘的第一个扇区上(0 磁头,0 磁道,1 扇区) ,因为 BIOS 只读第一个扇区。

因此,在我们编写引导程序的时候,我们也必须注意上面的三点原则,符合上面三点原则的程序都可以看作是引导程序,至少 BIOS 是这样认为的,虽然它也许可能是你随意写的一段并没有什么实际意义的代码。因为 BIOS 一次只读一个扇区也即 512 字节的数据到内存中,这显然是不够的,现在操作系统都比较庞大, 因此我们必须在引导扇区里将存在磁盘上的操作系统的核心部份读进内存,然后再跳转到操作系统的核心部分去执行。

三、通过 BIOS读磁盘扇区

从上面的描述我们可以知道,引导程序需要将存在于磁盘上的操作系统读入内存,因此这里我们不得不再讲一讲,怎样不通过操作系统(因为现在还没有操作系统)去读磁盘磁区。一般说来这有两种方法可以实现,一种是直接读写磁盘的 I/O 端口,一种是通过 BIOS中断实现。前一种方法是最低层的方法(后一种方法也是在它的基础上实现的) ,具有极高的灵活性,可以将磁盘上的内容读到内存中的任意地方,但编程复杂。第二种方法是前一种方法稍微高层一点的实现,牺牲了一点灵活性,比如,它不能把磁盘上的内容读到0x0000:0x0000 ~ 0x0000:0x03FF 处。为什么不能读到此处呢?这里我们将不得不描述一下CPU在加电后的中断处理机制。

3.1 BIOS 的中断处理

中断是什么,相信学过计算机的人都不会陌生,如果你对中断一点都不了解建议你翻看一下《计算机组成原理》 (高等教育出版社  唐朔飞) ,上面有非常详尽的描述,而一般的汇编教材也多有谈及,因此这里只打算讲讲 BIOS 对中断的处理。

由上图我们可以清楚的看到,当由中断信号产生时,中断信号通过“中断地址形成部件”产生一个中断向量地址,此向量地址其实就是指向一个实际内存地址的指针,而这个实际内存地址中往往按排一条跳转指令(jmp)跳转到实际处理此中断的中断服务程序中去执行。这一块专门用于处理中断跳转的内存就被称为中断向量表。在内存中这块中断向量表被

放在什么地方的呢?而实际的中断处理程序又在什么地方的呢?

3.2 系统的内存安排(1M)

要回答上面的两个问题,我们需要看看系统中内存是怎么安排的。在 CPU 被加点的时候,最初的 1M 的内存,是由 BIOS 为我们安排好了的,每一字节都有特殊的用处。

由上图我们现在可以很方便的问答上面提出的两个问题。由于 0x00000~0x003FF 是中断向量表所在,因此不能将磁盘从的操作系统读到此处,因为这样会覆盖中断向量表,就无法再通过 BIOS 中断读取磁盘内容了。你也许会说:我是先调用中断,再读的啊。但事实在BIOS 在读的过程中自己会多次调用其它中断辅助完成。

3.3 利用 BIOS 13 号中断读取磁盘扇区

有了前面的描述作为基础,下面我们可以正式描述怎样通过 BIOS 中断读取磁盘扇区了。要读取磁盘扇区,我们需要使用 BIOS 的 13 号中断,13 号中断会将几个寄存器的值作为其参数,因此,我们在调用 13 号中断的过程中需要首先设置寄存器。那么当怎样设置寄存器呢?会用到哪些寄存器呢?请往下看:

计算机系统启动的加点顺序是,操作系统引导探究相关推荐

  1. 一台pc计算机系统启动不了,电脑装系统引导不进去怎么办

    1. 电脑系统启动不了怎么办 电脑系统启动不了的原因: 1.操作系统文件损坏. 2.MBR表损坏. 3.硬盘数据线松了. 4.硬盘坏了. 解决方法: 1.重新安装操作系统. 2.用U盘或光盘引导,进入 ...

  2. 操作系统引导过程探究

    操作系统引导探究 Version 0.02修改记录: 对与GDT有关的段描述符方面的描述进行了修订,更正了上一个版本中出现的一些错误,增加了一些描述,使其更完善. 与上个版本中不同的地方均用红色标记. ...

  3. 操作系统引导--从实模式到保护模式

    从开始到保护--系统开机引导 ------没有一个文档能写的通俗易懂,我希望写出来. 开机引导和实模式: 两个星期加上假期吐血整理,所述为计算机的开机引导,其中包括一系列计算机内存设置等等,由于没有老 ...

  4. rhel系统启动过程_技术|Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  5. 哈工大操作系统——引导启动程序

    写在前面: 亲爱的小伙伴你们好,不知道你有没有在学习操作系统的过程中遇到过这样那样的困难,很多次想要放弃,很多次怀疑自己的能力,但是请你相信"未来的路就在脚下,不要悲伤,不要害怕" ...

  6. Linux——操作系统引导过程

    引导过程 一.Linux操作系统引导过程 1.1 引导过程讲解 1.2 init进程(CentOS6) 1.3 Systemd进程(CentOS7) 1.4 Systemd单元 1.5 运行级别对应的 ...

  7. 操作系统引导的那点事

    系统引导环节是操作系统启动过程中的最重要环节,也是最容易出问题的环节之一.按照个人计算机的硬件标准,引导环节发生在计算机的硬件系统检测完毕之后.具体的引导工作,是由BIOS完成的.BIOS维持一个可用 ...

  8. 详细图文演示——排除启动类故障以及Linux操作系统引导、运行级别和优化启动等相关知识

    详细图文演示--排除启动类故障以及Linux操作系统引导.运行级别和优化启动等相关知识 一.Linux操作系统引导过程 1.开机自检 2.MBR 引导 3.GRUB菜单 4.加载Linux内核 5.i ...

  9. Linux操作系统引导过程

    1.引导过程总览 1.开机自检 服务器主机开机以后,将根据主板BIOS中的设置对CPU (Central Processing Unit, 中央处理器).内存.显卡.键盘等设备进行初步检测,检测成功后 ...

最新文章

  1. c#dev tabcontrol 与嵌套gridcontrol 总结
  2. 基于.htaccess的Web Shell工具htshells
  3. LLVM笔记(5) - SMS
  4. windows 技巧篇-查看文件夹被那个进程占用,文件夹占用解除方法
  5. windows编译MaskRCNN
  6. Neo4j:Cypher –删除重复的节点
  7. Python 语言程序设计(5-3) 代码复用与函数递归
  8. postMessage可太有用了
  9. exclips为什么j创建局java出错_clips.BuildRule出错
  10. 主板术语详解一(转东转西)
  11. 英文G2P模块和标准-KbGit
  12. 关于WEB服务器硬件配置,你了解多少
  13. gitbook踩坑指南-无法转pdf、epub等;pdf调字体大小
  14. [HEVC] HEVC学习(五) —— 帧内预测系列之三
  15. HDU - 4598 Difference
  16. Python实现当中秋遇上国庆
  17. 【语音识别】语言模型LM
  18. 开源的悲哀——袁萌100天变身实录[3]
  19. python 日期格式月份不加前导,Python datetime时间格式化去掉前导0
  20. 番茄工作法总结-第三章:方法

热门文章

  1. (一二四)给类对象赋值、以及类对象的返回值
  2. expect实现配置机器信任关系
  3. 脑波技术来袭,人类hold住吗?
  4. Fedora和Red Hat Enterprise Linux实用指南(第6版)(套装上下册)火热上市!!!!
  5. android通过ContentProvider 取得电话本的数据
  6. NO.47 确定项目要完成的需求列表
  7. Hyper-V的安装准备
  8. enum枚举类型的范例
  9. Math类的三个方法比较: floor() ceil() round()
  10. 一起学爬虫——如何爬取通过ajax加载数据的网站