在《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要想直接訪問裝置裡的資料,必須對裝置儲存空間進行編址。而硬碟資料資料太大,直接編址...
CPU 記憶體 硬碟 指令簡述
cpu是central processing unit 處理器 的縮寫,內部有數百萬至數億個電晶體構成。cpu部件,稱為ic integrated circuit,積體電路 cpu內部由暫存器 控制器 運算器和時鐘四個部分構成,各部分間由電流訊號連通。暫存器,用來暫存指令 資料等處理物件,可看作是記...
CPU 記憶體 硬碟 指令之間的關係
cpu即 處理器 central processing unit 其主要由控制單元 運算單元 以及儲存單元組成,有運算和控制的功能。其容量小,但執行速度極快,斷電後資料會丟失。記憶體也叫主存,用於存放指令和資料,以供cpu讀取,但它和cpu一樣斷電後資料會丟失,記憶體的執行速度比cpu慢100倍,因...