手写操作系统--读写硬盘操作

news2024/11/17 11:54:06

以下图片均来自王道考研视频我们先来看看硬盘的结构:

 这是物理图上的磁盘构造。

 一个盘片被分成一个个的磁道。

 在划分一下就会出现我们的扇区,每个扇区的大小是固定的,一般来说是512个字节。最内侧的扇区面积小,因此数据密度就密。在我们操作磁盘的时候,一般就以扇区为最小单位。

这样许多个盘片组合起来就是一整个磁盘。下图是一个解剖图:

 这些磁头都是连接在同一个磁臂上的。这样就组成了一个柱子形状,我们称之为柱面。有了上图的基础,我们就能用柱面号,盘面号,扇区号来唯一标识一块磁盘块。其实柱面号也可以理解为我们要指定的磁道是哪一个,也就是王道这句话:

 如果想读写一个磁盘大致的操作分为如下几步:

 我们有这些知识就足够我们理解磁盘读写了。

扇区也就是我们操作磁盘的最小单位,一次最少也要对一个扇区读写,最多能达到256个扇区。

想要操作硬盘读写,我们需要对端口进行输入输出,也就是IO端口形式。

这个端口不同于网络协议中的端口,它是外部设备内部的寄存器,是用来提供一个通道给我们操控这个外部设备的。也称之为端口。因此分配给硬盘的寄存器是需要我们查阅的。

硬盘读写是有两种形式:

-CHS模式  也就是/柱面/磁头/磁道  也就是用坐标系来标识一个磁盘块,这个模式比较复杂,一般不用。

在Linux中,硬件外部设备都被抽象成了文件,硬盘也不例外,每个扇区都可以任务是一个文件,因此产生出了另外一种模式 -LBA模式 /逻辑块地址/ 只需要知道想操作哪一块扇区就完事了很方便

LBA模式也有2种,一种是用28位比特来表示一个扇区,一个是48位比特来表示一个扇区,分别成为LBA28,LBA48,我们只用LBA28模式就好了。

下面我们介绍下硬盘控制器的端口:

 一个Primary通道上是可以挂2个硬盘,一个主盘,一个从盘,但是做实验时我们只有一个主盘因此暂时不管从盘的问题。磁盘是很复杂的东西,我们写操作系统小麻雀的时候,用以上的端口完全足够了。下面介绍下这些端口的作用:

0x1F0 是一个16位的端口,用来读写数据的

0x1F1 检测前一个指令的错误(一般不用,出错的时候用)

0x1F2 用于读写扇区的数量

0x1F3 起始扇区的0-7位

0x1F4 起始扇区的8-15位

0x1F5 起始扇区的16-23位

0x1F6 第四位是存的剩下4位(28比特的最后四位),图示如下:

 0x1F7 此端口是用来存储硬盘执行的命令只介绍三个我们用的:

0xEC 硬盘识别

0x20 读扇区

0x30 写扇区

基本上就介绍完了。下面我们开始上代码(我会给出相应详细的注释):

;第一步
;初始化一些寄存器(数据)
mov edi,0x1000  ;读到内存的哪个位置
mov ecx,2  ;起始扇区
mov bl,4    ;扇区数量
call read_disk  ;调用读扇区这个函数
;第二步实现read_disk函数
read_disk:
     mov dx,0x1f2  ;读写扇区数量,参考前面讲的寄存器
     mov al,bl    ;读取扇区数量放入al寄存器
     out dx,al  ;往端口写

     inc dx ;0x1f3
     mov al,cl ;起始扇区的低八位   
     out dx,al

     inc dx ;0x1f4
     shr ecx,8 ;讲中八位移到低8位的操作 右移操作符
     mov al,cl ;起始扇区的中八位   
     out dx,al

     inc dx ;0x1f5
     shr ecx,8 ;将高八位移到低8位的操作
     mov al,cl ;起始扇区的高八位   
     out dx,al

     inc dx ;0x1f6
     shr ecx,8
     and cl,0b1111 ;将高4位置为0
     
     mov al,0b1110_0000 ;0x1f6的device寄存器 参考上图
     or al,cl ;合二为一
    
     inc dx ;0x1f7
     mov al,0x20    ;读操作
     out dx,al
     
     xor ecx,ecx        ;ecx清0
     mov cl,bl        ;得到读写扇区的数量  循环变量作用于loop
     
     .read:
          push cx
          call .waits ;等待数据  
          call .reads; 读取扇区
          pop cx
          loop .read
      ret
      
      .waits:
           mov dx,0x1f7      ;使用status寄存器 检索硬盘状态
           .check:
               in al,dx       ;往端口读
               jmp $+2   ;空指令
               jmp $+2
               jmp $+2
               and al,0b1000_1000   ;将第4位和第八位清0
               cmp al,0b0000_1000   ;判断DRQ是否准备好数据  cmp指令影响ZF位
               jnz .check           ;如果不等于循环检查 直到DRQ为1为止
           ret
     
       .reads:
             mov dx,0x1f0    ;读硬盘操作
             mov cx,256      ;一次读取一个字 循环变量
             .readw:
                  in ax,dx
                   jmp $+2   ;空指令
                   jmp $+2
                   jmp $+2
                   mov [edi],ax  ;将读取的数据放到0x1000内存位置
                   add edi,2     ;每次加2
                   loop .readw
             ret

效果图可以参考内核加载器那篇文章,用的就是此套函数将加载器加载到0x1000的内存位置,写硬盘逻辑刚好是相反的,目前还没用到,就没有实现此功能。

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

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

相关文章

c++11 标准模板(STL)(std::basic_istream)(一)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式…

C#核心知识回顾——11.各数据集合的汇总区分、委托、事件、匿名函数

变量: 无符号 byte正8位 ushort正16位 uint正32位 ulong正64位 有符号 sbyte8位 short16位 int32位 long64位 浮点数 float double decimal 特殊 char bool string 复杂数据容器: 枚举enum 结构体struct 数组(一维、二维、交错) [] [,] [][] 类 数据集合&#xff1a;…

ChatGPT 提示词设置

提示词 Prompt&#xff08;提示词&#xff09;&#xff1a;当我们询问GPT时&#xff0c;发送的消息就是Prompt。 通过给出合适的Prompt&#xff0c;可以让GPT了解我们的想法&#xff0c;在根据我们的想法做出更加合适的判断&#xff0c;帮助我们完成任务&#xff0c;提高效率。…

Oracle存储过程的使用DEMO(一)

文章目录 Oracle存储过程的使用DEMO&#xff08;一&#xff09;1. Oracle中块的使用2. IF使用2.1 IF...ELSE...2.2 IF嵌套 3. CASE...WHEN...4. LOOP5. WHILE6. FOR Oracle存储过程的使用DEMO&#xff08;一&#xff09; 1. Oracle中块的使用 DECLAREI NUMBER; BEGINSELECT EM…

Obfuscar的使用

1、在程序中nuget安装Obfuscar 2、在工程中新建Obfuscar.xml文件&#xff0c;内容如下 <?xml version1.0?> <Obfuscator><!-- 输入的工作路径&#xff0c;采用如约定的 Windows 下的路径表示法&#xff0c;如以下表示当前工作路径 --><!-- 推荐使用当前…

【Spring】项目创建和使用

一、Spring 的概念 Spring : 包含众多工具方法的 IoC 容器。 Spring 的核心 &#xff1a;IoC &#xff08;控制反转&#xff09;&#xff0c; DI (依赖注入)。 loC &#xff08;Inversion of Control&#xff09;翻译成中文就是 “控制反转” 的意思&#xff0c;控制反转一种…

嵌入式QT- QT使用MQTT

目录 一、MQTT介绍 二、MQTT概念 2.1 订阅(Subscribtion) 2.2 会话&#xff08;Session&#xff09; 2.3 主题名&#xff08;Topic Name&#xff09; 2.4 主题筛选器&#xff08;Topic Filter&#xff09; 2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平…

2.1.cuda驱动API-概述

目录 前言1. Driver API概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记 本次课程学习精简 CUDA 教程-Driver API 概述 课程大纲可看下…

【UE】点击场景中的物体生成介绍标签

效果 步骤 首先创建一个控件蓝图添加如下控件 给水平框控件添加了一段动画&#xff0c;让该控件显示2秒钟&#xff0c;然后在2~3秒间位置上移并且不透明度减少 在图表中播放动画&#xff0c;延迟3秒后移除控件蓝图 在玩家控制的Pawn中添加如下节点 首先由“由通道检测线条”节…

基于Swing的校园管理系统

1 引言 1.1项目背景 我校积极举办组织学生参加各级各种科技、文艺、体育等校园文化活动&#xff0c;寓思想品德教育于生动活泼、形象具体的校园文化活动中。由于学校各级通讯不太方便&#xff0c;活动筹备过程中&#xff0c;无论是活动参与者的报名、观众的报名还是组织者的…

Image Sensor的FSIN/VSYNC

本文介绍Image Sensor的FSIN/VSYNC。 产品开发过程(比如3D成像)中&#xff0c;有时会遇到需要2个及以上的Image Sensor同步采集&#xff0c;因此&#xff0c;Image Sensor厂家对于他们的产品都提供了同步功能&#xff0c;也就是我们经常所见的FSIN/VSYNC(OV),XVS(Sony IMX3系列…

飞行动力学 - 第6节-part1-喷气式飞机的航时及等高航程 之 基础点摘要

飞行动力学 - 第6节-part1-喷气式飞机的航时及等高航程 之 基础点摘要 1. 续航性能2. 巡航受力运动方程3. 喷气式飞机3.1 航时3.2 航程3.3 等高巡航 4. 参考资料 1. 续航性能 耗油率航程航时 2. 巡航受力运动方程 6个方程表达式来进行表达&#xff1a; 3. 喷气式飞机 3.1 …

chatgpt api + function calling + 高德天气API + google custom search【联谷歌,联高德】

OpenAI 发布几个重磅更新 1、 开放 16k 上下文的 GPT-3.5-Turbo 模型&#xff08;gpt-3.5-turbo-16k&#xff09;&#xff0c;是目前的4倍 2、 新的 GPT-4 和 3.5 Turbo 模型 3、Chat Completions API 中的新增加函数调用功能 &#xff08;实时获取网络数据成为可能&#xff0…

SpringBoot2+Vue2实战(十二)springboot一对一,一对多查询

新建数据库表 Course Data TableName("t_course") public class Course implements Serializable {private static final long serialVersionUID 1L;/*** id*/TableId(value "id", type IdType.AUTO)private Integer id;/*** 课程名称*/private String…

如何成为微软MVP?

对一个普通的开发人员来说&#xff0c;最大的认可就是得到微软官方的MVP 认证了&#xff0c;是一份对技术人的荣誉证书。 微软的MVP是相对公平公正的&#xff0c;只要你热爱技术&#xff0c;热爱分享&#xff0c;在一定的领域里有足够的深度&#xff0c;就会得到微软官方的认证…

【沐风老师】3dMax使用Dreamscape插件创建漂亮的日落场景教程

在本教程中,您将学习如何利用3dMax和DreamScape在平静的海面上创造一个美丽的日落效果。DreamScape是3dMax的一套复杂的插件,可以让你创造和呈现现实的景观、海景、天空、云层、户外照明等等。 【最后效果预览】 步骤1&#xff1a;首先,要用DreamScape来呈现一个场景,你需要创…

【Linux学习】日积月累——进程(1)

一、背景 1.1 冯诺依曼体系结构 我们常见的计算机、服务器等设备大部分遵循冯诺依曼体系。 图1 冯诺依曼体系结构 当前&#xff0c;我们所认识的计算机&#xff0c;主要由各类硬件组成&#xff1a; 输入单元&#xff1a;包含键盘、鼠标、扫描仪、写板等&#xff1b;中央处理器…

Unity游戏开发之游戏动画(Unity动画系统)

文章目录 Unity动画系统动画片段 Animation Clip在Unity中制作动画动画复用 替身系统 AvatarAnimator 组件 Animator Component动画状态机 Animator Controller动画状态动画状态的类型动画状态的属性 动画状态机----动画转换转换属性的配置面板 、、、、 Unity动画系统 Unity动…

selenium 02

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 等待浏览器的操作键盘事件鼠标事件定位一组元素多层框架定位下拉框处理弹窗处理上传文件操作关闭浏览器切换窗口截图 等待 s…

SOLIDWORKS小问题解答 硕迪科技

众所周知&#xff0c;SOLIDWORKS的使用者非常多&#xff0c;在使用过程中呢也会有一些小问题&#xff0c;前几天就有朋友来咨询了两个问题&#xff0c;可能其他使用者也有这样的问题&#xff0c;所以今天硕迪科技统一为大家解答 问题一&#xff1a;SOLIDWORKS装配图中的颜色怎么…