自己动手写操作系统 - 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

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模拟计算机启动

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

 

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 

###############################################################
# 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中的常用调试命令

 

4、小结

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

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

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

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

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

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

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

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

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

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

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

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

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

 

要将 squeeze2upnp 设置为开机启动,您需要将该命令添加到系统的启动脚本中。 具体步骤如下: 1. 打开终端并输入以下命令以编辑启动脚本文件: sudo vi /etc/rc.local 如果您使用的是 systemd 系统,则可以编辑 /etc/systemd/system/rc.local.service 文件。 2. 在文件的末尾添加以下行: /full/path/to/root/dtos/squeeze2upnp-linux-x86_64-static -z -x /path/to/config.xml & 请注意,必须将“/full/path/to/”替换为 squeeze2upnp 可执行文件的实际路径。 3. 保存并关闭文件。 4. 确保文件可执行。如果您使用的是 systemd 系统,请执行以下命令: sudo chmod +x /etc/systemd/system/rc.local.service 5. 启用 rc.local 服务。如果您使用的是 systemd 系统,请执行以下命令: sudo systemctl enable rc-local.service 如果您使用的是其他系统,请根据您的系统文档启用 rc.local 服务。 6. 重新启动系统并检查 squeeze2upnp 是否已在启动时自动启动。 请注意,如果您的系统使用 systemd,则还可以使用 systemctl 命令将 squeeze2upnp 添加到系统的自启动服务中。具体步骤如下: 1. 打开终端并输入以下命令: sudo vi /etc/systemd/system/squeeze2upnp.service 2. 向文件添加以下内容: [Unit] Description=Squeeze2UPnP [Service] Type=simple ExecStart=/full/path/to/root/dtos/squeeze2upnp-linux-x86_64-static -z -x /path/to/config.xml [Install] WantedBy=multi-user.target 请注意,必须将“/full/path/to/”替换为 squeeze2upnp 可执行文件的实际路径。 3. 保存并关闭文件。 4. 执行以下命令以重新加载 systemd 守护进程配置: sudo systemctl daemon-reload 5. 启动 squeeze2upnp 服务: sudo systemctl start squeeze2upnp.service 6. 将 squeeze2upnp 添加到系统的自启动服务中: sudo systemctl enable squeeze2upnp.service 7. 重新启动系统并检查 squeeze2upnp 是否已在启动时自动启动。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值