【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

news2024/11/14 10:56:08

一.什么是启动扇区

        我们使用软盘来启动操作系统时,系统首先就是从软盘的第一个扇区中开始读取数据,也就是第0面,0磁道的第0个扇区,软盘的每个扇区为512个字节的大小,如果最后两个字节为0xaa55(当BIOS看到这两个字节时,就认为是引导扇区的结束标志),则代表该两个字节前的机器指令都是启动扇区的指令,以0x00开头一直到0xaa55这512个字节的扇区就称之为启动扇区

二.引导扇区的程序编写

        代码(程序名称为boot.S)以及注释如下:

.code16
.text
        mov     %cs,%ax
        mov     %ax,%ds  
        mov     %ax,%es  #将寄存器ds和es同时指向与cs相同的段,使得后续在进行数据操作时能定位到正确的位置
        call    DispStr  #调用DispStr函数
        jmp     .  #进入死循环
DispStr:  
        mov     $BootMessage,%ax
        mov     %ax,%bp
        mov     $16,%cx
        mov     $0x1301,%ax
        mov     $0x00c,%bx
        mov     $0,%dl
        int     $0x10
        ret
BootMessage:.ascii  "Hello, OS world!"
.org    510
.word   0xaa55

        DispStr函数的注释如下:

DispStr:  
        mov     $BootMessage,%ax #将字符串变量“BootMessage”的首地址传给寄存器ax
        mov     %ax,%bp #使用寄存器ES:BP保存字符串的地址
        mov     $16,%cx  #保存字符串的长度
        mov     $0x1301,%ax #寄存器ax高位为 0x13h,低位为0x01h
        mov     $0x00c,%bx #设置页号为0(高位0X0h),字符串颜色为红色高亮(低位0x0ch)
        mov     $0,%dl
        int     $0x10 #10h号中断
        ret

         剩下的代码注释如下:

BootMessage:.ascii  "Hello, OS world!"  #字符串函数
.org    510  #用0x00填满剩下的字节,一直到第510个字节
.word   0xaa55  #剩下的两个字节填0xaa55

三.连接脚本的编写

        要想将一个程序编译成可执行文件,我们需要经过类似中间代码生成、连接等步骤(可以参考之前写过的一篇文章:【c语言】从高级语言到可以执行的EXE程序的编译过程),所以,在编译之前,我们还需要编写一个连接脚本(名称为solrex_X86.ld),代码如下:

SECTIONS
{
. = 0x7c00;
.text :
{
  _ftext = .;
} = 0
}

        当BIOS发现了引导分区(以0xaa55结尾的前512个字节的扇区)之后,就会把这512个字节的内容转载到内存的0000:7c00处(可以参考之前写过的一篇文章:【操作系统】操作系统的启动都干了些什么),然后跳转到0000:7c00处将控制权彻底交给这段引导代码中,所以该连接脚本的功能就是在进行连接时,将程序入口设置到内存0000:7c00的位置,而如果我们希望将代码放置到其他地址空间时,就可以直接修改连接脚本的地址即可。

四.Makefile脚本编写

        下一步我们编写Makefile脚本,用于将高级语言(.S)编译成中间文件(.o),再将连接脚本(.ld)和中间文件(.o)连接编译成可执行文件(.elf),最后将可执行文件写入到软盘镜像中(.img),代码如下:

CC=gcc
LD=ld
LDFILE=solrex_X86.ld  #连接脚本
OBJCOPY=objcopy

all: boot.img

boot.o: boot.S  #生成中间文件
        $(CC) -c boot.S

boot.elf: boot.o  #连接脚本+中间文件=可执行文件
        $(LD) boot.o -o boot.elf -e c -T$(LDFILE)

boot.bin: boot.elf  #移除可执行文件中没有用到的块
        @$(OBJCOPY) -R .pdr -R .comment -R.note -S -O binary boot.elf boot.bin

boot.img: boot.bin   #生成软盘镜像
        @dd if=boot.bin of=boot.img bs=512 count=1
        @dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879

clean:
        @rm -rf boot.o boot.elf boot.bin boot.img

        使用指令:

make

        进行编译,输出如下:

         最后即生成一个软盘镜像(boot.img)和一些中间文件:

 五.虚拟机VXBox开启镜像

        我们在虚拟机上新建一个虚拟电脑,然后按照推荐一直点下一步:

       创建完成后,我们选择虚拟电脑的“设置”项,添加一个虚拟软盘:

         点击”添加虚拟软驱“,然后点击”注册“,将你先前编译的boot.img进行注册操作:

         注册完成后选择对应的软盘镜像,即可保存退出:

        为了让系统优先导入我们的软盘镜像,我们可以将控制器:IDE整个删除,使得我们的镜像处于最高优先级:

        最后我们直接点击“启动”,即可看见先前编写的字符串黑底红字!!

        恭喜!你已经踏入了编写操作系统的第一步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java多线程基础面试总结(一)

进程、线程和协程 进程、线程和协程 进程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。 在Java中,当我们启动main函数其实就是启动了一个JVM进程&…

【Linux】全新服务器Centos7环境搭建和安装

1、简介 最近服务器重装后,环境啥的则需要从头全部搞一遍,于是开始搞起环境的配置和安装 2、环境配置安装 前期准备 给目录文件加文件传输权限(发现无法上传文件,于是增加权限 $ chmod 766 /home/lj/ 配置DNS服务 #配置DNS服务,如果没有8.8.8.8需要添加 cat /etc/re…

WRF模式与Python融合技术在多领域中的应用及精美绘图教程

当今从事气象及其周边相关领域的人员,常会涉及气象数值模式及其数据处理,无论是作为业务预报的手段、还是作为科研工具,掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者,模式功能齐全…

QML控件--Dialog

文章目录一、控件基本信息二、控件使用三、属性成员四、成员函数五、信号一、控件基本信息 Import Statement:import QtQuick.Controls 2.14 Since:Qt 5.8 Inherits:Popup 二、控件使用 Dialog: 是一个弹出窗口,继承…

项目打包发布流程

---》》》项目打包发布 1.编译并构建项目 2.部署 npm i npm run build scp2:需要写代码 ---》》》 后续有空更新:赋几个链接: Jenkins官网 nullhttps://www.jenkins.io/zh/一文详解Jenkins的安装与配置Jenkins是一个基于Java开发的开源…

【SpringMVC】10—其他概念

⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍…

2023年Web3的五大趋势

Web3 这个词有时被称为 "去中心化的互联网",涵盖了一些重要的互联网发展趋势。Web3 的愿景是创造一个不受大公司控制的互联网,如Alibaba、baidu、Google和Facebook,这些公司制定了互联网的大部分规则,掌控着我们今天可以…

HyperWorks2021软件安装教程

下载软件 https://www.xsoftnet.com/share/a0004MWyQAg9r.html产品介绍: HyperWorks一款功能强大的开放式架构仿真软件。拥有先进的技术以及高性能、高效和创新的产品,为用户提供了设计、仿真和制造等服务。支持电磁分析设计、材料建模制造、多物理场分…

学校的地下网站(学校的地下网站1080P高清)

这个问题本身就提得有问题,为什么这么说,这是因为YouTube本身就不是一个视频网站或者说YouTube不是一个传统的视频网站!!! YouTube能够一家独大,可不仅仅是因为有了Google 这个亲爹,还有一点&am…

Flutter Web 开发实践与优化

一,Flutter Web架构 目前,除了可以支持Android、iOS移动跨平台开发之外,Flutter还支持macOS、Windows、Linux和Web等多个跨平台的开发。可以说,作为一款先进的跨平台开发框架,Flutter已经真正意义上实现了“一次编写,处处运行”的美好愿景。 众所周知,Dart 语言存在之…

【建议收藏】数据库 SQL 入门——事务(内附演示)

文章目录📚引言📖事务📑事务的概念📑事务操作🔖查看与设置事务提交方式🔖提交事务与回滚事务📑事务的特性📑并发事务问题📑事务隔离级别📍总结📚引…

8.基于拉丁超立方法的风光场景生成与削减

matlab代码:基于拉丁超立方法的风光场景生成与削减 摘要:与蒙特卡洛法不同,拉丁超立方采样改进了采样策略能够做到较小采样规模中获得较高的采样精度,属于分层抽样技术,设定风光出力遵从正态分布normrnd,从…

字节面试体验值拉满~

今天分享一位读者春招的字节二面面经,岗位是后端开发。 一个编程语言都没问,都是问网络项目mysqlredis。 问题记录 使用消息中间件降低消息持久化的压力是怎么做的,为什么可以降低? 读者答:在突发大量消息的情况下…

水塘抽样解决随机选择问题

1.简介 水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到内存的情况。最常见例子为Jeffrey Vitter在其论文中所提及的算法R。 2.算法步骤&#xff1…

AD823AARZ-RL-ASEMI代理亚德诺AD823AARZ-RL车规级芯片

编辑-Z AD823AARZ-RL芯片参数: 型号:AD823AARZ-RL −3dB带宽:17 MHz 全功率响应:4.8 MHz 斜率:30 V/s 输入电压噪声:14 nV/√Hz 输入电流噪声:1 fA/√Hz 初始偏移量:0.12mV …

nacos集群配置高可用数据库

1.架构 nacos集群配置高可用数据库的架构其实和nacos集群的架构差不多,只是在数据库方面做了主从跟keepalive实现数据库的高可用,当mysql的master节点挂掉时,keepalive的vip自动漂移到slave节点,并通过脚本使slave节点提升为mast…

Leetcode.1992 找到所有的农场组

题目链接 Leetcode.1992 找到所有的农场组 Rating : 1539 题目描述 给你一个下标从 0 开始,大小为 m x n 的二进制矩阵 land ,其中 0 表示一单位的森林土地,1 表示一单位的农场土地。 为了让农场保持有序,农场土地之…

QT程序退出还占进程

问题情况 程序运行时的样子: 程序退出时的样子: 其跑到了后台进程里面: 程序退出了,但在任务管理器里查看,其从进程里面转移到后台进程了。 这种问题,怎么办,代码里,应该释放的也都…

微信小程序引入广告位功能,详细步骤!!!

大家碰到过首页加载时一开始出现的广告页面,这种微信官方提供了一个api进行设置,下面我们来详细解释一下。 首先第一步需要小程序累计用户数达到1000即可开通流量主,成功开通流量主之后就可以创建相应的广告位了,包括banner广告、…

【设计模式】如何在业务开发中使用适配器模式?

文章目录前言适配器模式定义通用代码实现适用场景案例场景分析一坨坨代码实现适配器模式重构总结前言 适配器模式(Adapter Pattern):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个…