前面我們瞭解到,cpu通過讀寫io地址來讀取磁碟扇區裡的資料,我們又瞭解到cpu與磁碟之間可能隔著前端匯流排,北橋晶片,南北橋之間的pci串連,以及南橋上磁碟控制卡,最後才能到達磁碟機控制磁頭讀寫磁碟資料。現在我們將這幾個情境串連起來,看看更具體一點的互動過程。
首先,我們開啟windows系統裡的裝置管理員,找到磁碟控制卡和磁碟機兩個裝置。這兩個裝置的名字容易引起混淆。我們看這兩個裝置的屬性,我們看到磁碟控制卡屬性裡赫然寫著pci地址,如位置:PCI匯流排0,裝置31,功能號2。也就是說我們的磁碟控制卡其實是一個pci裝置,連在pci匯流排上,pci匯流排最終連著北橋即host主橋。
既然是pci裝置就有pci地址空間,而這個地址空間會由host主橋將其映射到儲存空間。cpu其實是通過host主橋來訪問pci地址空間。pci匯流排的工作原理我們以後再詳細研究。現在我們知道一點,所謂的磁碟控制卡其實可能就是一個pci裝置。
但是,磁碟控制卡不僅僅是一個pci裝置,他的主要功能是控制磁碟機,給磁碟機下達命令來實現磁碟讀寫。為什麼要這麼設計呢?顯然是為瞭解耦,使得硬碟和其他電腦群組件能夠獨立發展。比如,在PCI在之前,我們用的是低速的ISA匯流排來串連IDE硬碟, 而現在ISA匯流排被PCI匯流排替代,還需要使用IDE硬碟,並且希望原來生產的IDE硬碟能夠不做任何修改就能用到新的電腦系統裡。
這個其實並不複雜,新的匯流排出來之後,為了把以前的IO裝置串連到新的匯流排上,必須提供一個“匯流排適配器”,或者叫介面,這個介面一方面可以和匯流排做資料互動,另一方面需要知道怎麼控制IO裝置。這樣才能將cpu的指令轉換到對IO裝置的指令。我們的磁碟控制卡就是這樣一個介面。它知道磁碟裝置的指令集,所以擷取cpu指令後,能翻譯成磁碟裝置的控制指令。事實上,傳統的很多io裝置都由一個控制器整合了南橋上,協助io裝置可以和局部匯流排互動資料。這也是南橋的價值所在。
所以,我們知道為什麼同一個磁碟既能連在ISA匯流排的電腦上,也能連在PCI匯流排的電腦上,而磁碟的對外介面既不是ISA裝置介面,也不是PCI裝置介面,就是因為他們用了不同的磁碟機。而使得磁碟裝置可以獨立發展其介面技術,不綁死在一條匯流排上。這更利於產業的有序發展。最後我們再回顧一下磁碟讀寫技術。我們如果想訪問磁碟,必須找到磁碟機,對其的io空間進行編址(這可能還有疑惑,以後講到IO統一記憶體編址的時候就清楚了),然後根據磁碟控制卡的使用說明,對其傳達磁碟讀寫命令,最後擷取結果。
而幸好以前的IDE磁碟控制卡,有固定的IO空間,也就是在《cpu解讀三:程式控制讀寫硬碟的方法》講到的0x1F0 — 0x1F7 IDE等。在那篇文章中我們詳細講了應該怎樣將讀寫磁碟的命令寫入磁碟控制卡的這些io寄存器裡,來擷取磁碟資料。
但是,如果每次讀寫磁碟都要往這些寄存器裡寫東西對程式員也太不友好了,於是程式員對這些操作進行了封裝,以驅動的形式提供,甚至以更進階的api的形式供程式員調用,這就屬於軟體技術的範疇了,只不過無論軟體程式怎麼寫,每一次磁碟讀寫的工作,必然是cpu指令對磁碟控制卡的控制,再由磁碟控制卡控制磁碟,這是最後的必經之路。