当前位置:   article > 正文

自己动手写操作系统 - Hello DTOS_自己动手写操作系统于渊

自己动手写操作系统于渊

本系列笔记参考整理于狄泰未来 - 操作系统专题、于渊 《自己动手写操作系统》(《一个操作系统的实现》)

基于x86架构从零开始编写操作系统内核,旨在通过实践的方式掌握操作系统原理


目录

1、BIOS

2、主引导程序

1、主引导程序

2、编写一个主引导程序

3、主引导程序的扩展

3、调试环境的搭建(Bochs)

4、小结


1、BIOS

什么是操作系统?

    - 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架构)

 

2、主引导程序

1、主引导程序

问题

         主引导程序是软件还是固件?如果是软件,

         那么由谁开发?如何开发?

主引导程序

    - 一段存储在主引导区(MBR)中的有效代码

    - 并不固化于硬件,属于操作系统代码的一部分

    - 启动操作系统内核的桥梁,由汇编程序写成

    - 代码总量不能超过512个字节(包含0x55aa)

 

主引导程序的开发

2、编写一个主引导程序

课程实验

    - 编写一个主引导程序(汇编语言)

    - 可独立运行于x86架构的主机(无操作系统)

    - 运行后在屏幕上打印" Hello,DTOS!"

实现思路

     1. 将关键寄存器的值设置为0(mov ax,0)

     2. 定义需要打印的数据(db "Hello,DTOS!")

     3. 打印预定义好的字符数据(int 0x10)

中断调用 VS 函数调用

编程实验

第一个引导加载程序  boot.asm

  1. org 0x7c00;告诉编译器程序将加载到内存7c00偏移处
  2. start:
  3. mov ax, cs
  4. mov ss, ax
  5. mov ds, ax
  6. mov es, ax
  7. mov si, msg
  8. print:
  9. mov al, [si] ;默认段地址ds
  10. add si, 1
  11. cmp al, 0x00
  12. je last ;al
  13. mov ah, 0x0e ;10号中断0e号子功能:打印字符 参数:AH=0EH,AL=字符,BH=页码,BL=前景色(图形模式)
  14. mov bx, 0x0f ;字符颜色
  15. int 0x10
  16. jmp print
  17. last:
  18. hlt ;停止运行,CPU进入暂停状态,不执行任何操作,HLT instruction with IF=0!
  19. jmp last
  20. msg:
  21. db 0x0a, 0x0a;换行
  22. db "Hello DTOS!"
  23. db 0x0a, 0x0a
  24. times 510 -($-$$) db 0x00;
  25. db 0x55, 0xaa

$是当行的汇编地址,$$是是当前汇编节(段)的起始汇编地址,当前程序没有定义节或段,默认生成一个汇编段,起始汇编地址为0。当前程序还很简陋,但后续会一步步完善。

如何验证编写的主引导程序?

解决方案设计

    - 将汇编源码编译为二进制机器码(nasm

    - 创建虚拟盘(bximage

    - 将二进制代码写入虚拟盘起始位置(dd

    - 在虚拟机中将虚拟盘作为启动盘执行(vmware

把a.img拷到Windows下用VMware模拟计算机启动

                         那么如何调试主引导区的代码?

 

3、主引导程序的扩展

限制

        主引导程序的代码量不能超过512字节!!

突破限制的思路

    - 主引导程序

      1. 完成最基本的初始化工作

      2. 从存储介质中加载新程序到内存中

      3. 将控制权交由新加载的程序执行(jmp)

      4. ...

                     主引导程序如何加载存储介质中的其它程序?后续讲解
 

3、调试环境的搭建(Bochs)

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 

  1. ###############################################################
  2. # Configuration file for Bochs
  3. ###############################################################
  4. # how much memory the emulated machine will have
  5. megs: 32
  6. # filename of ROM images
  7. romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
  8. vgaromimage: file=/usr/share/vgabios/vgabios.bin
  9. # what disk images will be used
  10. floppya: 1_44=a.img, status=inserted
  11. # choose the boot disk.
  12. boot: floppy
  13. # where do we send log messages?
  14. # log: bochsout.txt
  15. # disable the mouse
  16. mouse: enabled=0
  17. # enable key mapping, using US layout as default.
  18. keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map

启动bochs虚拟机(通过启动文件)

    - 显示方式:bochs -f bochsrc_file

    - 隐式方式:bochs(尝试寻找下列启动文件)

                      输入c(continue)继续执行 

Bochs中的常用调试命令

 

4、小结

BIOS 是计算机上电后第一个运行的程序

BIOS 进行必要的初始化,并加载运行主引导程序

主引导程序位于存储介质的最开始512字节处

主引导程序负责后续初始化,并加载运行操作系统内核

主引导程序的代码量不能超过512字节

可以通过主引导程序加载新程序的方式突破限制

主引导程序需要使用汇编语言开发

主引导程序中可以通过BIOS中断使用硬件功能

主引导程序运行于实模式(地址都是实际的物理地址

Bochs 是一款专业模拟x86架构的虚拟机

从源码安装Bochs 可以获得调试功能的支持

Bochs的启动配置文件是正确运行关键

Bochs 支持断点调试,其调试命令与GDB类似

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/1017346
推荐阅读
相关标签
  

闽ICP备14008679号