概念:
cpu:特指處理器核心,而不是處理器封裝,因為很多處理器将橋晶片和記憶體控制器晶片都封裝在一起,造成一種誤解,實際上處理器核心并不包含這些内容。
外設:帶有處理邏輯的內建電路核心。
一、CPU和外設晶片
1、功能對等性和地位的不平等
外設晶片也可以處理資料,是以和cpu在功能上是對等的,GPU概念的提出加深了我們對這種對等性的了解。cpu是相對比較通用的晶片,而外設呢是功能比較專一的晶片。有時候,外設在某方面的處理能力要遠遠高于cpu。
馮.諾依曼機器是以處理器即CPU為中心的,是以在程式設計層面上cpu和外設是不平等的。由于曆史原因,在那個年代,計算機主要用于科學計算,cpu足以勝任全部任務,是以外設幾乎是不存在的,加上設計的簡單性,軟體指令統一由cpu發出和執行,是以軟體意義上的不平等是曆史原因和設計原因造成的。
2、通信機制
不管怎樣,外設連接配接于系統上,cpu和外設必然需要互相通信。由于程式設計的不平等性,一般意義上所有指令由cpu發出,cpu可以主動讀寫或者操作外設,而外設卻很難直接操作cpu,是以提出中斷的概念。外設通過硬體邏輯,而不是軟體邏輯(軟體邏輯一般全部由cpu負責)來通知cpu有事情要做,cpu必然需要一種機制被動得到這種通知,這就是中斷。
二、主機闆架構
1、以cpu為中心
由于曆史原因和設計原因,主機闆都是以cpu為中心的,然後通過硬體連線邏輯連接配接各種外設。最簡單的連接配接方式就是外設們和cpu連接配接在一條共享的線路上(由于它們的平等性)。
2、以各種橋連接配接各種總線
然而外設們的速率和通信協定彼此并不一定相同,和cpu之間的協定也有所不同,那麼必然需要一種裝置來進行協定轉換和資料緩沖,以适配速率不同,協定不同的各種外設之間以及外設和cpu之間的通信。是以提出總線的概念,連接配接在一種總線上的所有裝置的速率和底層通信協定是一緻的。
3、外設連接配接在各種總線上
相同協定和相同速率的外設連接配接在一類總線之上。注意,系統中某一種總線并不一定隻有一條,每一條總線(注意,不是一種,而是一條)都定了一個位址空間,也就是一個位址命名空間,在這個意義上,cpu通路的位址x和pci裝置的位址x并不是一個位址,是以橋裝置必須可以提供一個位址映射機制,可以将一端的位址映射到另一端的y(可以直接等于x,然而意義卻不一樣)。
4、中斷引腳
cpu核心為了可以被外設中斷,它必須有一個中斷引腳。外設為了可以中斷cpu,也必須有一種機制使它和cpu中斷引腳直接或者間接相連接配接。
4.1、基于硬連線的中斷
外設要想能中斷cpu,最直接的方式是引出一根線,和cpu的唯一的中斷引腳相連,然而cpu隻有一個引腳,是以cpu需要在後續的總線周期中查詢是誰發送了中斷信号,是以外設需要有機制告知這個資訊,這個資訊就是中斷向量号,然而很多裝置會共享一個向量号,這就需要cpu在基于中斷向量号的中斷處理程式中周遊所有的裝置進行确認了。
5.協定軟化
早期很多的總線都是并行的,晶片除了片選引腳外,位址線/資料線都是并行的,這樣的話不利于通信協定的更改,因為并行總線的通信協定(總線事務)完全基于時序,而時序是硬體設計時定義的,比如對于位址/資料複用線,第一個總線周期發出位址,然後後續周期發出資料等,這些都是硬連線确定的,另外,并行線路,頻率越高幹擾越大,離得越近幹擾越大,然而事情卻在向高頻,小型化發展,這明顯是一個沖突,是以設計出了串行總線,将處理邏輯集中于晶片,總線線路隻負責傳輸基于frame的資料,這就是協定軟化,也叫總線事務軟化。當需要更新協定的時候,隻需要更換晶片即可,線路無需更改。
5.1、基于消息的中斷
pci/pcie總線使用基于消息的中斷,即msi/msi-x,這種中斷機制無需裝置的中斷線引腳,隻需要在串行總線發出一個中斷事務,然後會有晶片接管這個事務,這個事務消息中有中斷向量号資訊,然後該晶片會代理裝置向cpu發出中斷事務,具體如何向cpu轉發裝置的中斷,有很多種方式,一種古老的方式用于使用8259的系統中,8259會向cpu的intr引腳發送中斷,然後到cpu查詢向量号的時候8259會将從msi中得到的向量号發給cpu。一種更新的方式是使用apic,msi向一個存儲器位址空間寫一個中斷消息,該位址在pcie橋處被轉換為cpu的存儲空間位址,該位址就是local-apic的映射位址,然後在fsb上發送中斷事務,由于位址被映射到處理器封裝中的local-apic,該事務被local-apic接管,然後local-apic再向處理器核心即cpu發送中斷。這種方式完全由消息事務完成,絲毫不需要任何硬連線。
三、系統軟體相關
系統軟體并不僅僅是作業系統,實際上作業系統并不直接管理硬體。fireware和硬體接口,而作業系統和使用者接口。
1、fireware定義硬連線拓撲
這種fireware和主機闆硬體接口,在x86平台上,這種fireware稱為bios,在bios定義了豐富的資訊。主機闆上電後,bios執行,bios中儲存了E820映射資訊,也就是cpu的位址空間的什麼位址映射到什麼總線,接下來的一種可能實作是bios根據這些資訊檢測并初始化總線裝置,實際上是一種周遊,為各個裝置配置設定基位址,也就是寫入配置空間基位址資訊。這些資訊由作業系統讀出并使用。(當然也可以将這資訊寫死到裝置的rom中)
2、作業系統
和使用者接口,操作完全是為了管理使用者程序的,它對硬體的管理完全是基于fireware的。作業系統根據fireware的資訊得到主機闆拓撲資訊,設定中斷向量,得到裝置的基位址等資訊。
附:軟化
不知以太網以及tcp/ip的設計思想有沒有影響主機闆設計,以太網的802.3設計就是一個串行協定設計的成功例子,tcp/ip的設計也是類似的一個例子,網絡協定的設計幾乎都是串行的,這和計算機早期的并口不同,序列槽有着簡單性和抗幹擾性的優點,這點意義上,雙絞線最終淘汰了并口線,同軸線等...
不管怎樣,串行線路是軟的,而不像并行線路那樣硬,這樣就可以将處理邏輯集中于端點而不是線路本身,比如再也不用定義哪根線是資料準備好信号,那些根線是位址信号了,隻需要定義一個frame的格式,然後按照這個格式發送資料就可以了,這樣在串行線路上,甚至都不再區分什麼位址線和資料線了,位址和資料都包含在資料包本身了,這樣分層協定和封裝協定就容易設計出來了,晶片本身使用軟體或者硬體處理資料包,和線路沒有關系,正如ipv6的資料包和ipv4的包都可以跑在一條線路上一樣,雖然它們的位址資訊一點都不同。
串行線路将更多的事交給了端點的軟體或者硬體,這就解耦了線路和線路載荷。一般意義上,并行線路在低頻率時鐘情況下比串行線路快,然而當這種優勢達到極端時,當時鐘頻率發展到使并行線路不再可以提升性能時反而降低性能時,串行線路取代了并行了線路,此時由于時鐘頻率足夠高,串行線路也已經足夠快了,前仆後繼,善莫大焉!我們的主機闆将越來越像一個網絡了,實際上,最終,我們的網際網路和主機闆将歸于一種設計,那就是串行線路連接配接各端點。人們一直以為軟體處理效率不如硬體直接處理,說不定最終接替摩爾定律的恰恰的軟體的設計思想而不再是單純的硬體,這裡的軟體并不是程式設計意義上的軟體,而是設計意義上的軟體,也就是将處理邏輯集中于端點的設計思想。
笑聲中說一句,串行總線中可以輕松實作中斷的動态配置,作業系統可以參與中斷向量的配置,而在并行線路中,作業系統隻能使用fireware的資訊。
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271081