硬盘dma读写过程

news2024/12/22 18:46:54

pci初始化时,遍历pci上的设置,如果BaseClassCode==1,则为大容量存储控制器,包括硬盘控制器、固态硬盘控制器、光盘驱动控制器、RAID控制器等。

BaseAdder4为DMA控制器基地址,包含两个控制器,主控制器,次控制器,每个占8字节。

dma只能使用物理地址,最好开启硬盘状态中断。

具体过程见代码

//主控制器占8位,次控制器占用8字节,意义相同
#define DMA_COMMAND_REG     0            // dma主控命令寄存器的偏移 1字节,第1、3字节保留,没有用途
//第3位置为0时,表示读扇区,DMA传送方向为从IDE设备到内存;为1时,表示写扇区,方向为从内存到IDE设备。
//第0位置为0时,表示停止DMA传输;为1时表示启动DMA传输
//
#define DMA_STATUS_REG      2            // dma主控状态寄存器的偏移
//第0位置为1时,正在进行DMA传输;第1位置为1时,表示DMA传送出现了一个错误;
//第2位置为1时,IDE设备已产生一个中断请求(DMA传输已完成);
//第5位置为1时,表示设备0(主盘)能够执行DMA操作;
//第6位置为1时,表示设备1(从盘)能够执行DMA操作;
//第7位置为1时,表示设备0和设备1不能同时执行DMA操作。

#define DMA_PRD_ADDR_REG     4            // 物理区域描述符指针寄存器的偏移
//物理区域描述符表,连续排列,每个项占8字节,

typedef struct {
	DWORD addr; //前4位为缓存区物理地址,
	WORD len; 	//当前块长度,
	WORD EOT; 	//只使用最高位
}__attribute__((packed)) PRD_ADD;
#define pio_base_addr1      0x01F0        // 主ATA设备控制块寄存器基地址
#define pio_base_addr2      0x03F0        // 主ATA命令命令块寄存器基地址
void dma_read_sectors(DWORD bmcr_base_addr, DWORD lbaSector, PVOID buf,
		WORD len) {
	PRD_ADD prdBufAddr;             //物理区域描述符地址

//	bufferaddr               // 内存缓冲区地址
	// Start/Stop=0, 停止以前的DMA传输
	WritePortByte(bmcr_base_addr + DMA_COMMAND_REG, 0x00);
	// 清除主控状态寄存器的Interrupt和Error位
	WritePortByte(bmcr_base_addr + DMA_STATUS_REG, 6);
	//物理区域描述符表,连续排列	EOT=1 表示为最后一个
	prdBufAddr.addr = (DWORD) buf;	//这里应为物理地址
	prdBufAddr.len= len; //len应小于或等于0x200
	prdBufAddr.EOT = 0x8000; //最高位为EOT
	// 物理区域描述符的地址写入PRDTR
	WritePortDword(bmcr_base_addr + DMA_PRD_ADDR_REG,
			MiGetPhysics(&prdBufAddr));
	// 主控命令寄存器的R/W=1, 表示写入内存(读取硬盘)
	WritePortByte(bmcr_base_addr + DMA_COMMAND_REG, 8);
	// 等待硬盘BSY=0和DRQ=0
	//busy_wait();
	// 设置设备/磁头寄存器的DEV=0
	WritePortByte( pio_base_addr1 + 6, 00);
	// 等待硬盘BSY=0和DRQ=0
	//busy_wait();
	// 设备控制寄存器的nIEN=0, 允许中断
	WritePortByte( pio_base_addr2 + 6, 00);
	// 设置ATA寄存器
	WritePortByte( pio_base_addr1 + 1, 00);	// =00
	WritePortByte( pio_base_addr1 + 2, 1);	// numSect扇区数量
	WritePortByte( pio_base_addr1 + 3, lbaSector >> 0);	// LBA第7~0位
	WritePortByte( pio_base_addr1 + 4, lbaSector >> 8);	// LBA第15~8位
	WritePortByte( pio_base_addr1 + 5, lbaSector >> 16);	// LBA第23~16位
	// 设备/磁头寄存器:LBA=1, DEV=0, LBA第27~24位
	WritePortByte( pio_base_addr1 + 6, 0x40 | (lbaSector >> 24));
	// 设置ATA命令寄存器
	WritePortByte( pio_base_addr1 + 7, 0x0C8);	// 0C8h=Read DMA
	// 读取主控命令寄存器和主控状态寄存器
	ReadPortByte(bmcr_base_addr + DMA_COMMAND_REG);
	ReadPortByte(bmcr_base_addr + DMA_STATUS_REG);
	// 主控命令寄存器的R/W=1,Start/Stop=1, 启动DMA传输
	WritePortByte(bmcr_base_addr + DMA_COMMAND_REG, 9);
	// 现在开始DMA数据传送
	// 检查主控状态寄存器, Interrupt=1时,传送结束
	//mov 	ecx, 4000h
	notAsserted: while (!(ReadPortByte(bmcr_base_addr + DMA_STATUS_REG) & 4)) {
		hlt();
	};
	// 清除主控状态寄存器的Interrupt位
	WritePortByte(bmcr_base_addr + DMA_STATUS_REG, 4);
	// 读取主控状态寄存器
	ReadPortByte(bmcr_base_addr + DMA_STATUS_REG);
	// 主控命令寄存器的Start/Stop=0, 结束DMA传输
	WritePortByte(bmcr_base_addr + DMA_COMMAND_REG, 00);
}

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

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

相关文章

网络安全防范

实践内容 学习总结 PDR,$$P^2$$DR安全模型。 防火墙(Firewall): 网络访问控制机制,布置在网际间通信的唯一通道上。 不足:无法防护内部威胁,无法阻止非网络传播形式的病毒,安全策略…

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT(Transient Execution )Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…

c4d动画怎么导出mp4视频,c4d动画视频格式设置

宝子们,今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的,让你能轻松理解和掌握,不管是理论基础,还是实际操作和技能技巧,都能学到,快速入门然后提升自己哦。 c4d动…

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架,适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统,支持用户注册、登录、发布文章等功能。 步骤: 安装 Flask 和其他必要库: 在开发博客之前,首…

嵌入式单片机的运行方式详解

程序的运行方式轮询系统 指的是在程序运行时,首先对所有的硬件进行初始化,然后在主程序中写一个死循环,需要运行的功能按照顺序进行执行,轮询系统是一种简单可靠的方式,一般适用于在只需要按照顺序执行的并且没有外部事件的影响的情况下。 程序的运行过程中出现如按键等需…

学技术学英文:SpringBoot的内置监控组件-Spring Boot Actuator

导读: Spring Boot Actuator是Spring Boot提供的一个模块,简单配置后就能开启,属于拿来即用,具体功能如下: 监控和管理Spring Boot应用 Spring Boot Actuator提供了一组REST端点和命令行工具,用于查看应…

「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具

本篇将带你实现一个评分统计工具,用户可以对多个选项进行评分。应用会实时更新每个选项的评分结果,并统计平均分。这一功能适合用于问卷调查或评分统计的场景。 关键词 UI互动应用评分统计状态管理数据处理多目标评分 一、功能说明 评分统计工具允许用…

压缩glb模型文件

使用?gltf-pipeline进行压缩: GitHub地址[这里是图片001]https://github.com/CesiumGS/gltf-pipeline 1. 安装gltf-pipeline npm install -g gltf-pipeline2. 在glb文件目录打开cmd进行命令行压缩: // cmd: gltf-pipeline -i glb.glb -d -s以下是 -…

创建SpringBoot项目的五种方式

1. 使用SpringBoot官方模板创建 1.1 IDEA集成创建 File > new Project 目前SpringBoot官方对于SpringBoot模板版本都比较新,所以对Java的依赖版本也很新,这里可以看到已经不支持jdk8了,并且只有SpringBoot3版本 我们选择好之后点击…

软件维护的实施

软件维护活动 (1) 维护机构 除了较大的软件开发公司外,通常在软件维护工作方面,不保持正式的维护机构。维护往往是在没有计划的情况下进行的。虽然不要求建立一个正式的维护机构,但是在开发部门,确立一个非正式的维护机构则是非常…

stm32 rtc 详解

目录 L151 RTC 唤醒代码 方式一 通过 RTC Alarm Interrupt:(基本和F1系列一样): L151 RTC 唤醒代码 方式二 通过 RTC WakeUp Interrupt F103VE RTC 闹钟唤醒代码 (103RC 没有闹钟中断): RTC(real time…

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具,并取消勾选“识别和存储面邻域信息”,如下: 2、得到的线要素,如下:

机器人国际会议IROS论文latex模板

机器人国际会议IROS论文latex模板 文档 root.tex 可以配置为 US Letter 纸或 A4。请注意以下重要行:\documentclass[letterpaper, 10 pt, Conference]{ieeeconf} % 如果需要 a4paper,请注释掉此行%\documentclass[a4paper, 10pt, Conference]{ieeeconf} …

JVM和数据库面试知识点

JVM内存结构 主要有几部分:堆、栈、方法区和程序计数器 堆是JVM中最大的一块内存区域,用于存储对象实例,一般通过new创建的对象都存放在堆中。堆被所有的线程共享,但是它的访问时线程不安全的,通常通过锁的机制来保证线…

数据结构:栈和队列的实现

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。 压栈:栈…

实现 WebSocket 接入文心一言

目录 什么是 WebSocket? 为什么需要 WebSocket? HTTP 的局限性 WebSocket 的优势 总结:HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …

开源轮子 - Logback 和 Slf4j

spring boot内置:Logback 文章目录 spring boot内置:Logback一:Logback强在哪?二:简单使用三:把 log4j 转成 logback四:日志门面SLF4J1:什么是SLF4J2:SLF4J 解决了什么痛…

MFC/C++学习系列之简单记录13

MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧! memset memset通常在初始化变量或清空内存区域的时候使用,可以对变量设定特定的值。 使用: 头文件: C&#…

Layui table不使用url属性结合laypage组件实现动态分页

从后台一次性获取所有数据赋值给 Layui table 组件的 data 属性,若数据量大时,很可能会超出浏览器字符串最大长度,导致渲染数据失败。Layui table 结合 laypage 组件实现动态分页可解决此问题。 HTML增加分页组件标签 在table后增加一个用于…

网络方案设计

一、网络方案设计目标 企业网络系统的构成 应用软件 计算平台 物理网络及拓扑结构 网络软件及工具软件 网络互连设备 广域网连接 无论是复杂的,还是简单的计算机网络,都包括了以下几个基本元素 : 应用软件----支持用户完成专门操作的软件。…