x86使用PID模式检测磁盘是否存在--代码实现

磁盘

视频教程以及实际代码可以看这一个教程

ATA PIO Mode - OSDev Wiki

  • 下面的大部分来自这一个网址的翻译

在磁盘的第一个扇区里面可以有4个描述分区的描述符

电脑有两个总线, Primary Bus, Secondary Bus, 这两个都有一个Msater Driver和一个Slave Driver

image-20240305231011813

According to the ATA specs, PIO mode must always be supported by all ATA-compliant drives as the default data transfer mechanism.

PIO mode uses a tremendous amount of CPU resources because every byte of data transferred between the disk and the CPU must be sent through the CPU’s IO port bus (not the memory). On some CPUs, PIO mode can still achieve actual transfer speeds of 16MB per sec, but no other processes on the machine will get any CPU time.

这里使用的是PIO模式, 这是ATA规定的模式, 这是一个使用CPU进行读取的模式, 这时候CPU不能处理其他的事情

这是一个简单的读取的模式

There is only one wire dedicated to selecting which drive on each bus is active. It is either electrically “high” or “low”, which means that there can never be more than two devices operational on any ATA bus. They are called the master and the slave devices, for no particular reason. The terms ‘master’ and ‘slave’ have largely been abandoned as they inaccurately portray the master drive as having some kind of superiority over the slave drive, or that the latter is dependent on the master. However, these terms will be used in this document. The functionality of the master and slave drives is almost completely identical. There is a special IO port bit that allows a driver to select either drive as the target drive for each command byte.

这一段的大致意思是主磁盘和从磁盘的区分是因为只有一条线进行选择这两个磁盘, 这两个磁盘的速度之类的属性基本没有区别, 没有依附关系

使用的寄存器

An ATA bus typically has ten I/O ports which control its behavior. For the primary bus, these I/O ports are usually 0x1F0 (the “I/O” port base) through 0x1F7 and 0x3F6 (the “Control” port base) through 0x3F7. For the secondary bus, they are usually 0x170 through 0x177 and 0x376 through 0x377.

每一个总线使用10个端口, Primary使用0x1F0-0x1F7(IO)和0x3F6-0x3F7(控制寄存器)

Secondary使用的是0x170- 0x177 and 0x376-0x377.

image-20240305232923123

The standard IRQ for the Primary bus is IRQ14 and IRQ15 for the Secondary bus.

这两个磁盘使用的中断是IRQ14,15

image-20240305232942147

image-20240306185047418

状态寄存器

检测磁盘是不是存在

IDENTIFY command

To use the IDENTIFY command, select a target drive by sending 0xA0 for the master drive, or 0xB0 for the slave, to the “drive select” IO port. On the Primary bus, this would be port 0x1F6. Then set the Sectorcount, LBAlo, LBAmid, and LBAhi IO ports to 0 (port 0x1F2 to 0x1F5). Then send the IDENTIFY command (0xEC) to the Command IO port (0x1F7). Then read the Status port (0x1F7) again. If the value read is 0, the drive does not exist. For any other value: poll the Status port (0x1F7) until bit 7 (BSY, value = 0x80) clears. Because of some ATAPI drives that do not follow spec, at this point you need to check the LBAmid and LBAhi ports (0x1F4 and 0x1F5) to see if they are non-zero. If so, the drive is not ATA, and you should stop polling. Otherwise, continue polling one of the Status ports until bit 3 (DRQ, value = 8) sets, or until bit 0 (ERR, value = 1) sets.

At that point, if ERR is clear, the data is ready to read from the Data port (0x1F0). Read 256 16-bit values, and store them.

可以使用这一个命令选择一个磁盘, 或者检测一个磁盘是不是存在

向一个磁盘的0x1F6(0x176)写入0xA0或者0xB0选择主机和从机

image-20231015131611883

这里使用的时候最好使能一下LBA, 用于读取数据

之后把LBAlo, LBAmid, and LBAhi IO ports to 0 (port 0x1F2 to 0x1F5)这几个寄存器设置为0

向0x1F7端口发送命令0xEC去检测这一个磁盘是不是存在, 可以通过读取0x1F7, 如果是0, 不存在, 如果是其他的值, 等待bit7清零

这个时候你可以看一看0x1F4 and 0x1F5是不是非零的值, 如果是的话这不是一个ATA设备, 如果是的话, 等待bit 3 为1, 或bit 0为1(出错).

At that point, if ERR is clear, the data is ready to read from the Data port (0x1F0). Read 256 16-bit values, and store them.

如果没有出错, 从0x1F0读取256字节的磁盘信息

错误处理

These devices will also write specific values to the IO ports, that can be read. Seeing ATAPI specific values on those ports after an IDENTIFY is definitive proof that the device is ATAPI – on the Primary bus, IO port 0x1F4 will read as 0x14, and IO port 0x1F5 will read as 0xEB. If a normal ATA drive should ever happen to abort an IDENTIFY command, the values in those two ports will be 0. A SATA device will report 0x3c, and 0xc3 instead

如果是其他的设备的话, 这几个端口会被设置为对应的值, 如果是一个普通的ATA设备, 端口为0

获取的数据

uint16_t 100 through 103 taken as a uint64_t contain the total number of 48 bit addressable sectors on the drive. (Probably also proof that LBA48 is supported.)

主要关注这64位, 记录的是这一个磁盘的扇区数

实际的实现

static int identify_disk (disk_t * disk) {
    outb(0x1F6(状态寄存器), 根据盘符设置);
    outb(命令端口, 0xEC);

    // 检测状态,如果为0,则控制器不存在
    int err = inb(DISK_STATUS(disk));
    if (err == 0) {
        log_printf("%s doesn't exist\n", disk->name);
        return -1;
    }

    // 等待数据就绪, 此时中断还未开启,因此暂时可以使用查询模式
    err = ata_wait_data(disk);//检测一下BUSY以及ERR位
    if (err < 0) {
        log_printf("disk[%s]: read failed!\n", disk->name);
        return err;
    }
    
    uint16_t buf[256];
    ata_read_data(disk, buf, sizeof(buf));//使用inw从DATA端口获取数据
    disk->sector_count = *(uint32_t *)(buf + 100);
    disk->sector_size = SECTOR_SIZE;            // 固定为512字节大小
    return 0;
}

实际的读取

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ceph qos 限速

因为1 Mbps 1,000,000 bps rbd_qos_bps_limit、rbd_qos_read_bps_limit和rbd_qos_write_bps_limit都是与RBD&#xff08;Rados Block Device&#xff09;的QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;相关的参数&#xff0c;用于限制I/O操作的速率。这…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

【MATLAB源码-第157期】基于matlab的海马优化算法(SHO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 海马优化器&#xff08;Sea Horse Optimizer, SHO&#xff09;是一种近年来提出的新型启发式算法&#xff0c;其设计灵感来源于海洋中海马的行为模式&#xff0c;特别是它们在寻找食物和伴侣时表现出的独特策略。海马因其独特…

【vue】ant-design弹出框无法关闭和runtimecore提示isFucntion is not function的问题修复

【vue】ant-design弹出框无法关闭和runtimecore提示isFucntion is not function的问题修复&#xff0c;初步分析是vue发布3.4版本以后引起的兼容性问题。 问题截图&#xff1a; 1.isFucntion is not function&#xff0c;是由于vue升级后众多插件版本不匹配造成的问题 2.弹框…

iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

移动端的自动化测试&#xff0c;最常见的是 Android 自动化测试&#xff0c;我个人觉得 Android 的测试优先级会更高&#xff0c;也更开放&#xff0c;更容易测试&#xff1b;而 iOS 相较于 Android 要安全稳定的多&#xff0c;但也是一个必须测试的方向&#xff0c;这个系列文…

计算机能转嵌入式吗?

我是电气工程转的嵌入式单片机方向。 那是2011年的事了&#xff0c;当时贴吧也是一片哀嚎。 有找不到工作的&#xff0c;也有干了7,8年月薪不过万的。 这么年过去了&#xff0c;如果你仔细观察每个行业&#xff0c;都有一群骂娘的&#xff0c;也一群混得风生水起的。 主要和圈子…

IDEA修改git提交者的信息

git提交后&#xff0c;idea会记录下提交人的信息&#xff0c;如果不修改提交人信息的话&#xff0c;会有一个默认值。避免每次提交都要填提交人信息&#xff0c;直接设置成自己想要的默认值&#xff0c;该怎么操作&#xff1f; 提交的时候在这里修改提交人信息 避免每次都去设置…

显示高考天数倒计时——vba实现

以下代码实现高考倒计时&#xff1a; Sub 高考倒计时() 高考日期 CDate("06,07," & Year(Date)) If Date > 高考日期 Then高考日期 CDate("06-07-" & Year(Date) 1) End If 年月日 Year(Date) & "年" & Month(Date) &am…

【Python】新手入门(5):# -*- coding: UTF-8 -*- 的作用详解

【Python】新手入门&#xff08;5&#xff09;&#xff1a;# -*- coding: UTF-8 -*- 的作用详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础…

code: 500 ] This subject is anonymous - it does not have any identifying

项目场景&#xff1a; 相关背景&#xff1a; 使用idea 开发java 项目&#xff0c;前端页面请求 页面中相关的接口时&#xff0c;idea 控制台有报错信息出现&#xff0c;前端请求失败。 问题描述 问题&#xff1a; 使用idea 开发java 项目&#xff0c;前端页面请求 页面中相…

【Linux】磁盘情况、挂载,df -h无法看到的卷

文章目录 解决挂载、解决挂载完重启就消失1、查看linux下的硬盘挂载的空间、使用空间2、查看没有挂载的硬盘是否检测在系统中3、挂载 &#xff08;挂载完&#xff0c;要在/etc/fstab 下面配置挂载信息 要不然重启挂载就消失了&#xff09; 解决挂载、解决挂载完重启就消失 linu…

STP---生成树协议

STP的作用 a)Stp通过阻塞端口来消除环路&#xff0c;并能够实现链路备份目的 b)消除了广播风暴 c)物理链路冗余&#xff0c;网络变成了层次化结构的网络 STP操作 选举一个根桥每个非根交换机选举一个根端口每个网段选举一个指定端口阻塞非根&#xff0c;非指定端口 STP--生成树…

windows11配置电脑IP

windows11配置电脑IP 选择"开始>设置>“网络&Internet >以太网”。在 "属性"下&#xff0c;编辑IP地址&#xff0c;子网掩码&#xff0c;网关以及DNS。

【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0

目录 一、 Kubernetes 的概述 二、服务器配置 2.1 服务器部署规划 2.2服务器初始化配置 三、安装Docker/kubeadm/kubelet【所有节点】 3.1 安装Docker 3.2 添加阿里云YUM软件源 3.3 安装kubeadm&#xff0c;kubelet和kubectl 四、部署Kubernetes Master 五、部署Kube…

企业对接Walmart平台API流程 On-request Reports API(二)

对接On-request Reports API 1、对接指南1.1 报告生成时间1.2 报告保留期1.3 请求限制1.4 报告请求工作流如何申请报告第 1 步&#xff1a;申请取消报告第 2 步&#xff1a;获取报表可用性状态第 3 步&#xff1a;下载报告 URL 2、代码实现2.1、获取访问API的token2.2、构建公共…

Codeforces Round 932 (Div. 2) --- C. Messenger in MAC --- 题解

C Messenger in MAC 题目大意&#xff1a; 思路解析&#xff1a; 答案计算为 , 可以发现当所选的几个信息固定后&#xff0c;其实后面的一项就变为b_max - b_min&#xff0c;得到了这个结论之后&#xff0c;其实我们可以直接把整个信息按照b进行排序&#xff0c;枚举l,r&am…

Day36 网络概述、IP划分、网络模型

文章目录 网络发展史局域网和广域网局域网&#xff08;LAN&#xff09;广域网&#xff08;Wan&#xff09; 光猫路由器 IP地址基本概念地址划分特殊地址&#xff08;后续编程使用&#xff09;IP地址转换端口字节序 网络模型网络模型OSI模型&#xff08;了解&#xff09;TCP/IP模…

Python中的模块包第三方库详解

模块&包 模块 一个.py文件就是一个模块&#xff0c;里面是一些函数和变量&#xff0c;需要的时候可以导入。 模块命名规范: 1.以英文开头&#xff0c;不出现中文 2.模块名不应与系统内置函数重名 包 包本身就是一个文件夹&#xff0c;如果文件夹内有__init__.py文件&…

安防摄像头(IPC)的步进马达及IR-CUT驱动国产芯片——D6212

应用领域 安防摄像头&#xff08;IPC&#xff09;的步进马达及IR-CUT驱动。 02 功能介绍 D6212内置8路带有续流二极管的达林顿驱动管阵列和一个H桥驱动&#xff0c;单芯片即可实现2个步进电机和一个IR-CUT的直接驱动&#xff0c;使得电路应用非常简单。单个达林顿管在输入电…

跨域报错(预请求(OPTIONS)的问题)

查原因 是预请求(OPTIONS)的问题 解决方法&#xff08;后端改&#xff09; 指路博客.NET处理VUE OPTIONS请求问题_.net option请求-CSDN博客