《操作系统真象还原》记录全流程——第二章 MBR

2024-03-22 07:52

本文主要是介绍《操作系统真象还原》记录全流程——第二章 MBR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示: 写这篇文章的目的是只是激励自己完成这本书的linux内核项目,本文不够细致。

指路大佬:操作系统真象还原 自制操作系统_Love 6的博客-CSDN博客

指路大佬:

用《操作系统真象还原》写一个操作系统 第二章 编写MBR主引导记录,让我们开始掌权_哔哩哔哩_bilibili

感谢CSDN上的前辈们的热心分享。

一.基本概念

  1. CPU 的硬件电路被设计成只能运行处于内存中的程序。
  2. 所谓的载入内存,大概上分两部分:(1)程序被加载器(软件或硬件)加载到内存某个区域。 (2)CPU 的 cs:ip 寄存器被指向这个程序的起始地址。
  3. 从按下主机上的 power 键后,第一个运行的软件是 BIOS。BIOS 的主要工作是检测、初始化硬件。
  4. 在开机的一瞬间,也就是接电的一瞬间,CPU 的 cs:ip 寄存器被强制初始化为 0xF000:0xFFF0
  5. BIOS 最后一项工作校验启动盘中位于 0 盘 0 道 1 扇区。
  6. MBR 的任务是加载某个程序到指定位置,并将控制权交给它。加载 MBR 的位置取决于操作系统本身所占内存大小和内存布局。MBR 的大小必须是 512 字节,这是为了保证 0x55 和 0xaa 这两个 魔数恰好出现在该扇区的最后两个字节处,即第 510 字节处和第 511 字节处。

二、配置

0.安装NASM编译器:sudo apt-get install nasm

1. 编写主引导程序MBR

代码流程:

  1. 实模式下MBR 被 BIOS 加载到7C00,所以起始地址设置为7C00。
  2. 初始化寄存器。
  3. 准备中断功能的寄存器参数,调用中断。
  4. 获取光标位置,向光标位置打印字符串。

2. 点开text editor,把汇编代码输入进去,命名mbr.s。【我是新手,ubuntu初始时,只能新建folder,我不知道,所以特意写了这一步,本来还疑惑不能新建txt文件的。】

SECTION MBR vstart=0x7c00 ;起始地址编译在0x7c00mov ax,csmov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00;这个时候 ds = es = ss = 0 栈指针指向MBR开始位置;ah = 0x06 al = 0x00 想要调用int 0x06的BIOS提供的中断对应的函数 即向上移动即完成清屏功能;cx dx 分别存储左上角与右下角的左边 详情看int 0x06函数调用mov ax,0x600 mov bx,0x700mov cx,0mov dx,0x184f;调用BIOS中断int 0x10 mov ah,3mov bh,0;获取光标位置 需要打印信息int 0x10mov ax,messagemov bp,axmov cx,5mov ax,0x1301mov bx,0x71;白底蓝字好cooiint 0x10 ;写字符串jmp $ ;无限循环 一直跳转到当前命令位置;字符串声明 db == define byte dw == define word ascii一个字符占一个字节message db "1 MBR" ;预留两个字节 其余空余的全部用0填满 为使检测当前扇区最后两字节为0x55 0xaa 检测是否为有效扇区;510 = 512字节-2预留字节  再减去(当前位置偏移量-段开始位置偏移量)求出来的是剩余空间times 510 - ($ - $$) db 0 db 0x55,0xaa

3. 编译文件nasm -o mbr.bin mbr.s,将编译好的mbr.bin 文件写入虚拟机,启动虚拟机。

具体可以参考:从零开始编写一个操作系统(1)---编写mbr.s文件-CSDN博客

4.记录

这篇关于《操作系统真象还原》记录全流程——第二章 MBR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834871

相关文章

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定