硬盤dma讀寫過程

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應小于或等于0x200prdBufAddr.EOT = 0x8000; //最高位為EOT// 物理區域描述符的地址寫入PRDTRWritePortDword(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=0WritePortByte( 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);	// =00WritePortByte( 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, 4000hnotAsserted: 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.pswp.cn/web/63611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63611.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python-基于Pygame的小游戲(貪吃蛇)(一)

前言:貪吃蛇是一款經典的電子游戲,最早可以追溯到1976年的街機游戲Blockade。隨著諾基亞手機的普及,貪吃蛇游戲在1990年代變得廣為人知。它是一款休閑益智類游戲,適合所有年齡段的玩家,其最初為單機模式,后來隨著技術發…

使用k6進行MongoDB負載測試

1.安裝環境 安裝xk6-mongo擴展 ./xk6 build --with github.com/itsparser/xk6-mongo 2.安裝MongoDB 參考Docker安裝MongoDB服務-CSDN博客 連接成功后新建test數據庫和sample集合 3.編寫腳本 test_mongo.js import xk6_mongo from k6/x/mongo;const client xk6_mongo.new…

solon 集成 activemq-client (sdk)

原始狀態的 activemq-client sdk 集成非常方便&#xff0c;也更適合定制。就是有些同學&#xff0c;可能對原始接口會比較陌生&#xff0c;會希望有個具體的示例。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-client&l…

2024 年最新前端ES-Module模塊化、webpack打包工具詳細教程(更新中)

模塊化概述 什么是模塊&#xff1f;模塊是一個封裝了特定功能的代碼塊&#xff0c;可以獨立開發、測試和維護。模塊通過導出&#xff08;export&#xff09;和導入&#xff08;import&#xff09;與其他模塊通信&#xff0c;保持內部細節的封裝。 前端 JavaScript 模塊化是指…

uni-app商品搜索頁面

目錄 一:功能概述 二:功能實現 一:功能概述 商品搜索頁面,可以根據商品品牌,商品分類,商品價格等信息實現商品搜索和列表展示。 二:功能實現 1:商品搜索數據 <view class="search-map padding-main bg-base"> <view class…

最小堆及添加元素操作

【小白從小學Python、C、Java】 【考研初試復試畢業設計】 【Python基礎AI數據分析】 最小堆及添加元素操作 [太陽]選擇題 以下代碼執行的結果為&#xff1f; import heapq heap [] heapq.heappush(heap, 5) heapq.heappush(heap, 3) heapq.heappush(heap, 2) heapq.…

10. 考勤信息

題目描述 公司用一個字符串來表示員工的出勤信息 absent:缺勤late: 遲到leaveearly: 早退present: 正常上班 現需根據員工出勤信息&#xff0c;判斷本次是否能獲得出勤獎&#xff0c;能獲得出勤獎的條件如下: 缺勤不超過一次&#xff0c;沒有連續的遲到/早退:任意連續7次考勤&a…

【計算機網絡】期末考試預習復習|中

作業講解 轉發器、網橋、路由器和網關(4-6) 作為中間設備&#xff0c;轉發器、網橋、路由器和網關有何區別&#xff1f; (1) 物理層使用的中間設備叫做轉發器(repeater)。 (2) 數據鏈路層使用的中間設備叫做網橋或橋接器(bridge)。 (3) 網絡層使用的中間設備叫做路…

前端工程化-Vue腳手架安裝

在現代前端開發中&#xff0c;Vue.js已成為一個流行的框架&#xff0c;而Vue CLI&#xff08;腳手架&#xff09;則為開發者提供了一個方便的工具&#xff0c;用于快速創建和管理Vue項目。本文將詳細介紹如何安裝Vue腳手架&#xff0c;創建新項目以及常見問題的解決方法。 什么…

利用爬蟲獲取的數據能否用于商業分析?

在數字化時代&#xff0c;數據已成為企業獲取競爭優勢的關鍵資源。網絡爬蟲作為一種數據收集工具&#xff0c;能夠從互聯網上抓取大量數據&#xff0c;這些數據在商業分析中扮演著重要角色。然而&#xff0c;使用爬蟲技術獲取的數據是否合法、能否用于商業分析&#xff0c;是許…

羅德與施瓦茨ZN-Z129E網絡分析儀校準套件具體參數

羅德與施瓦茨ZN-Z129E網絡校準件ZN-Z129E網絡分析儀校準套件 1&#xff0c;頻率范圍從9kHz到4GHz&#xff08;ZNB4&#xff09;,8.5GHz(ZNB8)&#xff0c;20GHz(ZNB20)&#xff0c;40GHz(ZNB40) 2&#xff0c;動態范圍寬&#xff0c;高達140 dB 3&#xff0c;掃描時間短達4ms…

如何為IntelliJ IDEA配置JVM參數

在使用IntelliJ IDEA進行Java開發時&#xff0c;合理配置JVM參數對于優化項目性能和資源管理至關重要。IntelliJ IDEA提供了兩種方便的方式來設置JVM參數&#xff0c;以確保你的應用程序能夠在最佳狀態下運行。本文將詳細介紹這兩種方法&#xff1a;通過工具欄編輯配置和通過服…

unity is running as administrator 管理員權限問題

每次打開工程彈出unity is running as administrator的窗口 unity版本2022.3.34f1&#xff0c;電腦系統是win 11系統解決方法一&#xff1a;解決方法二&#xff1a; unity版本2022.3.34f1&#xff0c;電腦系統是win 11系統 每次打開工程都會出現unity is running as administr…

回歸預測 | MATLAB實現CNN-BiGRU-Attention卷積神經網絡結合雙向門控循環單元融合注意力機制多輸入單輸出回歸預測

回歸預測 | MATLAB實現CNN-BiGRU-Attention卷積神經網絡結合雙向門控循環單元融合注意力機制多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實現CNN-BiGRU-Attention卷積神經網絡結合雙向門控循環單元融合注意力機制多輸入單輸出回歸預測預測效果基本介紹程序設計參考資料 預測效…

OneCode:開啟高效編程新時代——企業定制出碼手冊

一、概述 OneCode 的 DSM&#xff08;領域特定建模&#xff09;出碼模塊是一個強大的工具&#xff0c;它支持多種建模方式&#xff0c;并具有強大的模型轉換與集成能力&#xff0c;能夠提升開發效率和代碼質量&#xff0c;同時方便團隊協作與知識傳承&#xff0c;還具備方便的仿…

git暫存

給大家分享幾個git命令&#xff1a; git stash 暫存工作目錄的修改 git stash list 查看暫存列表 git stash apply 恢復暫存內容并保持最近一次暫存記錄&#xff0c;如果有多個暫存記錄&#xff0c;想恢復指定的暫存記錄&#xff0c;可以使用git stash apply stash{}&#xf…

遠程控制軟件新趨勢

隨著數字化浪潮的推進&#xff0c;遠程控制軟件已經成為我們生活中的一部分&#xff0c;它們不僅改變了我們的工作方式&#xff0c;還為日常生活帶來了極大的便利。現在&#xff0c;讓我們來探討遠程控制軟件在數字時代的發展和應用&#xff0c;以及它們如何引領新的辦公趨勢。…

C++如何處理對象的狀態變化?

概念 處理對象的狀態變化是軟件開發中一個重要的課題&#xff0c;尤其是在設計過程中&#xff0c;如何有效管理對象的狀態變化對于軟件的可維護性、可擴展性和整體設計都至關重要。 狀態模式 狀態模式通過將狀態封裝為對象&#xff0c;允許對象在內部狀態改變時改變其行為。…

在Spring中application 的配置屬性(詳細)

application 的配置屬性。 這些屬性是否生效取決于對應的組件是否聲明為 Spring 應用程序上下文里的 Bean &#xff08;基本是自動配置 的&#xff09;&#xff0c;為一個不生效的組件設置屬性是沒有用的。 multipart multipart.enabled 開啟上傳支持&#xff08;默認&a…

C語言編程1.27漢諾塔

題目描述 給定一個由n個圓盤組成的塔&#xff0c;這些圓盤按照大小遞減的方式套在第一根樁柱上。現要將整個塔移動到另一根樁柱上&#xff0c;每次只能移動一個圓盤&#xff0c;且較大的圓盤在移動過程中不能放置在較小的圓盤上面。 輸入格式 輸入由四行&#xff1a; 第一行…