第六章 PCI
外圍設(shè)備互連(PCI)是一種將系統(tǒng)中外部設(shè)備以結(jié)構(gòu)化與可控制方式連接到起來的總線標(biāo)準(zhǔn) , 包括系統(tǒng)部件連接的電氣特性及行為 。本章將詳細(xì)討論Linux核心對(duì)系統(tǒng)中的PCI總線與設(shè)備的初始化過程 。
圖6.1 一個(gè)基于PCI的系統(tǒng)示意圖
圖6.1是一個(gè)基于PCI的系統(tǒng)示意圖 。PCI總線和PCI-PCI橋接器在連接系統(tǒng)中設(shè)備到上起關(guān)鍵作用 , 在這個(gè)系統(tǒng)中CPU和視頻設(shè)備被連到PCI bus 0上 , 它是系統(tǒng)中的主干PCI總線 。而PCI-PCI橋接器這個(gè)特殊PCI設(shè)備將主干總線PCI bus 0與下級(jí)總線PCI bus 1連接到一起 。PCI標(biāo)準(zhǔn)術(shù)語中 , PCI bus 1是PCI-PCI橋接器的downstream而PCI bus 0是此橋接器的up-stream 。SCSI和以太網(wǎng)設(shè)備通過二級(jí)PCI總線連接到這個(gè)系統(tǒng)中 。而在物理實(shí)現(xiàn)上 , 橋接器和二級(jí)PCI總線被集成到一塊PCI卡上 。而PCI-ISA橋接器用來支持古老的ISA設(shè)備 , 圖中有一個(gè)高級(jí)I/O控制芯片來控制鍵盤、鼠標(biāo)及軟盤設(shè)備 。
6.1PCI地址空間
CPU和PCI設(shè)備需要存取在它們之間共享的內(nèi)存空間 。這塊內(nèi)存區(qū)域被設(shè)備驅(qū)動(dòng)用來控制PCI設(shè)備并在CPU與PCI設(shè)備之間傳遞信息 。最典型的共享內(nèi)存包括設(shè)備的控制與狀態(tài)寄存器 。這些寄存器用來控制設(shè)備并讀取其 信息 。例如PCI SCSI設(shè)備驅(qū)動(dòng)可以通過讀取其狀態(tài)寄存器 , 找出已準(zhǔn)備好將一塊數(shù)據(jù)寫入SCSI磁盤的SCSI設(shè)備 。同時(shí)還可以在設(shè)備加電后 , 通過對(duì)控制寄存器寫入信息來啟動(dòng)設(shè)備 。
CPU的系統(tǒng)內(nèi)存可以被用作這種共享內(nèi)存 , 但是如果采用這種方式 , 則每次PCI設(shè)備訪問此內(nèi)存塊時(shí) , CPU將被迫停止工作以等待PCI設(shè)備完成此操作 。這種方式將共享內(nèi)存限制成每次只允許一個(gè)系統(tǒng)設(shè)備訪問 。該策略會(huì)大大降低系統(tǒng)性能 。但如果允許系統(tǒng)外設(shè)不受限制地訪問主存也不是好辦法 。它的危險(xiǎn)之處在于一個(gè)有惡意行為的設(shè)備將使整個(gè)系統(tǒng)置于不穩(wěn)定狀態(tài) 。
外設(shè)有其自身的內(nèi)存空間 。CPU可以自由存取此空間 , 但設(shè)備對(duì)系統(tǒng)主存的訪問將處于DMA(直接內(nèi)存訪問)通道的嚴(yán)格控制下 。ISA設(shè)備需要存取兩個(gè)地址空間:ISA I/O(輸入輸出)和ISA內(nèi)存 。而PCI設(shè)備需要訪問三種地址空間:PCI I/O、PCI內(nèi)存和PCI配置空間 。CPU則可以訪問所有這些地址空間 。PCI I/O和 PCI內(nèi)存由設(shè)備驅(qū)動(dòng)程序使用而PCI配置空間被Linux 核心中的PCI初始化代碼使用 。
Alpha AXP處理器并不能象訪問系統(tǒng)地址空間那樣隨意訪問這些地址空間 , 它只能通過輔助芯片組來存取這些 地址空間 , 如PCI配置空間 。Alpha AXP處理器使用稀疏地址映射策略來從系統(tǒng)巨大的虛擬內(nèi)存中"竊取"一部分并將其映射到PCI地址空間 。
6.2PCI 配置頭
圖6.2 PCI配置頭
系統(tǒng)中每個(gè)PCI設(shè)備 , 包括PCI-PCI橋接器在內(nèi) , 都有一個(gè)配置數(shù)據(jù)結(jié)構(gòu) , 它通常位于PCI配置地址空間中 。PCI配置頭允許系統(tǒng)來標(biāo)識(shí)與控制設(shè)備 。配置頭在PCI配置空間的位置取決于系統(tǒng)中PCI設(shè)備的拓?fù)浣Y(jié)構(gòu) 。例如將一個(gè)PCI視頻卡插入不同的PCI槽 , 其配置頭位置會(huì)變化 。但對(duì)系統(tǒng)沒什么影響 , 系統(tǒng)將找到每個(gè)PCI設(shè)備與橋接器并使用它們配置頭中的信息來配置其寄存器 。
典型的辦法是用PCI槽相對(duì)主板的位置來決定其PCI配置頭在配置空間中的偏移 。比如主板中的第一個(gè)PCI槽的PCI配置頭位于配置空間偏移0處 , 而第二個(gè)則位于偏移256處(所有PCI配置頭長度都相等 , 為256字節(jié)) , 其它槽可以由此類推 。系統(tǒng)還將提供一種硬件相關(guān)機(jī)制以便PCI設(shè)置代碼能正確的辨認(rèn)出對(duì)應(yīng)PCI總線上所有存在的設(shè)備的PCI配置頭 。通過PCI配置頭中的某些域來判斷哪些設(shè)備存在及哪些設(shè)備不存在(這個(gè)域叫廠商標(biāo)志域: Vendor Identification field) 。對(duì)空PCI槽中這個(gè)域的讀操作將得到一個(gè)值為0xFFFFFFFF的錯(cuò)誤信息 。
推薦閱讀
- Linux 核心--8.中斷與中斷處理
- 椰子湯的功效與作用 椰子湯有什么功效
- Linux操作系統(tǒng)如何限制SSH密碼嘗試次數(shù)
- 微軟公司對(duì)Linux操作系統(tǒng)使出的各種殺招
- Linux 核心--4.內(nèi)存管理
- 以Linux做路由器的問題
- Linux 核心--1.前言
- 紅豆糖水的功效與作用 紅豆糖水的功效與作用禁忌
- Linux 核心--3.軟件基礎(chǔ)
- 認(rèn)識(shí)Linux操作系統(tǒng)下三大便利開源防火墻
