核心版本: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...