自己动手写操作系统 – Hello DTOS

自己动手写操作系统 – Hello DTOS本系列笔记参考整理于狄泰未来 操作系统专题 于渊 自己动手写操作系统 一个操作系统的实现 基于 x86 架构从零开始编写操作系统内核 旨在通过实践的方式掌握操作系统原理目录 1 BIOS2 主引导程序 1 主引导程序 2 编写一个主引导程序 3 主引导程序的扩展 3 调试环境的搭建 Bochs 4 小结 1 BIOS 什么是操作系统 Windo

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

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


目录

1、BIOS

2、主引导程序

1、主引导程序

2、编写一个主引导程序

3、主引导程序的扩展

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

4、小结


1、BIOS

什么是操作系统?

    – Windows,UNIX,Linux,Mac OS,Android,iOS.…

    – 操作系统是直接运行于硬件之上的计算机程序

    – 操作系统用于管理和控制计算机的硬件与软件资源

    – 操作系统为用户软件的开发提供必要的服务和接口

现代计算机系统架构

自己动手写操作系统 - Hello DTOS

BIOS – Base Input & Output System

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

    – BIOS首先检测硬件状态,检测通过后立即进行硬件初始化

    – BIOS会在内存中建立中断向量表(提供硬件访问的方法)

    – BIOS 最后将控制权交由主引导程序执行

注意:BIOS不是软件(Software),而是固件(Firmware)!

        (固件是固化于硬件中的程序,在硬件出厂前已经烧写固定)

关于中断向量表和BIOS的详细介绍可参考:王爽《汇编语言》笔记(详细)· 十一、内中断

系统启动流程(×86架构)

自己动手写操作系统 - Hello DTOS

                                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分区)如下

自己动手写操作系统 - Hello DTOS

                            关于MBR和GPT的知识点是装系统必掌握的知识点,篇幅有限,不解释

更详细的系统启动流程(x86架构)

自己动手写操作系统 - Hello DTOS

 

2、主引导程序

1、主引导程序

问题

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

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

主引导程序

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

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

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

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

 

主引导程序的开发

自己动手写操作系统 - Hello DTOS

2、编写一个主引导程序

课程实验

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

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

    – 运行后在屏幕上打印” Hello,DTOS!”

实现思路

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

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

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

中断调用 VS 函数调用

自己动手写操作系统 - Hello DTOS

编程实验

第一个引导加载程序  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

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

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

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

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

 

3、主引导程序的扩展

限制

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

突破限制的思路

    – 主引导程序

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

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

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

      4. …

自己动手写操作系统 - Hello DTOS

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、

安装过程中的错误:

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

               再配置一次若提示gtk…错误,运行sudo apt-get install libgtk2.0-dev,再配置

自己动手写操作系统 - Hello DTOS

若出现下面错误

自己动手写操作系统 - Hello DTOS

                          缺少 pthread 库,修改 Makefile 文件,添加下面的部分,然后成功编译 Bochs 源码。

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

配置Bochs的启动文件

自己动手写操作系统 - Hello DTOS

即必须

确定 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(尝试寻找下列启动文件)

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

自己动手写操作系统 - Hello DTOS

                      输入c(continue)继续执行 

自己动手写操作系统 - Hello DTOS

Bochs中的常用调试命令

自己动手写操作系统 - Hello DTOS

 

4、小结

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

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

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

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

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

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

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

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

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

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

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

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

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177520.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:19
下一篇 2026年3月26日 下午7:19


相关推荐

  • endnote x9中文版安装教程(vivox9安装未知应用权限在哪)

    endnote x9中文版安装教程(vivox9安装未知应用权限在哪)一、下载在百度中搜索“Endnotex9”,点第一个链接进入下载页面。软件大小为108MB,下载的是一个压缩包,如下图所示,双击解压之后是右侧的图标,解压到文件夹,双击即可安装。二、安装直接安装即可,可以更换安装路径备注:安装成功后使用汉化版,可以将CHS文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。使用英文版,可以将ENG文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。不论用的是英文版还是中文版,替换之后即可使用…

    2022年4月18日
    197
  • Kotlin学习之路(2)数据类型

    Kotlin学习之路(2)数据类型

    2021年3月12日
    154
  • pycharm激活成功教程方法

    pycharm激活成功教程方法方法一 Licenseserve 法在输入注册码的页面中选择 Licenseserve 然后输入 http idea imsxm com 也可以自己搜索其他的 Licenseserve 方法二 注册码 据说到 2019 年 6 月份过期 等过期了在网上找 G91XMO9AVI eyJsaWNlbnNl

    2026年3月20日
    2
  • 文心一言ERNIE

    文心一言ERNIE

    2026年3月12日
    2
  • Ubuntu 20.04 LTS上安装Edge浏览器

    Ubuntu 20.04 LTS上安装Edge浏览器文章目录Ubuntu20.04LTS上安装Edge浏览器Ubuntu20.04LTS上安装Edge浏览器本文部分内容转载自:HowtoInstallMicrosoftEdgeBrowseronUbuntu20.04|Linuxize,亲自安装测试并验证。Edge浏览器在各主要OS上均有正式版本发布,但是在Ubuntu上没有一个正式发布的版本。在Ubuntu上打开DownloadMicrosoftEdgeBrowser|Microsoft网页上看到不支持Ubuntu系

    2022年7月21日
    28
  • ntp网络时间协议_ntp网络时间协议特性

    ntp网络时间协议_ntp网络时间协议特性NTP是网络时间协议(NetworkTimeProtocol),它是用来同步网络中各个计算机的时间的协议。  原理:NTP要提供准确的时间,就必须有准确的时间来源,那可以用格林尼治时间吗?答案是否定的。因为格林尼治时间是以地球自转为基础的时间计量系统,但是地球每天的自转是有些不规则的,而且正在缓慢加速,因此,格林尼治时间已经不再被作为标准时间使用。新的标准时间,是由原子钟报时的

    2022年10月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号