首先看下sys/devices怎么来的? 在初始的启动汇编中会跳到start_kernel---->rest_init---->kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND)---->do_basic_setup(void)---->driver_init(void)---->buses_init();
int __init buses_init(void)
/sys/bus 就建立了,bus_uevent_ops做什么目前还不了解,先不管了
看下platform这个虚拟的bus怎么建立的。
同样是在driver_init(void)---->platform_bus_init(void) //driver_init 函数的注释是driver_init - initialize driver model.
int __init platform_bus_init(void) error = device_register(&platform_bus); // /************
struct device platform_bus = { 这个地方生成了/sys/devices/platform 目录 和devices篇有关联
************/ 主要看error = bus_register(&platform_bus_type);
priv = kzalloc(sizeof(struct bus_type_private), GFP_KERNEL);
priv->bus = bus; BLOCKING_INIT_NOTIFIER_HEAD(&priv->bus_notifier); retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name); //bus->name 是“platform” ,将priv->subsys.kobj 的name定为“platform”;
priv->subsys.kobj.kset = bus_kset; //将priv->subsys.kobj.kset定为bus_kset buses_init();中的bus_kset
retval = kset_register(&priv->subsys); //在sys/bus/下生成了platform目录 retval = bus_create_file(bus, &bus_attr_uevent); /******************* 找了半天没找到bus_attr_uevent那儿定义的,用SI搜到搜不到,google才发现是这样的: Bus.c中:static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);
而#define BUS_ATTR(_name, _mode, _show, _store) /
所以这里在platform下面创建了一个名为uevent的文件
******************/
priv->devices_kset = kset_create_and_add("devices", NULL,
priv->drivers_kset = kset_create_and_add("drivers", NULL,
klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put); //初始化bus包含的devices链表和drivers链表 retval = add_probe_files(bus);
//调用bus_create_file函数创建drivers_probe和drivers_autoprobe两个文件 retval = bus_add_attrs(bus);
//Add default attributes for this bus.
pr_debug("bus: '%s': registered/n", bus->name);
bus_attrs_fail:
bus先分析到这儿 (责任编辑:IT) |