一步步编写操作系统 15 CPU与外设通信——IO接口,下
既然都說到IO接口了,不知道各位有沒有疑問,cpu是怎樣訪問到IO接口呢?肯定得有個鏈路吧?什么?有隱約聽到有同學開玩笑說:cpu用無線訪問其它設備。哈哈,不知道各位聽說過沒有,無線的終端是有線。無論無線設備再如何強大,最終在網絡的那一頭,必然是物理設備在支撐。所以,不如用個物理鏈路啦,你看主板上密密麻麻的線路就知道為什么有些人稱主板為線路板啦。其實這物理鏈路就是一組電線,這條電線用于傳送信號,故稱為信號線。那些想和其它硬件交流的設備就要想辦法連接到這條線上。由于這條電線是供大家使用的公共線路,屬于所有設備共享,所以形象的稱之為bus,公共汽車。也就是大家所說的總線,總之,總線并不是抽象出來的東西,它就是把大家連接到一起的電線。再形象一點說,總線就像一條高速公路,這公路上有很多出口可以讓汽車進出,汽車在計算機中就相當于各種硬件設備,可以選擇連接上總線,也可以選擇從總線分離。
同一時刻,cpu只能和一個IO接口通訊,當很多的IO接口同時想和cpu對話時,面對眾多接口的愛慕,cpu會選擇和誰單獨一敘呢?這個工作不應該由cpu來做,前面說過啦,cpu太忙了,還是好鋼使在刀刃上吧,既然分層能解決問題,咱們再加一層,這一層的責任是除了仲裁IO接口的競爭,還要連接各種內部總線。由于它的使命,它的名字就叫做輸入輸出控制中心ICH(I/O control hub),也就是南橋芯片。如圖
?
說到了南橋,多少還要提一句北橋芯片的作用。圖上標上北橋部分其實是散熱片,在它下面才是北橋。由于南橋和北橋一般是成對出現的,至少在支持intel cpu的主板中是這樣的(話說,AMD為了減少cpu同北橋交換數據的成本,已經把北橋的工作放到了cpu內部,所以支持AMD的板子上未必有北橋芯片)。南橋是用于連接pci、pci-express、AGP等低速設備,北橋是用于連接高速設備,如內存。
好啦說完啦,點到為止,還得要繼續說南橋。cpu通過內部總線連接到南橋芯片中的內部,這個內部總線是專用的,它只通向位于南橋中的cpu接口。說的好炫,其實還是一條電線而已。從名字上可以看出,南橋二字中的橋,其實對應的是hub這個單詞,它們都意為“公共、集合”,所以不難想像,在南橋內部集成了一些IO接口,如并口硬盤PATA(就是我們平時所說的IDE硬盤),串口硬盤SATA,USB、PCI設備,電源管理等接口。由于這些接口對微型計算機來說必不可少,它們就直接扎根在南橋內部啦。
在南橋內部的接口對微型計算機來說是不可少的,除了這些之外,那些可有可用的設備,難道南橋就不管了嗎?必須得管,這畢竟是它的工作。南橋芯片內部總線示意如圖:
?
為了支持這些非必要的設備(當然主要是為了方便擴展,不易擴展的產品意味著從出生那天就開始走向滅亡),南橋提供了專門用于擴展的接口,這就是PCI接口。在主板上有很多插槽,它們就是預留的pci接口,pci設備可以即插即用。由于它們延伸到了南橋外面,又像公路一樣,很多pci設備都可以連接上來,所以這條延長的PCI接口便成了PCI總線。結合圖3-11和圖3-12。看到主板上那些并排的插槽時,大家要想到,它們其實都“騎”在一條電線上,這樣理解總線容易些嗎?
看到一個總線又一個總線的,如果感覺煩亂的話,說明總線這個詞意義不明確,也許翻譯成“公共線路”最直接。簡單的東西通過術語搞得好深奧,完全一副不明覺厲的樣子。其實大家想想看,這么多設備要實現相互通訊,不得用電線連接到一起嗎?只不過大多數情況下,連接到這條電線上的設備不止兩個,總的數量較多,所以稱之為“總”線。由于用途不同,這些電線有了各種各樣的名字,如地址總線、數據總線、ISA總線等等。總之,不要被總線這個詞嚇到,它其實就是電線。
以上都是接口的硬件部分,咱們最終是要通過軟件方式使用這些硬件,下面看看咱們為了驅動這些硬件要做什么。
IO接口在誕生之初,就被設計成要通過寄存器的方式同cpu通訊,其內部有專用于數據交互的寄存器,只不過這里所說的這些寄存器是位于IO接口中,為了區別于cpu內部的寄存器,IO接口中的寄存器就稱為端口(這可不是網絡應用程序所開的那種端口,如網絡服務器會啟動80端口,這是兩碼事)。
IO接口是連接cpu和硬件的橋梁,一端是cpu,另一端是硬件。端口是IO接口開放給cpu的接口,一般的IO接口都有一組端口,每個端口都有自己的用途,甚至有時,一個端口在不同情況下有不同的用途。可見IO接口另一端的硬件,相對來說還是很復雜的,所以,當看到某個IO接口上那么多端口的介紹而煩亂時,停止抱怨,IO接口已經為咱們極大的簡化了操作。
端口也是寄存器,寄存器就有數據寬度,有8位、16、32位,各個設備是不一樣的,看廠商自己安排了。
如何訪問到端口呢,外設中的rom既然可以通過內存映射來訪問,端口也可以,確實有些微機系統中是這樣做的,把一些內存地址做為端口的映射,訪問這些內存地址就相當于訪問了這些端口。還有一些微機系統把端口獨立編址,把所有端口從0開始編號,位于一個IO接口上的所有端口號都是連續的。以后講解硬盤的時候大家就會看到了。
IA32體系系統中,因為用于存儲端口號的寄存器是16位的,所以最大有65536個端口,即0~65535。
要是通過內存映射,端口就可以用mov指令來操作。但由于用的是獨立編址,所以就不能把它當作內存來操作,因些cpu提供了專門的指令來干這事,in和out。
Intel匯編語言的形式是:操作碼 目的操作數,源操作數。Intel采用這種格式的原因可能是覺得這樣表達“目的操作數”=“源操作數”更形象,如同a=6這種形式。
in指令用于從端口中讀取數據,其一般形式是:
其中al和ax用來存儲從端口獲取的數據,dx是指端口號。
這是固定用法,只要用in指令,源操作數(端口號)必須是dx,而目的操作數是用al還是ax,取決于dx端口指代的寄存器是8位寬度還是16位寬度。
out指令用于往端口中寫數據,其一般形式是:
注意啦,這和in指令相反,in指令的源操作數是端口號,而out指令中的目的操作數是端口號。
如果上面看著有點凌亂,給大家總結一下in和out指令共性:
真心希望大家看完后不會更亂了^_^。
好啦,有了這些硬件相關的知識,對以后我們操作其它硬件來說足夠了,我們不需要學習的多全,夠用就好。還是那句話,以后用到哪再學不遲,大家辛苦了。
【再續】
總結
以上是生活随笔為你收集整理的一步步编写操作系统 15 CPU与外设通信——IO接口,下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql密码安全级别_Mysql数据库
- 下一篇: java信息管理系统总结_java实现科