- 論壇徽章:
- 0
|
1、必須明白的概念:subsystem,set,kobject。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image002.gif
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image004.gif
而subsystetem在最新內(nèi)核代碼中已經(jīng)沒有,被kset所取代。kobject提供基本的對(duì)象管理,是構(gòu)成Linux2.6設(shè)備模型的核心結(jié)構(gòu),它與sysfs文件系統(tǒng)緊密關(guān)聯(lián),每個(gè)在內(nèi)核中注冊(cè)的kobject對(duì)象都對(duì)應(yīng)于sysfs文件系統(tǒng)中的一個(gè)目錄。Kobject是組成設(shè)備模型的基本結(jié)構(gòu)。
子系統(tǒng)對(duì)應(yīng)有sys目錄下的第一和第二級(jí)目錄:如bus,pci,scsi等。
Kobject對(duì)應(yīng)有設(shè)備、驅(qū)動(dòng)等。
2、總線、設(shè)備、設(shè)備驅(qū)動(dòng)關(guān)系
以上三者在設(shè)備模型中是相互關(guān)聯(lián)的。分別有對(duì)應(yīng)的結(jié)構(gòu)體來表示:
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image006.gif
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image008.gif
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image010.gif
以上三者關(guān)系圖如下:
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image012.gif
3、分析頂層bus子系統(tǒng)和pci總線注冊(cè)過程(分析代碼)
Bus.c:(drivers/base)
subsystem_register(&bus_subsys) è kset_add è kset_add
頂層總線系統(tǒng)就對(duì)應(yīng)/sys/bus目錄。其他任何新注冊(cè)的總線內(nèi)型都在改目錄下。頂層總線bus對(duì)外提供了bus_register函數(shù)來保證其他總線在/sys/bus目錄下。往系統(tǒng)內(nèi)注冊(cè)一條新的總線需要調(diào)用該函數(shù)。下面可以看bus_register函數(shù)的調(diào)用過程:
int bus_register(struct bus_type * bus)
{
int retval;
retval = kobject_set_name(&bus->subsys.kset.kobj, "%s", bus->name);
if (retval)
goto out;
subsys_set_kset(bus, bus_subsys);
retval = subsystem_register(&bus->subsys);
if (retval)
goto out;
kobject_set_name(&bus->devices.kobj, "devices");
bus->devices.subsys = &bus->subsys;
retval = kset_register(&bus->devices);
if (retval)
goto bus_devices_fail;
kobject_set_name(&bus->drivers.kobj, "drivers");
bus->drivers.subsys = &bus->subsys;
bus->drivers.ktype = &ktype_driver;
retval = kset_register(&bus->drivers);
if (retval)
goto bus_drivers_fail;
bus_add_attrs(bus);
…
}
所以新注冊(cè)進(jìn)/sys/bus目錄下的總線目錄下又有devices和drivers兩個(gè)目錄,這也與上面device、device_driver、bus關(guān)系圖相吻合。
搜bus_register就可以知道系統(tǒng)內(nèi)注冊(cè)過哪些總線內(nèi)型,找到pci總線注冊(cè)的地方。
Pci-driver.c:(drivers/pci)
static int __init pci_driver_init(void)
{
return bus_register(&pci_bus_type);
}
很簡(jiǎn)單,這里正是調(diào)用上面的總線注冊(cè)函數(shù),可以跟進(jìn)去再分析一遍,加深映像。那么注冊(cè)以后我們會(huì)看到目錄/sys/bus/pci,并且該目錄下還有drivers和devices兩個(gè)目錄,它們下面都是空的。
我們?yōu)槭裁匆?cè)總線?
為設(shè)備服務(wù),這就引出如何注冊(cè)設(shè)備、設(shè)備驅(qū)動(dòng)程序?往系統(tǒng)中注冊(cè)一個(gè)新的總線后至少要向外面到處兩個(gè)函數(shù),一個(gè)是該總線上設(shè)備到來后的往總線上注冊(cè)設(shè)備的函數(shù),另一個(gè)是注冊(cè)設(shè)備驅(qū)動(dòng)的函數(shù)。往往一個(gè)總線與其具體協(xié)議有關(guān),如何發(fā)現(xiàn)設(shè)備、和注冊(cè)設(shè)備是和具體的硬件驅(qū)動(dòng)以及協(xié)議有關(guān)系,所以注冊(cè)設(shè)備從最底下到上面是一個(gè)復(fù)雜的過程,如scsi總線系統(tǒng)注冊(cè)一個(gè)scsi硬盤。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image014.gif
可以猜測(cè)上面分析的兩個(gè)必備函數(shù)作用?最直觀的感覺就是往相對(duì)應(yīng)總線目錄下devices和drivers目錄下填設(shè)備的驅(qū)動(dòng)的信息。這同樣是根據(jù)kobject來實(shí)現(xiàn)的。
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/103332/showart_2034998.html |
|