nvdimm_bus
说实话,对于nvdimm_bus中的成员含义还知之甚少。不过暂时还不影响对这个结构体生成过程的理解。
函数原型揭示的秘密
首先我们看一下创建nvdimm_bus这个结构调用的函数,看看它能带给我们什么信息:
struct nvdimm_bus *nvdimm_bus_register(struct device *parent,
struct nvdimm_bus_descriptor *nd_desc)
从总可以看到,生成nvdimm_bus结构体需要两个成员:
parent: 父节点
nd_desc:描述信息
父节点含义很明确,那这个描述信息是什么,在哪里呢?
数据结构的关联
从数据结构的角度上看,刚才的问题就可以从acpi_nfit_desc结构体中找到:
acpi_nfit_desc
+-----------------------------------------------+
|dev | = point to an acpi_device
| (struct device*) |
+-----------------------------------------------+
|acpi_header |
| (struct acpi_table_header) |
+-----------------------------------------------+
|nd_desc | * <-----------------------------------+
| (struct nvdimm_bus_descriptor) | |
| +------------------------------------------+ |
| |attr_groups | = acpi_nfit_attribute_groups |
| | (struct attribute_group**) | |
| |provider_name | = "ACPI.NFIT" |
| | (char *) | |
| | | |
| +------------------------------------------+ |
| |ndctl | = acpi_nfit_ctl |
| | (ndctl_fn) | |
| |flush_probe | = acpi_nfit_flush_probe |
| |clear_to_send | = acpi_nfit_clear_to_send |
| | | |
| +------------------------------------------+ |
|nvdimm_bus | * |
| (struct nvdimm_bus*) | |
| +------------------------------------------+ |
| |nd_desc | point to the above nd_desc -----------+
| | (struct nvdimm_bus_descriptor*) |
| |dev |
| | (struct device) |
| | +-----------------------------------+
| | |name | "ndbus%d"
| | |groups | = nd_desc->attr_groups
| | |release | = nvdimm_bus_release
| | | |
| | +-----------------------------------+
| |list |
| |mapping_list |
| | (struct list_head) |
| | |
+----+------------------------------------------+
可以看出,用来创建nvdimm_bus的描述信息nd_desc是在acpi_nfit_desc中的。这么看是不是感觉清楚了一点点?
nd_bus_driver -> /dev/ndctl0
nvdimm_bus设备生成之后接下去的事情就交给了对应的驱动 nd_bus_driver。这个驱动超级简单,但是作用倒是有点。
int nvdimm_bus_create_ndctl(struct nvdimm_bus *nvdimm_bus)
{
dev_t devt = MKDEV(nvdimm_bus_major, nvdimm_bus->id);
struct device *dev;
dev = device_create(nd_class, &nvdimm_bus->dev, devt, nvdimm_bus,
"ndctl%d", nvdimm_bus->id);
if (IS_ERR(dev))
dev_dbg(&nvdimm_bus->dev, "failed to register ndctl%d: %ld\n",
nvdimm_bus->id, PTR_ERR(dev));
return PTR_ERR_OR_ZERO(dev);
}
可以看到主要的工作就是创建了/dev/ndctl%d设备。这下终于知道这个设备文件是如何来的了。
Last updated