《真象还原》读书笔记——第三章 完善MBR(3.5 硬盘)

news2024/11/24 9:36:18

3.5 硬盘介绍

3.5.2 硬盘工作原理

机械式硬盘示意图
柱面-磁头-扇区
磁道的编号从0 开始,相同编号的此道组成的管状区域就是柱面
盘面和磁头一一对应,所以用磁头号表示盘面,磁头编号从上到下从0开始。
扇区编号与盘面和磁道不同,各磁道内的扇区都是以1为起始编号的,并且只限于本磁道内有效。所以各个磁道间的扇区编号都是相同的,下限都是0。

主板是如何支持硬盘的
硬盘控制器 与硬盘的关系就像是 显卡和显示器。
一开始:将硬盘和硬盘控制器整合一起,这个接口被称为集成设备电路(IDE)。习惯将硬盘称为IDE硬盘。后期出现硬盘串口接口(SATA)。所以之前的ATA接口只好称为并行ATA(PATA)。
以前一般主机支支持4个并口硬盘,串口硬盘出现后,支持多少取决于主板的能力。
硬盘的并行接口与串行接口
图3-30 左边的线IDE线。以前,主盘从盘分工,主盘装系统。系统兼容性好了,以至区分不是很明显了。
主板上还有2个 IDE 接口。这两个接口也是以0 为起始编号,IDE0,IDE1。不过这两个被称为通道,IDE0叫primary通道,IDE1 叫 Secondary通道。即使是SATA硬盘,他也兼容PATA的编程接口。兼容为王。
主盘 master,从盘slave。disk。
primary通道,secondary通道。通道是channel,每个通道上分别有主盘和从盘。

3.5.3 硬盘控制端口

硬盘控制器属于 IO接口。需要通过读写硬盘控制器的端口来使用硬盘。
端口就是位于 IO控制器的 寄存器。
要想读写硬盘就要通过以下端口号。
硬盘控制器主要端口寄存器
端口分两种。

  1. 向硬盘驱动器中写入命令字
  2. 从硬盘控制器中获取硬盘状态。

一个通道的主从硬盘都用这些端口号。
对某个硬盘操作,需要指定。
通过 device 寄存器。0 主盘,1 从盘。
device 寄存器 和 status 寄存器
端口
在使用硬盘的端口时需要注意的是,同一个端口,在读或写的时候作用可能会有所不同。
例如:0x1F1 端口号,在从中读取数据时,读出的是"读取失败时,存放的ERROR信息"。
向其中写入时,写入的数据是需要读取的扇区数。虽然用途不同,但是是同一个端口。
端口号以及 位数 读写时候的功能
硬盘扇区是通过“柱头-磁头-扇区”定位的(Cylinder Head Sector),简称 CHS
还有一种寻址方式,只将扇区从0开始依次编号,不用考虑扇区的物理结构,称为逻辑块地址(Logical Block Address)LBA
LBA 有 28 和 48 两种。是用28bit或是48bit来描述一个扇区的地址。
书中使用的是LBA24模式。

3.5.4 常用的硬盘操作方法

command 寄存器写入就开始工作了,所以留到最后写。

顺序:

  1. 选通道,写入要写入待操作的扇区数。
  2. 将LBA寄存器 0 - 27 位补充完整。
  3. device中 第6位置1 LBA 模式。第4位选择硬盘(master/slave)。
  4. 向command 寄存器 存入写入命令。
  5. 读取该通道上status 寄存器,判断工作是否完成。
  6. 如果以上是 读硬盘,则进入第7步。否则结束。
  7. 将硬盘数据读出。结束。

硬盘准备好数据后,采用什么方法获取数据?
主要是用:

  1. 查询传送方式。通过状态寄存器,获取状态,看是否能够获取数据。
  2. 中断传送方式。通过中断驱动I/O,当数据设备准备好后,发送中断通知取数据。

3.6 让 MBR 使用硬盘

3.6.1 改造 MBR

由于MBR 只有 512 字节。所以

  1. 初始化环境
  2. 加载内核
    以上两个任务交给 加载器——loader。
    而MBR 负责将loader加载到内存中并运行。

书中的一些可以改变的位置设置:

  1. mbr占据了第0 扇区(LBA起点0,CHS起点1)将loader放到硬盘第2扇区
  2. 尽量写在内存地址低的位置上,书中选定 0x900

MBR 代码:

%include "boot.inc"
section MBR vstart=0x7c00
	mov ax,cs
	mov ds,ax
	mov es,ax
	mov ss,ax
	mov fs,ax
	mov sp,0x7c00 
	mov ax,0xb800 
	mov gs,ax 

;使用 int 0x10 功能号 0x06 清屏
	mov ah,0x06
	mov al,0x00		;上卷行数 0->全部
	mov bl,0x00
	mov bh,0x07
	mov cx,0x0000 ;左上( 0, 0)
	mov dx,0x184f ;右下(80,25)
	int 0x10

; ---------- 在显存中输入信息 ---------
; 输出背景为 黄 色,前景 红 色,并且跳动的字符串 "HELLO WORLD"
	mov bx,0
	mov cx,14
	mov si,0
print:
	mov al,[s+si]
	mov [gs:bx],al
	inc bx
	mov byte [gs:bx],0x24
	inc bx
	add si,1
loop print
	
	mov eax, LOADER_START_SECTOR
	mov bx, LOADER_BASE_ADDR
	mov cx, 1

	call rd_disk_m_16
	jmp LOADER_BASE_ADDR

rd_disk_m_16:
	mov esi,eax
	mov di,cx

	;指定扇区数0x1f2 8bit
	mov dx,0x1f2
	mov al,cl 
	out dx,al

	mov eax,esi 
	;LBA 0-7 8bit
	mov dx,0x1f3
	out dx,al 
	;LBA 8-15 8bit
	mov cl,8
	shr eax,cl
	mov dx,0x1f4
	out dx,al
	;LBA 16-23
	shr eax,cl 
	mov dx,0x1f5
	out dx,al 
	;LBA Device | 24-27
	shr eax,cl 
	and al,0000_1111b
	or  al,1110_0000b ;LBA, DEV主盘
	mov dx,0x1f6
	out dx,al 

	;写入命令
	mov dx,0x1f7
	mov al,0x20
	out dx,al 

	;检测硬盘状态
.not_ready:
	nop ;相当于个停顿
	in al,dx 
	and al,1000_1000b ;忙/准备好
	cmp al,0000_1000b
jnz .not_ready

	;读数据
	mov ax,di
	mov dx,256 ;512/2
	mul dx 
	mov cx,ax ;一共ax个字节

	mov dx,0x1f0
.read_data:
	in ax,dx 
	mov [bx],ax 
	add bx,2
	loop .read_data
ret



s db "1 MBR_start!!!"
times 510 - ($-$$) db 0
db 0x55, 0xaa

boot.inc 代码

LOADER_BASE_ADDR    equ 0x900
LOADER_START_SECTOR equ 0x2

loader.asm 代码

%include "boot.inc"

section loader vstart=LOADER_BASE_ADDR
    mov byte [gs:160],'2'
    mov byte [gs:161],0x24
    mov byte [gs:162],' '
    mov byte [gs:163],0x24
    mov byte [gs:164],'L'
    mov byte [gs:165],0x24
    mov byte [gs:166],'o'
    mov byte [gs:167],0x24
    mov byte [gs:168],'a'
    mov byte [gs:169],0x24
    mov byte [gs:170],'d'
    mov byte [gs:171],0x24
    mov byte [gs:172],'e'
    mov byte [gs:173],0x24
    mov byte [gs:174],'r'
    mov byte [gs:175],0x24
jmp $

编译指令

nasm -I include/ -o loader.bin loader.asm
nasm -I include/ -o mbr.bin mbr.asm
dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc
dd if=loader.bin of=hd60M.img bs=512 count=1 seek=2 conv=notrunc

mbr 将硬盘 中的 loader 代码读到内存中并运行的结果:
mbr 将硬盘 中的loader读入到内存中并运行
loader的最终任务是加载内核。

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

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

相关文章

选择万德L2接口需要遵循什么原则?

万德L2接口是一种可以让程序拥有查询股票相关数据的应用查询编程接口,通过这个数据接口,可以直接调用相应的数据,而不用进行额外的编程工作,甚至不需要理解其中的工作机制,是十分方便快捷的一种数据接口。 但是市场上…

操作系统基础---多线程

文章目录操作系统基础---多线程1.为何引入线程程序并发的时空开销线程的设计思路线程的状态和线程控制块TCB2.线程与进程的比较3.线程的实现⭐1.内核支持线程KST2.用户级线程3.组合方式操作系统基础—多线程 1.为何引入线程 利用传统的进程概念和设计方法已经难以设计出适合于…

方向导数与梯度下降

文章目录方向角与方向余弦方向角方向余弦方向导数定义性质梯度下降梯度下降法(Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度&#xff08…

学习数据库第一天

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、数据库的开启和关闭二、数据库的登录 添加数据库以及表1.登录数据库2.查看数据库三 数据表前言 提示:这里可以添加本文要记录的大概内容&#x…

spring cloud脚手架快速开发 微服务架构 JAVA敏捷开发框架源码

核心技术采用Spring Cloud Alibaba、SpringBoot、Mybatis、Seata、Sentinel、RabbitMQ、FastDFS/MinIO、SkyWalking等主要框架和中间件。 私信了解更多! 功能模块: 1、租户管理:运营人员管理所有的租户创建 2、工作台:普通用户…

支持分布式部署的主流方式 - Session 持久化到 Redis

1.为什么要将 Session 存储在 Redis 中如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载…

码上【call,apply,bind】的手写

一、call (1)官方用法 call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。 语法:function.call(要绑定的this值,参数,参数,…)。不一定这些参数都需要,这些参数都…

寿险业务系统异常处理方案

我们的系统使用的java语言开发,基于Spring框架搭建的业务中台,在讨论业务系统异常处理策略之前,先把java的异常机制进行简单说明。 一、Java的异常机制 1.Java异常分类 【Error】是系统错误或者编译错误,常见的虚拟机运行错误、…

2023,考个软考中级证书稳妥深圳入户,5月考试8月办入户

最新消息!最新消息!最新消息! 2023年2月8日,深圳市发展和改革委员会深圳市公安局深圳市人力资源和社会保障局关于印发《深圳市积分入户办法》的最新通知↓ 来源《深圳市发展和改革委员会》 该积分入户将于2023年2月15日正式实施&…

C++与Lua交互实例 -- 矩阵的加减乘除(版本一)

C与Lua交互实例 – 矩阵的加减乘除(版本一) 关于lua中封装的类模板以及相关知识可参考以下链接: https://ufgnix0802.blog.csdn.net/article/details/128854786 https://ufgnix0802.blog.csdn.net/article/details/128827673 https://ufgnix0…

Python深度学习实战PyQt5窗口切换的堆叠布局示例详解

本文以堆叠窗口控件为例,详细介绍堆叠布局的界面设计和程序实现过程,通过案例带小白创建一个典型的堆叠布局多窗口切换程序软件项目中经常需要多种不同的图形界面,以适应不同的任务场景。选项卡控件(QTackedWidget)通过…

[Java 进阶] synchronized 与 ReentrantLock的区别

祝一切顺利~ 文章目录synchronized 与 ReentrantLock的区别synchronized 与 ReentrantLock的区别 1.ReentrantLock的锁是公平锁,synchronized是非公平锁.(公平锁是指当锁被释放时,由等待时间最长的线程获取锁.非公平锁是锁被释放时,所有线程不论等待时间长短,都一起去竞争) 2.…

小白系列Vite-Vue3-TypeScript:009-屏幕适配

上一篇我们介绍了ViteVue3TypeScript项目中mockjs的安装和配置。本篇我们来介绍屏幕适配方案,简单说来就是要最大程度上保证我们的界面在各种各样的终端设备上显示正常。通用的屏幕适配方案有两种:① 基于rem 适配(推荐,也是本篇要…

线下沙龙|从VUCA到BANI,找到你的“第二曲线”

冷战之后,VUCA盛行,世界已复杂到无可言表;然而,我们正在拼命地理解和适应“VUCA时代”,却又被迷迷糊糊、跌跌撞撞地推进了“BANI时代”。 未来之路在何方?在脚下,却不知该如何去迈? …

elasticsearch使用painless的一些简单例子

文章目录1、背景2、准备数据2.1 mapping2.2 插入数据3、例子3.1 (update)更新文档 id1 的文档,将 age 加 2岁3.2 (update_by_query)如果 province 是北京的话,就将 age 减少1岁3.3 (ctx.op)如果张三的年龄小于20岁就不处理,否则就删除这个文档…

MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量

介绍MLX90316是Tria⊗is旋转位置传感器,提供在设备表面旋转的小偶极磁铁(轴端磁铁)的绝对角位置。得益于其表面的集成磁集中器(IMC),单片设备以非接触式方式感知应用磁通量密度的水平分量。这种独特的传感原理应用于旋转位置传感器,可在机械(…

(1分钟速通面试) 矩阵分解相关内容

矩阵分解算法--总结QR分解 LU分解本篇博客总结一下QR分解和LU分解,这些都是矩阵加速的操作,在slam里面还算是比较常用的内容,这个地方在isam的部分出现过。(当然isam也是一个坑,想要出点创新成果的话 可能是不太现实的 短期来讲 哈…

【电商】订单系统--售后的简易流程与系统关系

用户进行了订单签收并不意味着终结,这只是一个新的开始,因为商品送达后可能会由于运输过程包装或商品有破损,商品本质量并非商品详情中所描述的那样等各种原因使用户进行退货或换货;还有一种场景是用户签收后发现有的商品漏发、少…

线性卡尔曼滤波详解

自动驾驶面临的第一个问题:从哪里来,到哪里去?要解决这个问题,自动驾驶汽车首先需要准确的知道自己在地图上的位置。理所当然的我们可以想到通过GPS来进行定位,但获取GPS信号需要跟卫星进行通信,这就导致它…

简单的洗牌(数据结构系列4)

目录 前言: 1.思想 1.1基本框架的搭建 1.2洗牌操作 1.3揭牌 2.代码运行结果截图 结束语: 前言: 在上一次的博客中小编与大家分享了ArrayList的模拟实现和一些具体的使用方法,那么接下来我们通过一个简单的洗牌练习来巩固一…