在最低層, Linux 系統中的每個設備由一個 struct device 代表:
struct device { struct device *parent; struct kobject kobj; char bus_id[BUS_ID_SIZE]; struct bus_type *bus; struct device_driver *driver; void *driver_data; void (*release)(struct device *dev); /* Several fields omitted */ };
有許多其他的 struct device 成員只對設備核心代碼感興趣. 但是, 這些成員值得了解: struct device *parent
327
設備的 "parent" 設備 -- 它所附着到的設備. 在大部分情況, 一個父設備是某種 總線或者主控制器. 如果 parent 是 NULL, 設備是一個頂層設備, 這常常不是你 所要的.
struct kobject kobj;
代表這個設備並且連接它到層次中的 kobject. 注意, 作為一個通用的規則, device->kobj->parent 等同於 device->parent->kobj.
char bus_id[BUS_ID_SIZE];
唯一確定這個總線上的設備的字符串. PCI 設備, 例如, 使用標准的 PCI ID 格式, 包含域, 總線, 設備, 和功能號.
struct bus_type *bus; 確定設備位於哪種總線.
struct device_driver *driver;
管理這個設備的驅動; 我們查看 struct device_driver 在下一節. void *driver_data;
一個可能被設備驅動使用的私有數據成員. void (*release)(struct device *dev);
當對這個設備的最后引用被去除時調用的方法; 它從被嵌入的 kobject 的 release 方法被調用. 注冊到核心的所有的設備結構必須有一個 release 方法, 否則內核打印出慌亂的抱怨.
最少, parent, bus_id, bus, 和 release 成員必須在設備結構被注冊前設置.