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