01.硬盘启动盘,加载操作系统

news2024/12/24 7:08:42

硬盘启动盘,加载操作系统

模拟硬盘加载操作系统
环境:
VMware16
Ubuntu16.04
qemu
bochs 2.7

参考:
启动,BIOS,MBR
硬盘控制器主要端口寄存器
《操作系统真相还原》

1.系统开机流程

在这里插入图片描述
暂不构建中断向量表,直接加载MBR

2.BIOS 内存分布

在这里插入图片描述
MBR的位置在0x7c00,可用区域仅仅512B。如果在实模式下,要使内核大小超过512B,则需要使用0x500区域。该区域大小约为30KB。
因此使用MBR引导加载SETUP,使得内核大小超过512B。如下图所示:
在这里插入图片描述

  • mbr.asm,是boot loader,用于将真正的OS内核,即setup.asm中的程序,读入内存
  • setup.asm,是OS内核,存放要执行的代码
SETUP_MAIN_ADDR equ 0x500	; setup地址

boot:
    mov edi, SETUP_MAIN_ADDR 
    ;	假设mbr在第一个扇区,setup在第二个扇区
    mov ecx, 1  ; 第一个扇区
    mov bl,  2  ; 读两个扇区
    call read_hd	;	读硬盘,加载操作系统内核
   
    jmp SETUP_MAIN_ADDR ;	跳转到setup

3.硬盘读取方式

常见的硬盘寻找方式有CHS和LBA逻辑块地址
本文使用LBA48寻址。
寄存器如下所示:
在这里插入图片描述

  • 数据寄存器(Data Register):数据寄存器是最重要的硬盘寄存器之一,用于读写磁盘数据。

  • 状态寄存器(Status Register):状态寄存器用于指示当前硬盘的状态,包括硬盘是否忙碌、是否有错误、是否准备就绪等等。

  • 命令寄存器(Command Register):命令寄存器用于向硬盘发送指令和控制信息,例如读写命令、格式化命令、复位硬盘等等。

  • 错误(Error)寄存器:错误寄存器在出现硬盘错误时由控制器更新,用于记录当前硬盘的错误状态,并提示操作系统或用户进行处理。

  • LBA寄存器(Logical Block Addressing Register):LBA寄存器用于存储逻辑块地址,它指定要读取或写入的硬盘扇区编号。

  • 扇区数寄存器(Sector Count Register):扇区数寄存器用于指示要读取或写入的扇区数。

  • 设备寄存器(Device Register):设备寄存器用于存储硬盘的设备地址和访问模式等信息。

读取硬盘扇区操作基本流程
1.设置扇区数目寄存器(Sector Count Register)、柱面号低8位寄存器(Cylinder Low Register)、柱面号中8位寄存器(Cylinder Mid Register)、柱面号高8位寄存器(Cylinder High Register),以确定读写位置和范围。

    ; 设置读取的扇区数目
    mov dx, 0x1f2   ;   	Sector count
    mov al, bl
    out dx, al

    ; 设置开始读取的扇区号
    inc dx  ; 0x1f3 	LBA low 8bit
    mov al, cl
    out dx, al

    inc dx  ; 0x1f4     LBA mid 8bit
    mov al, ch
    out dx, al

    inc dx  ; 0x1f5     LBA high 8bit
    shr ecx, 16
    mov al, cl
    out dx, al

2.设置设备寄存器(Device Register),用于存储硬盘的设备地址和访问模式等信息

    ; 0x1f6 8bit
    ; 0-3 位iba地址的24-27
    ; 4 0表示主盘 1表示从盘
    ; 5、7位固定为1
    ; 6 0表示CHS模式,1表示LAB模式
    inc dx
    shr ecx, 8
    and cl, 0b0000_1111 ;   0~3 bit
    mov al, 0b1110_0000 ;   4~7 bit
    or  al, cl
    out dx, al

3.设置命令Command寄存器写入命令硬盘就开始工做:

  • identify:0xEC,硬盘识别
  • read sector:0x20,读扇区
  • write sector:0x30,写扇区
    ; 0x1f7 8bit  命令或状态端口
    inc dx
    mov al, 0x20	;	读扇区
    out dx, al

4.检测硬盘状态

; 一直等待,直到硬盘的状态是:不繁忙,数据已准备好
; 即第7位为0,第3位为1,第0位为0
.wait_hd_prepare:
    xchg    bx, bx
    mov dx, 0x1f7

.check_status:
    in al, dx
    and al, 0b1000_1000
    cmp al, 0b0000_1000
    jnz .check_status

    ret

4.读取硬盘,一次读两个字节,读256次,共512B,即读一个扇区

read_hd_sector:
    mov dx, 0x1f0   ; 0x1f0  Data
    mov cx, 256

.read_word:
    in  ax, dx
    mov [edi],  ax
    add edi,    2
    loop    .read_word

    ret

4.测试效果

使用 bximage 工具创建一个大小为 16MB、每个扇区大小为 512 字节的纯二进制格式磁盘镜像文件

bximage -q -hd=16 -func=create -sectsize=512 -imgmode=flat $(BUILD)/$(HD_IMG_NAME)

使用dd命令写入磁盘镜像。

	# 将编译输出目录下的 boot.o 文件写入到生成的磁盘镜像的第 0 个扇区中,实现将 boot.o 文件写入到操作系统启动扇区的功能
	dd if=${BUILD}/boot/boot.o of=$(BUILD)/$(HD_IMG_NAME) bs=512 seek=0 count=1 conv=notrunc
	# 将编译输出目录下的 setup.o 文件写入到生成的磁盘镜像的第 1 个扇区,实现向操作系统传递硬件和引导信息的功能。
	dd if=${BUILD}/boot/setup.o of=$(BUILD)/$(HD_IMG_NAME) bs=512 seek=1 count=1 conv=notrunc

使用qemu加载测试:

	qemu-system-i386 -m 32M -boot c -hda $(BUILD)/$(HD_IMG_NAME)

实现模拟硬盘加载操作系统,且完成硬盘扇区内容跳转。
在这里插入图片描述

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

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

相关文章

Knowledge Distillation: A Survey

本文是蒸馏学习综述系列的第一篇文章,主要是针对2021年 IJCV Knowledge Distillation: A Survey的一个翻译。 知识蒸馏:综述 摘要1 引言2 知识2.1 基于响应的知识2.2 基于特征的知识2.3 基于关系的知识 3 蒸馏方案3.1 离线蒸馏3.2 在线蒸馏3.3 自蒸馏 4…

你真的了解epoll吗?深入epoll的五个问题

由于epoll用的比较多,最近看到一些网友关于epoll的问答,所以我就想整理成一篇文章,这样看起来和理解起来都方便一些。 问题1:什么是epoll的ET/LT模式,select/poll支持吗? ET是edge trigger,也…

K8s in Action 阅读笔记——【9】Deployments: updating applications declaratively

K8s in Action 阅读笔记——【9】Deployments: updating applications declaratively 集群配置: 本章介绍如何更新运行在Kubernetes集群中的应用,以及Kubernetes如何帮助你实现真正的零停机更新过程。虽然这可以仅使用ReplicationControllers或ReplicaSe…

【Spring】javaBean、依赖注入、面向切面AOP、使用注解开发

文章目录 JavaBeanIoC理论基础使用IoC容器使用Spring 生命周期与继承生命周期继承 依赖注入 Dependency Injection基本类型注入非基本类型注入集合注入自动装配注入 面向切面AOP使用SpringAOP环绕方法 使用接口实现AOP 使用注解开发注解实现配置文件注解实现AOP操作其他注解配置…

MongoDB6.0.6 副本集搭建(CentOs8)

本文只说如何操作配置副本集,历程艰难,官网文档看了半天也只说了怎么添加单个,没有给出来一个完整的流程。 1.第一步安装,参考前一篇安装即可。 配置三台虚拟机: 192.168.182.142 192.168.182.143 192.168.182.14…

钉钉小程序页面之间传递数据如何传递对象

今天写代码的时候,发现了一个问题,在钉钉小程序页面之间传递对象数据的时候,如果直接传递一个对象那个的话,接收的那个页面得到的是一个【object Object】,而并非里面的数据,所以针对上述问题,下…

基于Spring Boot的学生志愿者管理系统的设计与实现

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对学生志愿者管理等问题,对学生…

项目计划软件 project安装包的下载和安装教程

目录 简介 安装配置过程 总结: 简介 Project是由微软公司开发的项目管理软件,旨在帮助个人和团队有效地管理项目进度、资源分配、协作和报告等工作,从而提高项目的质量和效率。Project维护项目的进程表、资源清单、成本预算、工作表和报告…

CSS-HTML知识点与高频考题解析

知识点梳理 选择器的权重和优先级 盒模型 盒子大小计算margin 的重叠计算 浮动 float浮动布局概念清理浮动 定位 position文档流概念定位分类fixed 定位特点绝对定位计算方式 flex布局 如何实现居中对齐? 理解语义化 CSS3 动画 重绘和回流 选择器的权重和优…

VTK 开发中遇到问题整理

1 Generic Warning VTK 开发 中是到 vtkOutputWindow 弹窗并提示Generic Warning&#xff1a;… vtkOutputWindow 弹窗 解决方法&#xff1a; 添加&#xff1a; #include <vtkOutputWindow.h> 在 main.cpp函数中添加&#xff1a; vtkOutputWindow::SetGlobalWarningD…

petalinux2022.2在ubantu20.04下的安装

1.Petalinux的下载路径 Downloads 这个是下载petalinux的官网路径。默认是2022.2版本&#xff0c;后期更新的均是以petalinux2022.2版本做的更新。 2.安装流程 在官网下载完成之后&#xff0c;会得到一个名为petalinux-v2022.2-10141622-installer.run的文件&#xff0c;这个文…

linux|磁盘管理工作|lvm逻辑管理卷的创建和使用总结(包括扩容,根目录扩容演示)

前言&#xff1a; 对于运维工作来说&#xff0c;磁盘管理是一个非常重要的工作。当然了&#xff0c;此类工作也是比较偏向底层的一项工作。 一个合理的磁盘分区设置&#xff0c;文件系统格式&#xff0c;以及准确的lvm逻辑管理会对我们的后期的扩展工作&#xff0c;管理工作带…

深入理解设计原则之单一职责原则(SRP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 SRP&#xff1a;单一职责原则 系列文章目录1、单一职责原则的定义和解读2、单一职责原则案例解读2.1、违背单一职责原则反面案例2.2、违背单一职责原则反面案例 - 解决方…

Openwrt_XiaoMiR3G路由器_刷入Breed固件

当我刷完Breed后&#xff0c;重启没有进入原来的小米路由器固件&#xff0c;但可以进入breed控制台。目前不清楚那个环节出错了。所以本过程会导致路由器无法再直接使用&#xff01;&#xff01;&#xff01;。 本过程只刷入Breed&#xff0c;接着编译OpenWrt和刷入OpenWrt请参…

git命令的使用

1. 查看文件 git cat-file -p 仓库路径下右键 Git Bash Here 打开git命令窗口&#xff1a; 复制某个文件的版本号&#xff1a; 粘贴到git命令窗口&#xff0c;会显示文件的提交信息&#xff1a; 查看 tree后面的版本号&#xff0c;则会看到详细提交信息&#xff1a; 查看hell…

第8章 泛型程序设计

文章目录 为什么要使用泛型程序设计类型参数的好处谁想成为泛型程序员 定义简单泛型类泛型方法类型变量的限定泛型代码和虚拟机类型擦除转换泛型表达式转换泛型方法类型擦除与多态会发生冲突桥方法实现多态桥方法与可协变的返回类型 调用遗留代码 限制与局限性泛型类型的继承规…

基于SpringBoot+Mybatis+Mysql+vue校园二手交易市场

基于SpringBootMybatisMysqlvue校园二手交易市场 一、系统介绍1、系统主要功能&#xff1a;2、环境配置 二、功能展示1.主页(客户)2.登陆、注册&#xff08;客户&#xff09;3.我的购物车(客户)4.我的商品详情(客户)5.我的商铺&#xff08;客户、商家&#xff09;6.我的信息&am…

zabbix5配置QQ邮件告警

1、服务端配置 编写邮件发送脚本 [fieldyangwww alertscripts]$ pwd /usr/lib/zabbix/alertscripts [fieldyangwww alertscripts]$ ll 总用量 8 -rwxr-xr-x 1 root root 136 5月 16 23:28 mail.sh -rwxr-xr-x 1 root root 751 5月 16 23:56 send_mail.py [fieldyangw…

信息与编码 SCUEC DDDD 期末考试整理(2)

1.求下面三种信道的信道容量 行列数量相等的情况 行比列多的情况 列比行多的情况 小贴士 2.客观世界三大基本要素&#xff1a;物质&#xff0c;能量&#xff0c;信息。 3.信息&#xff1a;是对事物运动状态和变化方式的表征&#xff0c;它存在于任何事物之中&#xff0c;可以…

机器学习算法系列(六)-- 朴素贝叶斯

.# 机器学习算法系列之 – 朴素贝叶斯 朴素贝叶斯法是基于概率统计&#xff0c;特征条件独立假设的分类方法&#xff0c;是一种非常常用的机器学习算法&#xff1b;通常用于处理文本分类和情感分析等自然语言处理任务中。相对于其他复杂的模型&#xff0c;朴素贝叶斯算法具有简…