本章从计算机系统的启动过程讲起,一步一步引导你制作引导盘,并用引导盘启动计算机系统。内容包括计算机系统的启动过程介绍,开发环境的搭建以及引导盘的制作与启动。
冯·诺依曼型计算机的基本工作原理可以概括为两句话:存储程序,程序控制。存储程序是指用户将解决问题的过程以程序的形式存储在计算机的存储器中;程序控制是指计算机所做的所有事情都是通过 CPU(central processing unit,中央处理器)执行程序来实现的。因此,一个计算机系统的硬件只要有 CPU 和内存,这个计算机系统就可以工作了,其中内存负责存储程序,CPU 负责执行程序。这也是为什么把 CPU 和内存称为主机的原因。
计算机系统一上电,CPU 就开始执行程序,CPU 执行程序的过程就是从内存中取出一条指令,然后执行这条指令,然后再取下一条指令,然后再执行这条指令,……,循环往复,直至关机。理论上讲,CPU 只会一条指令接一条指令的执行程序,其他什么都不会干。
CPU 要执行的程序必须存放到计算机系统的内存中。内存主要由 RAM(Random Access Memory,随机访问存储器)存储器组成,RAM 的特点是随机访问(方便的读和写)和易失性(断电会丢失所有数据)。因此,系统上电的瞬间,CPU 是不能从 RAM 里取指令的(因为此时 RAM 里没任何东西),但 CPU 却要执行程序,怎么办呢?
解决的办法就是内存有一小部分是由 ROM(Read Only Memory,只读存储器)存储器组成的,ROM 的特点是只读(不能随便的写)和非易失性(断电也不会丢失数据)。计算机出厂前,厂家就在 ROM 存储器中事先存放了一段程序,这就是著名的 BIOS(Basic Input Output System,基本输入输出系统)程序。BIOS 永久的保存在内存的 ROM 区域,不会受到计算机系统是否断电的影响。
因此,计算机系统一上电,CPU 首先会从内存的 ROM 处执行 BIOS 程序,开始计算机系统的启动过程。那么一开始 CPU 执行 BIOS 都做了什么事呢?首先 BIOS 从 CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体)中读取系统的各种参数对系统进行最初的设置,包括系统时间、引导顺序、芯片配置等。CMOS 属于 RAM,由主板上的纽扣电池供电,用户可以在系统启动时按特殊键进入 CMOS修改这些配置参数。老旧的计算机系统不能正常启动,部分原因就是主板上的纽扣电池没电了,导致 CMOS 中系统参数紊乱。
然后 BIOS 对计算机系统进行自检,即 CPU 通过执行 BIOS 中的上电自检程序 POST(Power On Self Test)来检查计算机系统的各硬件部分是否能正常运行,包括 CPU、内存、键盘、显示器等。
最后 BIOS 开始引导操作系统,即 CPU 通过执行 BIOS 中的引导程序把操作系统从某个外存(软盘、硬盘、光盘、U 盘等)设备上加载到内存中。需要强调一点的是 BIOS 除上述功能外,还为用户提供了基本的输入输出系统调用,即用户可以通过调用 BIOS 里的各种子程序来实现对底层硬件的基本操作,比如如何获取按键值、如何操作显示器和读写磁盘等。应该说,没有这些底层的、基本的代码支持,直接在硬件上编写程序,对你我来说,几无可能!
总结一下,BIOS 由自检程序、引导程序、一些可被调用的子程序和系统参数组成。
一般情况下,操作系统被安装在计算机系统的硬盘上。硬盘上 0 柱面 0 磁头的第一个扇区存储的信息,称为主引导记录MBR(master boot record)。512 字节的 MBR 里,首先是一段 446 字节的引导代码,这段代码负责把操作系统从硬盘读入到内存中,然后是 64 字节的分区记录表,最后是 2 字节的特殊标记。因此,从硬盘上加载操作系统的大致过程是这样的:首先,CPU 通过执行 BIOS 中的引导程序把 MBR 读入到内存中,然后 CPU 通过执行MBR 中的引导代码把操作系统读入到内存中,最后 CPU 执行内存中的操作系统,从而实现对计算机系统的管理。当操作系统接管了计算机系统之后,你就可以通过操作系统方便、轻松地使用计算机系统。比如你可以轻松地使用键盘和鼠标;你也可以方便地通过点击各文件夹来访问非常复杂的硬盘系统;你更可以利用操作系统提供的各种子程序写出自己的各种应用程序。
也可以把操作系统安装在计算机系统的其他外部存储设备上,比如软盘、光盘、U 盘等,加载过程都是相似的。本教材选择把我们自己写的操作系统安装在软盘上。
如下图,图中①②③表示执行顺序,把 MBR 从外存加载到内存这件事由 CPU 执行 BIOS 完成,把 OS从外存加载到内存这件事由 MBR 完成。
软件链接:https://pan.baidu.com/s/1YUKdTrmw0K4dTaS8ZvQrMQ?pwd=rdxy
提取码:rdxy
--来自百度网盘超级会员V2的分享
注意:NASM需要配置环境变量
在Hex Editor Neo中新建文件,改变其大小为1440KB,并保存为A.img
ORG 0x7c00
start: JMP entry
entry: MOV AX,0
MOV SS,AX
MOV DS,AX
MOV ES,AX
MOV SP,0x7c00
MOV SI,msg
putloop: MOV AL,[SI]
ADD SI,1
CMP AL,0
JE fin
MOV AH,0x0e
MOV BX,0x0f
INT 0x10
JMP putloop
fin: HLT
JMP fin
msg: DB "hello, world!"
marker: TIMES (0x01fe-marker+start) DB 0
DB 0x55, 0xaa
在记事本中编写以上 8086 汇编语言程序,将其命名为 mbr.asm,这段代码很短,其功能就是在屏幕上显示“hello world!”字符串,然后让系统死循环。
由于mbr.asm 不能被 CPU 执行,所以需要汇编成机器语言代码才能执行。
进入该文件所在目录,执行下述命令
nasm 文件名.asm -o 生成的文件名.bin
注意:没提示才算成功
生成的mbr.bin 就是 MBR,接下来需要把 MBR 写入 A.img,由前面可以知道,MBR 就在 A.img 的最前面。
首先,在Hex Editor Neo 编辑器中打开 mbr.bin,用Ctrl+A选择全部内容,然后点击右键,复制;
然后,在Hex Editor Neo 编辑器中打开 A.img,将复制到的mbr.bin内容粘贴到A.img的第一个字节。(下面两张图就是A.img)
效果如下。
最后,需要注意的是下图所框的0x55AA 是一个“签名字”。它用作 512 字节引导记录的最后 2 个字节中的“扇区结束”标记。这包括 MBR 和它的扩展引导记录以及较新的 GPT 保护 MBR。不能缺!不能缺!不能缺!
接下来打开 VMware Player,选择 myos 虚拟机,然后右键-设置,或者点击右下角的“编辑虚拟机设置”。在出现的设置界面上选择软盘,选择“使用软盘镜像文件”,“浏览”找到正确的 A.img
点击确定之后,开启虚拟机,不出意外,myos 会正常运行,屏幕上出现“hello world!”字样
这表示虚拟计算机 myos 正常启动并且 BIOS把控制权顺利交接到了软盘上的 MBR!完成了编写操作系统的第一步,也是意义重大的一步。