linux父设备,linux 设备模型---学习记录(二)
通過bus_register()函數(shù)可以弄清楚整個設(shè)備模型的骨架。大致的架構(gòu)弄清楚之后就可以繼續(xù)填充這個模型了。根據(jù)總線、設(shè)備、驅(qū)動由高層到底層的順序,可以以設(shè)備為入口點來繼續(xù)探索。
設(shè)備的入口在device_register()函數(shù)當(dāng)中。該函數(shù)相當(dāng)簡單,僅包含兩個函數(shù)調(diào)用,第一個是device_initialize(),第二個是device_add()函數(shù)。根據(jù)調(diào)用順序依次閱讀其源碼。拋開與設(shè)備模型無關(guān)的代碼不談,雖然sysfs也屬于設(shè)備模型,但可以忽略它。沒有顯示的說明,所列出的代碼都來自
drivers/base/core.c文件。
首先第一個函數(shù)device_initialize()。
570 dev->kobj.kset = devices_kset;
由此可見,所有的設(shè)備都在這個名叫devices_kset的容器當(dāng)中,可以稱其為設(shè)備容器。
571 kobject_init(&dev->kobj, &device_ktype);
顯然,所有的設(shè)備都屬于device_ktype類型的。
在設(shè)備模型當(dāng)中,該函數(shù)的作用就是將該設(shè)備放入設(shè)備容器當(dāng)中,并設(shè)置設(shè)備類型。
第二個函數(shù)device_add()。
971 ?parent = get_device(dev->parent);
972 ?setup_parent(dev, parent);
這兩條語句設(shè)置該設(shè)備的內(nèi)嵌kobject的父kobject為其父設(shè)備的kobject。當(dāng)然,該設(shè)備可能沒有父設(shè)備。再次體現(xiàn)出kobject在設(shè)備模型中對理清各個設(shè)備層次關(guān)系的重要性。
980? error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
將該設(shè)備添加到上層設(shè)備的內(nèi)嵌kobject鏈表當(dāng)中。即dev->kobj.parent.list鏈表。dev->kobj.parent可能為空,由kobject_add函數(shù)可知,會將dev->kobj.kset.kobj設(shè)置為dev->kobj.parent。
而dev->kobj.kset就是devices_kset。這樣對于沒有父設(shè)備的設(shè)備就直接在devices_kset的下層。而devices_kset只是一個容器.所以該設(shè)備就屬于頂層設(shè)備。
1010? error = bus_add_device(dev);
這里在設(shè)備層次上暴露出與總線的交互關(guān)系.跟蹤其函數(shù)調(diào)用。只有一條語句與設(shè)備模型相關(guān)。
在drivers/base/bus.c文件當(dāng)中:
467??klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
該語句就是將該設(shè)備添加到其所連接到的總線上設(shè)備鏈表當(dāng)中。由此可知,通過總線的設(shè)備鏈表可以獲知所有連接到該總線的設(shè)備。相當(dāng)明了了... (有興趣的童鞋可以瀏覽一下klist的接口)
1026 bus_probe_device(dev);
設(shè)備在驅(qū)動模型自設(shè)備往上的邏輯結(jié)構(gòu)已經(jīng)完成了.現(xiàn)在就該給device找個能夠驅(qū)動它的驅(qū)動了。不在此做延伸.這里涉及到了總線、設(shè)備、驅(qū)動三者之間的關(guān)系.而這里僅以設(shè)備位主線來考察。留待驅(qū)動這個層次分析清楚之后再作展開。
1027 if (parent)
1028????? klist_add_tail(&dev->p->knode_parent,
1029????????????? &parent->p->klist_children);
如果該設(shè)備有父設(shè)備.就將其添加到父設(shè)備的子設(shè)備鏈表當(dāng)中。
以上就是device_register所做的所有事情.其中主要就是理清該設(shè)備在設(shè)備模型中與總線、父設(shè)備以及驅(qū)動之間的所有復(fù)雜的關(guān)系.
總結(jié)
以上是生活随笔為你收集整理的linux父设备,linux 设备模型---学习记录(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的ftp轮询上传文件,Andr
- 下一篇: linux系统怎么建ftp服务器地址,U