赞
踩
本系列笔记参考整理于狄泰未来 - 操作系统专题、于渊 《自己动手写操作系统》(《一个操作系统的实现》)
基于x86架构从零开始编写操作系统内核,旨在通过实践的方式掌握操作系统原理
目录
什么是操作系统?
- Windows,UNIX,Linux,Mac OS,Android,iOS.…
- 操作系统是直接运行于硬件之上的计算机程序
- 操作系统用于管理和控制计算机的硬件与软件资源
- 操作系统为用户软件的开发提供必要的服务和接口
现代计算机系统架构
BIOS - Base Input & Output System
- BIOS是计算机上电后第一个运行的程序
- BIOS首先检测硬件状态,检测通过后立即进行硬件初始化
- BIOS会在内存中建立中断向量表(提供硬件访问的方法)
- BIOS 最后将控制权交由主引导程序执行
注意:BIOS不是软件(Software),而是固件(Firmware)!
(固件是固化于硬件中的程序,在硬件出厂前已经烧写固定)
关于中断向量表和BIOS的详细介绍可参考:王爽《汇编语言》笔记(详细)· 十一、内中断
系统启动流程(×86架构)
BIOS 是如何被运行起来的?
BIOS的运行机制
- BIOS 存储于ROM中,地址映射为0xF0000-0XFFFFF(实地址)
- BIOS的入口地址为:0XFFFF0
- 硬件电路的特殊设计使得:开机后,CPU从0XFFFF0处开始执行
★ 开机后,CPU一加电,初始化(CS)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序
★ FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
★ 初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中
★ 硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制
BIOS 最后的使命
- 按照用户设置扫描各个存储介质(光驱,软驱,U盘,等)
- 发现主引导区后,将主引导区中的主引导程序载入内存
- 主引导程序在内存中的入口地址为0x0000 : 0x7c00(即0x07c00)
- 将控制权交由主引程序执行(jmp 0x0000:0x7c00)
问题
BIOS如何在存储介质中寻找主引导区?
如何判断引导区中有没有主引导程序?
主引导区(记录)(MBR:Master Boot Record)
- 位置:位于存储介质的最开始位置处,大小为512字节
- 特点:前512字节的最后2个有效字节为0x55aa
- 数据:0x55aa之前的数据被视为主引导程序
例如:使用二进程工具查看我的C盘(GPT分区)如下
关于MBR和GPT的知识点是装系统必掌握的知识点,篇幅有限,不解释
更详细的系统启动流程(x86架构)
问题
主引导程序是软件还是固件?如果是软件,
那么由谁开发?如何开发?
主引导程序
- 一段存储在主引导区(MBR)中的有效代码
- 并不固化于硬件,属于操作系统代码的一部分
- 启动操作系统内核的桥梁,由汇编程序写成
- 代码总量不能超过512个字节(包含0x55aa)
主引导程序的开发
课程实验
- 编写一个主引导程序(汇编语言)
- 可独立运行于x86架构的主机(无操作系统)
- 运行后在屏幕上打印" Hello,DTOS!"
实现思路
1. 将关键寄存器的值设置为0(mov ax,0)
2. 定义需要打印的数据(db "Hello,DTOS!")
3. 打印预定义好的字符数据(int 0x10)
中断调用 VS 函数调用
编程实验
第一个引导加载程序 boot.asm
- org 0x7c00;告诉编译器程序将加载到内存7c00偏移处
-
- start:
- mov ax, cs
- mov ss, ax
- mov ds, ax
- mov es, ax
-
- mov si, msg
-
- print:
- mov al, [si] ;默认段地址ds
- add si, 1
- cmp al, 0x00
- je last ;al
- mov ah, 0x0e ;10号中断0e号子功能:打印字符 参数:AH=0EH,AL=字符,BH=页码,BL=前景色(图形模式)
- mov bx, 0x0f ;字符颜色
- int 0x10
- jmp print
-
- last:
- hlt ;停止运行,CPU进入暂停状态,不执行任何操作,HLT instruction with IF=0!
- jmp last
- msg:
- db 0x0a, 0x0a;换行
- db "Hello DTOS!"
- db 0x0a, 0x0a
- times 510 -($-$$) db 0x00;
- db 0x55, 0xaa
$是当行的汇编地址,$$是是当前汇编节(段)的起始汇编地址,当前程序没有定义节或段,默认生成一个汇编段,起始汇编地址为0。当前程序还很简陋,但后续会一步步完善。
如何验证编写的主引导程序?
解决方案设计
- 将汇编源码编译为二进制机器码(nasm)
- 创建虚拟盘(bximage)
- 将二进制代码写入虚拟盘起始位置(dd)
- 在虚拟机中将虚拟盘作为启动盘执行(vmware)
把a.img拷到Windows下用VMware模拟计算机启动
那么如何调试主引导区的代码?
限制
主引导程序的代码量不能超过512字节!!
突破限制的思路
- 主引导程序
1. 完成最基本的初始化工作
2. 从存储介质中加载新程序到内存中
3. 将控制权交由新加载的程序执行(jmp)
4. ...
主引导程序如何加载存储介质中的其它程序?后续讲解
Bochs(另一款优秀的虚拟机软件)
- 专业模拟x86架构的虚拟机
- 开源且高度可移植,由C++编写完成
- 支持操作系统开发过程中的断点调试
- 通过简单配置就能够运行绝大数主流的操作系统
支持调试功能的Bochs版本
1. 下载源码:https://sourceforge.net/projects/bochs/files/
2. 解压缩 bochs-2.x.x.tar.gz→bochs-2.x.x(这里选择 bochs-2.4.5)
3. 进入源码目录:cd bochs-2.x.x
4. 配置:./configure --enable-debugger --enable-disasm
5. 编译:make
6. 安装:sudo make install、
安装过程中的错误:
再配置一次若提示gtk...错误,运行sudo apt-get install libgtk2.0-dev,再配置
若出现下面错误
缺少 pthread 库,修改 Makefile 文件,添加下面的部分,然后成功编译 Bochs 源码。
配置Bochs的启动文件
即必须
确定 bochs的安装路径(which bochs)
安装vgabios(apt-get install vgabios)
确定vgabios的安装路径(whereis vgabios)
启动文件bochsrc
- ###############################################################
- # Configuration file for Bochs
- ###############################################################
-
- # how much memory the emulated machine will have
- megs: 32
-
- # filename of ROM images
- romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
- vgaromimage: file=/usr/share/vgabios/vgabios.bin
-
- # what disk images will be used
- floppya: 1_44=a.img, status=inserted
-
- # choose the boot disk.
- boot: floppy
-
- # where do we send log messages?
- # log: bochsout.txt
-
- # disable the mouse
- mouse: enabled=0
-
- # enable key mapping, using US layout as default.
- keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map
启动bochs虚拟机(通过启动文件)
- 显示方式:bochs -f bochsrc_file
- 隐式方式:bochs(尝试寻找下列启动文件)
输入c(continue)继续执行
Bochs中的常用调试命令
BIOS 是计算机上电后第一个运行的程序
BIOS 进行必要的初始化,并加载运行主引导程序
主引导程序位于存储介质的最开始512字节处
主引导程序负责后续初始化,并加载运行操作系统内核
主引导程序的代码量不能超过512字节
可以通过主引导程序加载新程序的方式突破限制
主引导程序需要使用汇编语言开发
主引导程序中可以通过BIOS中断使用硬件功能
主引导程序运行于实模式(地址都是实际的物理地址)
Bochs 是一款专业模拟x86架构的虚拟机
从源码安装Bochs 可以获得调试功能的支持
Bochs的启动配置文件是正确运行关键
Bochs 支持断点调试,其调试命令与GDB类似
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。