1. 程式人生 > >cpu指令如何讀寫硬碟

cpu指令如何讀寫硬碟

《cpu解讀一》中,我們提到cpu的主要作用之一就是控制裝置之間的資料互動。這其中自然也包括了硬碟。系統的所有資料基本都在硬碟中,所以知道怎麼讀寫硬碟,對程式來說非常重要,所以我們先來探索下傳說中的pio模式。

cpu要想直接訪問裝置裡的資料,必須對裝置儲存空間進行編址。而硬碟資料資料太大,直接編址資料線成本太高,於是設計上在這類裝置和匯流排之間加了一個控制器。這個控制器裡有少量暫存器可以被cpu訪問,而這個控制器又能控制硬碟驅動器讀寫資料,所以,cpu通過對硬碟控制器裡的少量io暫存器的讀寫來控制對整個硬碟的讀寫。cpu告訴磁碟控制器讀哪些地址的資料,磁碟控制器讀好之後放入能被 cpu訪問的資料暫存器中,再將這裡的資料傳給記憶體

,這確實是個不錯的辦法。

首先,我們先找到硬碟控制器io埠地址的分配,0×170 — 0×177 IDE 硬碟控制器 1
0x1F0 — 0x1F7 IDE 硬碟控制器 0。更詳細的說明如下:

埠號     讀還是寫   具體含義
1F0H       讀/寫      用來傳送讀/寫的資料(其內容是正在傳輸的一個位元組的資料)
1F1H       讀         用來讀取錯誤碼
1F2H       讀/寫      用來放入要讀寫的扇區數量
1F3H       讀/寫      用來放入要讀寫的扇區號碼
1F4H       讀/寫      用來存放讀寫柱面的低8位位元組
1F5H       讀/寫      用來存放讀寫柱面的高2位位元組(其高6位恆為0)
1F6H       讀/寫      用來存放要讀/寫的磁碟號及磁頭號
第7位     恆為1
第6位     恆為0
第5位     恆為1
第4位     為0代表第一塊硬碟、為1代表第二塊硬碟
第3~0位    用來存放要讀/寫的磁頭號
1f7H       讀         用來存放讀操作後的狀態
第7位     控制器忙碌
第6位     磁碟驅動器準備好了
第5位     寫入錯誤
第4位     搜尋完成
第3位     為1時扇區緩衝區沒有準備好
第2位     是否正確讀取磁碟資料
第1位     磁碟每轉一週將此位設為1,
第0位     之前的命令因發生錯誤而結束
寫         該位埠為命令埠,用來發出指定命令
為50h     格式化磁軌
為20h     嘗試讀取扇區
為21h     無須驗證扇區是否準備好而直接讀扇區
為22h     嘗試讀取長扇區(用於早期的硬碟,每扇可能不是512位元組,而是128位元組到1024之間的值)
為23h     無須驗證扇區是否準備好而直接讀長扇區
為30h     嘗試寫扇區
為31h     無須驗證扇區是否準備好而直接寫扇區
為32h     嘗試寫長扇區
為33h     無須驗證扇區是否準備好而直接寫長扇區
當然看完這個表你會發現,這種讀寫埠的方法其實是基於磁頭、柱面、扇區的硬碟讀寫方法,也就是你要告訴硬碟控制器你要讀硬盤裡的哪個磁頭下的哪個柱面裡的哪個扇區,然後下達讀命令,硬碟控制器將扇區內容快取起來,然後依次將每16位的資料放入一個暫存器(1F0H)中, cpu就可以通過io指令來讀取這個資料了。

我們可以再看一段示例程式碼:

mov     dx,1f6h         ; 要讀入的磁碟號及磁頭號
mov     al,0a0h         ;磁碟0,磁頭0
out      dx,al

mov     dx,1f2h         ;要讀入的扇區數量
mov     al,1            ;讀一個扇區
out      dx,al

mov     dx,1f3h         ;要讀的扇區號
mov     al,1            ;扇區號為1
out      dx,al

mov     dx,1f4h         ;要讀的柱面的低8位
mov     al,0            ; 柱面低8位為0
out     dx,al

mov     dx,1f5h         ; 柱面高2位
mov     al,0            ; 柱面高2位為0(通過1F4H和1F5H埠我們可以確定
; 用來讀的柱面號是0)
out      dx,al

mov     dx,1f7h         ;命令埠
mov     al,20h          ; 嘗試讀取扇區
out      dx,al
still_going:
in      al,dx
test     al,8            ;扇區緩衝是否準備好
jz     still_going     ;如果扇區緩衝沒有準備好的話則跳轉,直到準備好才向下執行。

mov     cx,512/2        ;設定迴圈次數(512/2次)
mov     di,offset buffer
mov     dx,1f0h         ;將要傳輸的一個位元組的資料
rep      insw            ;傳輸資料

有成就感吧,一切盡在掌握中。其實我們可以直接呼叫bios裡的int 13h中斷,就可以直接讀寫扇區,只不過通過更底層的程式碼,我們可以對計算機的體系結構有一個更深刻的認識。知道cpu和其他裝置是如何互動資料的。

注意到上面的指令rep insw,這裡解釋一下。INS指令可從DX指出的外設埠輸入一個位元組或字到由ES: DI指定的儲存器中。 輸入位元組還是字,則由ES: DI目標運算元的屬性決定,且根據方向標誌位DF和目標運算元的屬性來修改DI的值:若(DF)= 0,則DI加1(或加2);否則DI減1(或減2)。與INS指令相似,INSB 和INSW指令也分別從DX指出的外設埠輸入一個位元組或字到由ES: DI指定的儲存器中,且根據方 向標誌位DF和串操作的型別來修改DI的值。上述三種格式的指令均可加重複字首REP,以實現連續的串操 。此時CX暫存器中的內容為重複操作的次數。

這裡我們看到,cpu讀取硬碟資料不是讀入到cpu內部,而是讀入到記憶體中,這可能是因為在cpu中根本就沒有這麼大空間來儲存硬盤裡的資料,所以在指令設計中就直接讓其往記憶體中放,並且考慮到頻寬限制,硬碟一個最小的資料單元–扇區就要分很多次才能讀入記憶體,所以設計了想rep insw這樣的指令來提高效率。磁碟控制器每次從扇區資料緩衝區中取出1個字長的資料放入1F0h(也稱作pio資料埠)供insw指令獲取,迴圈執行insw,直到讀完整個緩衝區。

相關推薦

cpu指令如何硬碟

在《cpu解讀一》中,我們提到cpu的主要作用之一就是控制裝置之間的資料互動。這其中自然也包括了硬碟。系統的所有資料基本都在硬碟中,所以知道怎麼讀寫硬碟,對程式來說非常重要,所以我們先來探索下傳說中的pio模式。 cpu要想直接訪問裝置裡的資料,必須對裝置儲存空間進行編

java獲取JVM的CPU佔用率、記憶體佔用率、執行緒數及伺服器的網口吞吐率、磁碟速率

怎麼說呢,本人菜鳥一枚,費了幾天時間,終於做了一個用java獲取JVM的CPU佔用率、記憶體佔用率、執行緒數及伺服器的網口吞吐率、磁碟讀寫速率的實現。 其中windows環境下獲取jvm 的cpu佔用率這裡是參考網上別人的東西(在此感謝提供參考的網友),其他的都是基於自己的想法做出來的。該工具類

如何能讓MAC和PC都能行動硬碟

Macbook Pro 行動硬碟 希捷硬碟就不用,有專業適用於蘋果的軟體。 1、在“LaunchPad”中找到並開啟“磁碟工具”,在“磁碟工具”中可以看到行動硬碟的幾個分割槽 2、選擇一個分割槽後,選擇“

如何使用x86彙編對硬碟進行

  硬碟讀寫的基本單位是扇區。就是說,要讀就至少讀一個扇區,要寫就至少寫一個扇區,不可能僅讀寫一個扇區中的幾個位元組。這樣一來,就使得主機和硬碟之間的資料交換是成塊的,所以硬碟是典型的塊裝置。      從硬碟讀寫資料,最經典的方式是向硬碟控制器分別傳送磁頭號、柱面號和扇區

終端命令方法解決在Mac系統行動硬碟問題

在Mac系統下正確使用行動硬碟 1、首先在終端敲入括號中的這段命令(diskutil info /Volumes/硬碟名 | grep UUID)用你行動硬碟的名字替換命令裡的“硬碟名”,然後敲回車,就能看見你的硬碟序列號UUID。 2、接著在終端敲入括號中的這段命令

mac os系統下如何識別ntfs行動硬碟,獲取許可權

第一步:更新 /etc/fstab檔案 sudo vim /etc/fstab LABEL=driver\040ddd none ntfs rw,auto,nobrowse 其中的\040的意思是代替空

不同等級raid的效能,優缺點,所需最小硬碟數以及結構

隨機讀取效能 隨機寫入效能 持續讀取效能 持續寫入效能 優點 缺點 所需最小硬碟數量 結構 RAID0 很好 很好 很好 很好

如何將NTFS格式的行動硬碟掛接到Mac OS上進行(Read/Write)操作

現在硬碟便宜,很多同學都有行動硬碟,如果你同時使用Windows與Mac OS的話,行動硬碟最好不要使用NTFS檔案系統,否則在Mac OS上,你只能讀你的行動硬碟,不能寫。 但是實際上的情況是,行動硬碟上有很多東西了,且最初是格式化為了NTFS格式,這時候重新格式化是很麻煩的,要做資料移動。

[原始碼和文件分享]程式設計實現對硬碟全盤資料進行資料擦除

背景 在 XP 系統下下,我們可以直接呼叫 WirteFile 函式對磁碟寫入資料,但到了 Windows 7 以及 Windows 7 版本以上的系統,就已經開始變得不那麼簡單了。 在 Windows 7 及以上版本中,對檔案系統和儲存堆疊進行的更改,限制對磁碟和卷的直接訪問,但是,在以下

7. Buffer_包描述檔案_npm常用指令_fs檔案_模組化require的規則

1. Buffer 一個和陣列類似的物件,不同是 Buffer 是專門用來儲存二進位制資料的。 特點: 大小固定: 在建立時就確定了,且無法調整 效能較好: 直接對計算機的記憶體進行操作 每個元素大小為1位元組 使用: Buffer.allocUnsafe(size)  Buffer

hdparm 測試硬碟速度

安裝:yum install hdparm 語  法:hdparm [-CfghiIqtTvyYZ][-a <快取分割槽>][-A <0或1>][-c <I/O模式>][-d <0或1>][-k <0或1

win xp mac 的時間機器行動硬碟

我的行動硬碟做成了時間機器盤,再接win xp 上識別不出來了? 想想原因: 時間機器什麼型別檔案系統的?hfs+ windows 讀不出來。安裝個讀寫驅動。 在網上搜索: Paragon_HFS+_

Mac下不能行動硬碟問題解決

Mac在預設情況下不開啟ntfs格式移動硬碟的寫入許可權,但是通過以下步驟,不使用其他軟體,就能讓mac輕鬆讀寫ntfs格式的行動硬碟. 首先, 如果你的電腦裡面已安裝了paragon等工具,先卸了它。  然後,看看你/etc/底下有沒有一個叫fstab的檔案,有的話備份一下,你可以在terminal底下寫

Mac 掛載NTFS行動硬碟進行操作 Readonly file system

找到 Device Node Device Node:              /dev/disk1s1 2. hdiutil eject /Volumes/YOUR_NTFS_DISK_NAME "disk1" unmounted. "disk1" ejected. 彈出你的硬碟 3. 建立一個目錄,稍

硬碟原理

硬碟的種類主要是SCSI 、IDE 、以及現在流行的SATA等;任何一種硬碟的生產都要一定的標準;隨著相應的標準的升級,硬碟生產技術也在升級;比如 SCSI標準已經經歷了SCSI-1 、SCSI-2、SCSI-3;其中目前咱們經常在伺服器網站看到的 Ultral-160就是基於SCSI-3標準的;IDE 遵循

Qt linux獲取cpu使用率、記憶體、網路收發速度、磁碟速度、磁碟剩餘空間等

#include "resource_minitor.h" #include "sys/statfs.h" resource_minitor::resource_minitor(QObject *parent) : QObject(parent) { connect(&monito

一種使用記憶體做硬碟的方法,提升速度

今天在網上瀏覽到如下文章: 大意是用記憶體做硬碟,提高讀寫速度。摘記之: MacOS:使用hdid命令就可以:hdid+fstyp_hfs(類似Linux的mkfs.ext4之類的)+mount Win:裝了個SuperSpeed的RamDisk Plus劃了塊4G

Centos 下硬碟檢測

1.安裝badblocks yum install -y e2fsprogs 2.檢查 讀測試: badblocks -s -v /dev/sdb 讀寫測試:(速度很慢) badblocks -s -w -v /dev/sdb badblocks 用法詳細說明 語 法:   badblocks [-svw][

Zabbix自定義監控項--利用dd測試硬碟速度

      Zabbix作為強大的伺服器監控平臺,本次利用它來檢測伺服器中各個硬碟的讀寫速度,以便能在硬碟效能下降能夠即使更換,不影響工作效率。1、dd命令使用    利用Linux自帶的dd命令來測試硬碟的讀寫速度,關於dd命令的詳解可網上查詢,很多資料,下面給出dd測試的

硬碟IOPS與速度

IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數),是衡量磁碟效能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,一般以每秒處理的I/O請