【自制操作系统】0x01MBR

环境

ubuntu 20.04
gcc 9.4.0(加载硬盘程序之前都是,最后可能会切换到 gcc 4.4)
bochs 2.7

bochs 配置

bochs 安装之前文章记录过,现在记录一下本次使用的bochs配置

bochsrc

#第一步,首先设置 Bochs 在运行过程中能够使用的内存,本例为 32MB
#关键字为 me gs
megs :512
#第二步,设置对应真实机器的 BIOS VGA BIOS
#对应两个关键字为 romimage vgaromimage
romimage: file=/home/dawn/repos/OS_learning/bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/dawn/repos/OS_learning/bochs/share/bochs/VGABIOS-lgpl-latest
#第三步,设置 Bochs 所使用的磁盘,软盘的关键字为 floppy
#若只有一个软盘,目IJ 使用 floppy 即可,若有多个,则为 floppya, floppyb… #floppya: 1_ 44=a.img, status=inserted
#第四步,选择启动盘符。
#boot: floppy #默认从软盘启动,将其注释
boot: disk #改为从硬盘启动。我们的任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作。
#第五步,设置日志文件的输出。
log: bochs.out
#第六步,开启或关闭某些功能。
#下面是关闭鼠标,并打开键盘。
mouse: enabled=0
keyboard:keymap=/home/dawn/repos/OS_learning/=bochs/share/bochs/keymaps/xll-pc -us.map
#硬盘设置
ata0: enabled=1, ioaddr1=Ox1f0, ioaddr2=0x3f0, irq=14
#下面的是增加的 bochs gdb 的支持,这样 gdb 可以远程连接到此机器的 234 口调试了
#gdbstub : enabled=l, port=l234, text_base=O, data_base=O, bss_base=O
################### 配置文件结束 #####################

创建硬盘:

bin/bximage -hd -mode="flat" -size=60 -q hd60M.img

计算机启动过程

1、按下电源键

2、BIOS代码映射在内存 0xF0000 ~ 0xFFFFF

3、CPU的cs:ip寄存器被强制置为 0xF000: 0xFFF0 —> 0xFFFF0,该地址处的指令为jmp f000:0xe05b —> 0xfe05b,该位置是BIOS入口地址,BIOS代码开始执行,检测内存、显卡等外设信息,通过检测后,在内存 0x000 ~ 0x3FF处建立数据结构,中断向量表IVT并填写中断程序。

4、BIOS最后一项工作,检测启动盘中为 0 盘 0 道 1 扇区(CHS)的内容(是不是MBR程序)。如果最后两个字节是 0x55、0xaa,便将该扇区的代码加载到 0x7c00 处,使用 jmp 0:0x7c00指令跳转过去继续执行。

实模式下的 1M 内存分布

在这里插入图片描述

MBR代码

SECTION MBR vstart=0x7c00	;把MBR的起始地址编译为 0x7c00,若引用该 节 的变量,其地址都从 vstart定义的地址开始算(书 P69)mov ax, csmov ds, axmov es, axmov ss, axmov fs, axmov sp, 0x7c00			; 把 0x7c00 一下地址当作栈来使用; 清屏: 使用0x06号中断功能,上卷全部行,则可以清屏
; ---------------------------------------------
; INT 0x10  功能号 0x06     功能描述 上卷所有行
; ---------------------------------------------
; AH -> 功能号0x06
; AL = 上卷的行数(如果为0,表示全部)
; BH = 上卷行属性
; (CL,CH) = 窗口左上角的(X,Y)位置
; (DL,DH) = 窗口右下角的(X,Y)位置
; 无返回值mov ax, 0x600mov bx, 0x70mov cx, 0                   ; 左上角: (0, 0)mov dx, 0x184f              ; 右下角: (80,25); VGA文本模式中,一行只能容纳80个字符,共25行。; 下标从0开始,所以0x18=24,0x4f=79int 0x10; 获取光标位置
; ---------------------------------------------
; INT 0x10  功能号 0x03     功能描述 获取光标位置
; ---------------------------------------------
; 获取当前光标位置,在光标位置处打印字符.mov ah, 3		; 输入: 3号子功能是获取光标位置,需要存入ah寄存器mov bh, 0		; bh寄存器存储的是待获取光标的页号int 0x10		    ; 输出: ch=光标开始行,cl=光标结束行; dh=光标所在行号,dl=光标所在列号; 打印字符串
; ---------------------------------------------
; INT 0x10  功能号 0x13     功能描述 打印字符串
; ---------------------------------------------mov ax, message mov bp, ax		; es:bp 为串首地址, es此时同cs一致,; 开头时已经为sreg初始化; 光标位置要用到dx寄存器中内容,cx中的光标位置可忽略mov cx, 5		; cx 为串长度,不包括结束符0的字符个数mov ax, 0x1301	; 子功能号13是显示字符及属性,要存入ah寄存器,; al设置写字符方式 ah=01: 显示字符串,光标跟随移动mov bx, 0x2		; bh存储要显示的页号,此处是第0页,; bl中是字符属性, 属性黑底绿字(bl = 02h)int 0x10		; 执行BIOS 0x10 号中断jmp $		; 使程序悬停在此message db "1 MBR"times 510-($-$$) db 0db 0x55,0xaa
  • 代码解释
    mov ax, csmov ds, axmov es, axmov ss, axmov fs, axmov sp, 0x7c00
用 cs 寄存器的值去初始化其他寄存器 。 由于 BIOS 是通过 jmp 0:0x7c00 跳转到 MBR 的,故cs 此时为 0 。 对于ds、 es、 fs、gs 这类 sreg,CPU 中不能直接给它们赋值,没有从立即数到段寄存器的电路实现,只有通过其他寄存器来中转,这里我们用的是通用寄存器 ax 来中转。
; 获取光标位置
; ---------------------------------------------
; INT 0x10  功能号 0x03     功能描述 获取光标位置
; ---------------------------------------------
; 获取当前光标位置,在光标位置处打印字符.mov ah, 3		; 输入: 3号子功能是获取光标位置,需要存入ah寄存器mov bh, 0		; bh寄存器存储的是待获取光标的页号int 0x10		    ; 输出: ch=光标开始行,cl=光标结束行; dh=光标所在行号,dl=光标所在列号一页就是一屏,一屏可以有80列25行、40列25行等字符,默认情况是80*25的显示方式,共2000个字符,一个字符要两字节控制,高字节控制字符属性,低字节表示ASCII码,一屏就要4000个字节,但实际分配是4K,0页是默认页
; 打印字符串
; ---------------------------------------------
; INT 0x10  功能号 0x13     功能描述 打印字符串
; ---------------------------------------------mov ax, message mov bp, ax		; es:bp 为串首地址, es此时同cs一致,; 开头时已经为sreg初始化; 光标位置要用到dx寄存器中内容,cx中的光标位置可忽略mov cx, 5		; cx 为串长度,不包括结束符0的字符个数mov ax, 0x1301	; 子功能号13是显示字符及属性,要存入ah寄存器,; al设置写字符方式 ah=01: 显示字符串,光标跟随移动mov bx, 0x2		; bh存储要显示的页号,此处是第0页,; bl中是字符属性, 属性黑底绿字(bl = 02h)int 0x10		; 执行BIOS 0x10 号中断只有写字符时,al低两位才有意义
al=0 ,显示字符串,并且光标返回起始位置。
al=1 ,显示字符串,并且光标跟随到新位置。
al=2 ,显示字符串及其属性,并且光标返回起始位置 。
al=3 ,显示字符串及其属性,光标跟随到新位置。

编译MBR,写入启动盘

  • 编译
nasm -o mbr.bin mbr.S

nasm 还有 -f 参数,可以编译除了纯二进制文件,还可以是elf,coff,WIN等格式

  • 写入磁盘
dd if=/home/ubuntu/mos/01_mbr/mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc

asm 还有 -f 参数,可以编译除了纯二进制文件,还可以是elf,coff,WIN等格式

  • 写入磁盘
dd if=/home/ubuntu/mos/01_mbr/mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc

运行测试

bin/bochs -f bochsrc

-f 后是自己bochsrc的存放位置

源代码

MBR代码

: 一切都以源代码为准,笔记中有些许不准,是因为代码源代码修改后,笔记未修改,所有代码在当前任务中都是没问题的

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

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

相关文章

SpringBoot接入星火认知大模型

文章目录 准备工作整体思路接入大模型服务端和大模型连接客户端和服务端的连接测试 准备工作 到讯飞星火大模型上根据官方的提示申请tokens 申请成功后可以获得对应的secret,key还有之前创建的应用的appId,这些就是我们要用到的信息 搭建项目 整体思…

ssm056基于Java语言校园快递代取系统的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:校园快递代取系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园快递代取系统…

简单语音信号识别的MATLAB仿真

简单语音信号识别的MATLAB仿真 摘要: 隐马尔可夫模型(HMM)作为描述语音信号的一种统计模型,在现代语音处理中获得了广泛应用。本文概述了基于HMM的语音识别技术,阐述了预处理,特征提取以及训练&#xff0c…

童年玩具:两款线绳陀螺

1,2图是过去用来安装明线电线的瓷夹。现在应该找不到了。过去安装电线后,家里留下了一些,拿来做线陀螺非常好。 因为它非常重,旋转起来很有力,那声音呼呼响。 3,4图是现在都能看到的一个圆木片,两个孔,穿绳…

AntFlow一款开源免费且自主可控的仿钉钉工作流引擎

在现代企业管理中,流程审批的高效性直接影响到工作的流畅度与生产力。最近,我发现了一个非常有趣的项目——AntFlow。这个项目不仅提供了一个灵活且可定制的工作流平台,还能让用户以可视化的方式创建和管理审批流程。 如果你寻找一个快速集成…

光纤资源APP开发及二次开发说明

光纤资源APP主要由以下几部分组成: 登录界面选择项目界面地图创建节点界面填写详细信息界面成端及端口表界面接续及接续表界面 其中1、2、4界面不需要涉及到ht,故用原生界面即可实现,但是3、5、6涉及到ht,而ht在app中是不兼容的…

鉴源实验室·如何通过雷达攻击自动驾驶汽车-针对点云识别模型的对抗性攻击的科普

01 引 言 随着自动驾驶技术的迅速发展,雷达和激光雷达等传感器在自动驾驶汽车中的作用愈发重要。它们能够生成3D点云数据,帮助车辆实时感知周围环境并做出安全决策。然而,尽管这些传感器对驾驶环境的检测非常精确,它们也面临一种…

Stable Diffusion(2024)Ai绘画AIGC最新安装包资源下载+自学教程

以下内容为整理的Stable Diffusion保姆级教学内容,请购买的资料的同学务必认真学习!按以下步骤操作快速掌握Stable Diffusion这个工具! Stable Diffusion(简称SD)是一款地表最强AI绘图工具(AIGC)之一,Stab…

基于单片机的宠物自动喂食系统的设计

本设计以STM32单片机为核心控制器,搭载了OLED显示屏作为显示交互模块,HX711称重模块获取食物重量,ESP8266与手机APP通信从而远程控制,PWM输出控制舵机模拟投喂食物开关打开,驱动继电器控制水泵打开加水,HC-…

vue+websocket实现即时聊天平台

目录 1 什么是websocket 2 实现步骤 2.1 导入依赖 2.2 编写代码 1 什么是websocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它主要用于在客户端和服务器之间建立持久的连接,允许实时数据交换。WebSocket 的设计目的是为了提高 Web 应用程序的…

Spring Boot框架:大学城水电管理自动化

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

关于三色标记算法的理解

三色标记算法是一种垃圾标记的算法,用于cms和g1。 它将对象分为3种颜色: 1.白色对象:未被标记的对象 2.灰色对象:自身被标记,引用的其它对象还没被标记 3.黑色对象:自身以及所引用的对象都被标记完 标记过…

Python Matplotlib:基本图表绘制指南

Python Matplotlib:基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库,它以简单易用和功能丰富而闻名,适合各种场景的数据可视化需求。在数据分析和数据科学领域,Matplotlib 是我们展示数据的有力工具。本文将详细讲…

深入探讨SEO分析技巧助力网站流量提升

内容概要 在当前的数字化时代,SEO分析的重要性不言而喻。它是提升网站流量的关键工具,帮助站长有效地优化网站内容和结构。通过系统的SEO分析,站长可以掌握用户搜索行为和需求,从而制定出更具针对性的内容策略。例如,…

配置QINQ

1. 配置公司A和公司B的私有网络&#xff0c;创建对应的VLAN&#xff0c;并且接口的链路类型 S3的配置: 系统视图进入&#xff1a; <Huawei>system-view 设置设备名称为s3&#xff1a; [huawei]sysname s3 创建VLAN 10和20&#xff1a; [s3]vlan batch 10 20 配置Gigabit…

react 中配置@寻找文件

安装插件craco npm i -D craco/craco 创建 craco.config.js文件放在根目录和package.json同级 const path require(path)module.exports {webpack: {alias: {"": path.resolve(__dirname, "src")}} }创建 jsconfig.config.js文件放在根目录和package.js…

基于Qt的独立线程创建与多线程执行实验Demo

一、多线程与线程池的应用目的[1][4] &#xff08;一&#xff09;多线程 一个进程内多个线程并发执行的情况就叫多线程&#xff0c;每一个线程是一个独立的执行流。多线程是一种编程模型&#xff0c;它与处理器无关&#xff0c;与设计机制有关。 需要多线程的原因包括&#xf…

电能质量治理产品在分布式光伏电站的应用

1.概述 随着全球对可再生能源需求的不断增长&#xff0c;分布式光伏电站的建设与扩张正迅速发展。然而&#xff0c;在其运行过程中&#xff0c;分布式光伏电站遭遇了一系列挑战&#xff0c;包括企业关口计量点功率因数降低和谐波污染等问题。这些问题不仅影响了光伏电站的运行…

如何解决导入aioredis报错TypeError: duplicate base class TimeoutError的问题(轻松解决,亲测有效)

下面是根据你的要求撰写的文章: 文章目录 📖 介绍 📖🏡 演示环境 🏡📒 aioredis导包报错 📒📝 解决方案📝 小贴士⚓️ 相关链接 ⚓️📖 介绍 📖 最近在使用Python异步redis模块aioredis的时候遇到了一个错误,导包报错提示 TypeError: duplicate base cla…

@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出

今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出&#xff0c;debug时发现是这样&#xff1a; 导出效果 这里我把能查到的方法都汇总了&#xff0c;如果你也遇到这个异常&#xff0c;可以去逐步排查 1.先看库里有没有数据 2.看字段名是否对齐 3.所需要…