2020-09-30 PCI

Runge Ryo發表於2020-09-30

ppt題目分析

1.基址暫存器

相關知識

基址暫存器(Base Address Register),有兩種格式儲存。
第一種是I/O空間指標,第二種是儲存空間指標。
兩種表示方法

例題1-1

基址暫存器的值=FFF00000H,表示什麼含義?

將16進位制數展開為2進位制數,得到:
1111 1111 1111 0000 0000 0000 0000 0000B
與上圖給出的格式進行比對:

位數意義
位0=0B地址空間對映
位【2:1】=00B使能32位儲存器對映
位3=0B說明不是預取儲存器
位【31:4】的第一個是1的位置是位20說明對映的儲存空間是2^20

例題1-2

基址暫存器的值=FFFFFF01H,表示什麼含義?

將16進位制數展開為2進位制數,得到:
1111 1111 1111 1111 1111 1111 0000 0001B
與上圖給出的格式進行比對:

位數意義
位0=1BI/O地址空間對映
位【31:2】的第一個是1的位置是位8說明對映的儲存空間是2^8

2.獲得配置資訊(配置空間訪問)的方法

需要用到這個方法的情景

  1. 讀取裝置的配置暫存器(配置讀操作匯流排週期)
  2. 確定裝置所需地址空間
  3. 分配中斷及主裝置對匯流排的訪問要求
  4. 等等

基礎知識

x86系列不能對配置空間暫存器直接進行讀/寫
配置機構實現方法:用兩個特定的32位I/O埠對應兩個配置暫存器

配置機構:將處理器發出的I/O訪問轉換為配置訪問的轉換機構

配置**暫存器I/O地址
地址埠0CF8 H~0CFB H
資料埠0CFC H~0CFF H

配置操作的實現步驟

  1. 訪問的匯流排號、裝置號、功能號、雙字地址寫到配置地址埠暫存器
  2. 執行一次對配置資料埠暫存器的I/O訪問

配置地址資訊格式
配置地址資訊格式

例題2-1

讀PCI匯流排的1號擴充套件槽(裝置號)2號功能裝置的廠商標誌(暫存器號)

步驟如下:

MOV DX, 0CF8H//將地址埠暫存器的I/O地址放到DX中
MOV EAX,80000A00H//裝置資訊放到EAX中

程式碼中16進位制數的解釋:
80000A00H
=1000 0000 0000 0000 0000 0001 0000 0000B

10000000000000000000101000000000B
使能保留(置零)匯流排號無定義(置零)擴充套件槽號=裝置號=1功能號=2暫存器號=指示廠商標誌=000
OUT DX,EAX//EAX內容寫入DX存放的埠裡
//(此時裝置資訊寫入DX存放的埠中
//也就是放在了之前提到的地址埠暫存器的I/O地址裡)

//配置資料埠暫存器訪問
MOV DX,0CFCH
//(資料埠暫存器的I/O地址放到了DX中)
IN EAX,DX
//將DX資訊讀入EAX中
//把資料埠暫存器的I/O地址放到EAX中

一個問題

為什麼程式碼最後兩句話就算做一次對所謂的“配置資料埠暫存器”的I/O訪問?

例題2-2

給匯流排號為7的PCI匯流排的4號擴充套件槽 0號功能裝置的基址暫存器4分配8個I/O地址空間。

MOV DX, 0CF8H//OCF8H放到DX裡
MOV EAX, 80072010H//裝置暫存器資訊
10000000000001110010000000010000
使能匯流排號74號0功能暫存器號分配IO地址空間
OUT DX, EAX//放到0CF8H裡
MOV DX, 0CFCH//資料埠暫存器的I/O地址
MOV EAX, 0FFFFFFF9H//這個是PCI配置空間的基址暫存器的值
OUT DX, EAX//把EAX內容放到0CFCH對應的埠中