《Linux那些事兒之我是PCI》筆記

2021-10-10 05:11:08 字數 2822 閱讀 6625

核心版本:2.6.22

1. pci access mode: bios, direct, mmconfig, any。

bios mode:有的bios程式提供了針對pci匯流排的操作,這些操作包括匯流排列舉,此種bios稱為pci bios;此種方式直接使用bios程式列舉的結果。(64位平台沒有該選項) 。

direct mode: 核心進行pci匯流排列舉過程。

mmconfig: pcie才用的上,pci用不上。

any: 首先嘗試mmconfig、然後direct、都失敗後再嘗試bios。

2. pci裝置配置暫存器的內容是誰寫入的?

匯流排列舉。

晶元組:

北橋+南橋。

北橋中包含host bridge, 即rc(root complex)。

部分資訊(如vendor id、device id)固化在裝置中;其他資訊在匯流排列舉階段,有核心酌情設定。

3. 中斷

過程:裝置產生中斷訊號(電訊號)->中斷控制器->cpu->核心->中斷處理程式(事先註冊,與指定中斷關聯)。

pic: 只能用於乙個處理器的系統;每個pic提供8個中斷線。

apic:

能夠處理cpu之間的中斷。

中斷線數量增多至255。

local apic + io apic。

可通過/proc/interrupts檢視系統有沒有使用io apic。

msi:

往預定義的記憶體位址寫入預定義的訊息來提出中斷請求。

pci裝置->tlp訊息-> host bridge -> cpu-> 核心->中斷處理程式。

依賴於config_x86_local_apic。

4. kconfig語法:documentation/kbuild/kconfig-language.txt。

5. 原始碼:

drivers/pci/makefile; arch/x86/pci/makefile。

include/linux/init.h (page 902): 各個入口巨集的定義。將不同的函式指標存放在.initcall.init的指定子節中。

6. 引數型別:

核心引數和模組引數:

核心引數說明:documentation/kernel-parameters.txt。

檢視模組引數:modinfo -p 模組名。

核心函式parse_args(): 引數解析。

核心啟動時呼叫一次,解析核心引數。

模組載入時呼叫,解析模組引數。

early_param巨集宣告特權引數;module_param巨集宣告普通引數。

引數解析完之後,會呼叫***_initcall()入口函式。

7. 核心引數解析

drivers/pci/pci.c: pci_setup()函式解析核心引數中pci相關的引數。

arch/x86/pci/common.c: pcibios_setup()。

off: 不進行pci匯流排列舉。

bfsort和nobfsort:廣度優先和深度優先。

bios: 使用pci bios的列舉結果;建議在make menuconfig時pci access mode選項使用any,由核心判斷使用哪種方式。

nobios: 不使用pci bios的列舉結果。

biosirq: 告訴核心通過pci bios獲取中斷路由表。僅用於pic,apic不適用。

pirqaddr: 預設情況下,核心可以在0xf0000~0xfffff這段位址查詢中斷路由表。而pirqaddr告訴核心中斷路由表的確切位址。

nommconfig: 告訴核心不要使用mmconfig方式訪問裝置;

noacpi: 禁止使用acpi處理pci匯流排列舉和pci裝置的中斷路由。

noearly: 在核心啟動過程的開始階段,禁用對pci裝置的早期掃瞄(使用type1方式嘗試訪問每個可能存在的pci裝置的配置空間)。

assign-busses: 核心將無視pci bios分配的匯流排號,自己重新分配;列舉包括匯流排號分配和其他位址空間的分配。此處僅指匯流排號重新分配。

routeirq: 核心為pci裝置分配中斷路由。pci驅動可能漏呼叫pci_enable_device()。

pci_enable_device(): 驅動程式訪問pci裝置的任何資源前都要先呼叫pci_enable_device(),為裝置完成中斷路由,也就是分配中斷請求線等工作。

realloc: 作用?看看**。

8. 初始化(一)

1. 初始化函式執行順序的判斷依據

入口函式:init/main.c: do_initcalls()。

依次執行.initcall.init節中的函式指標。

.initcall.init節中有7個子節,優先執行.initcall1.init子節中的函式指標。

相同子節中的函式指標的執行順序,根據makefile中各個c檔案的鏈結順序確定。

2. 初始化流程

在driver/pci/和arch/x86/pci/目錄下找出所有用***_initcall()宣告的初始化函式,然後按照順序執行。

.initcall2.init:

pcibus_class_init():

原始檔:driver/pci/probe.c。

裝置模型;註冊乙個名稱pci_bus的struct class。

體現在sysfs上,是在/sys/class/目錄下建立了乙個pci_bus目錄;用來儲存各個pci匯流排。

pci_driver_init():

原始檔:driver/pci/pci-driver.c。

註冊pci匯流排(struct bus_type型別的結構);只有匯流排存在了,才會有裝置鍊錶和驅動鏈表,才會有裝置和驅動的match。

Linux那些事兒之我是EHCI 引子

轉眼之間,到了2008年,先祝大家新年快樂,希望新的一年裡好運連連,工資猛漲。好久沒有寫了,乙個原因在於,作 為乙個phd學生,難免要做一些讀 寫 的瑣事,另乙個原因就是自己太懶了。大哥甲一如既往,堅持的寫作,著實讓人欽佩。此時此刻,我情 不自禁,作詩一首,北飄奇男子,江南大丈夫。海上常常生明月,江...

Linux那些事兒之我是EHCI 引子

轉眼之間,到了2008年,先祝大家新年快樂,希望新的一年裡好運連連,工資猛漲。好久沒有寫了,乙個原因在於,作為乙個phd學生,難免要做一些讀 寫 的瑣事,另乙個原因就是自己太懶了。大哥甲一如既往,堅持的寫作,著實讓人欽佩。此時此刻,我情不自禁,作詩一首,北飄奇男子,江南大丈夫。海上常常生明月,江湖就...

讀Linux那些事兒之我是HUB筆記(一)

革命尚未成功,繼續看我們的hub 1 usb裝置能夠使用條件 乙個是 usbcore,這就是核心模組,另乙個是主機控制器的驅動程式 usb host controller.乙個是 echi的,三個是uhci,就是host controller 的介面 hub 叫做集線器 裝置與host contro...