linux驱动子系统笔记
驱动子系统笔记
源码针对版本2.6.39.1
start_kernel-->reset_init->kernel_init 内核线程-->do_basic_setup-->driver_init
重点分析driver_init 函数
/**
* driver_init - initialize driver model.
*
* Call the driver model init functions to initialize their
* subsystems. Called early from init/main.c.
*/
void __init driver_init(void )
{
/* These are the core pieces */
devtmpfs_init()
devices_init()
buses_init()
classes_init()
firmware_init()
hypervisor_init()
/* These are also core pieces, but must come after the
* core core pieces.
*/
platform_bus_init()
system_bus_init()
cpu_dev_init()
memory_dev_init()
}
这就是整个驱动子系统构建的初始过程,当然在这个过程之中只是构建一个大的框架,并没有什么真正
的设备可以运行。接下来我们挨个看看这些函数。
1、devtmpfs_init()
这一部主要是构建一个临时的/dev 文件系统,主要是VFS 的内容,此处不述。
2、devices_init()
int __init devices_init(void )
{
devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL)
if (!devices_kset)
return -ENOMEM
dev_kobj = kobject_create_and_add("dev", NULL)
if (!dev_kobj)
goto dev_kobj_err
sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj)
if (!sysfs_dev_block_kobj)
goto block_kobj_err
sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj)
if (!sysfs_dev_char_kobj)
goto char_kobj_err
return 0
char_kobj_err:
kobject_put(sysfs_dev_block_kobj)
block_kobj_err:
kobject_put(dev_kobj)
dev_kobj_err:
kset_unregister(devices_kset)
return -ENOMEM
}
/* kset to create /sys/devices/ */
struct kset *devices_kset
为driver/base/core.c:467行定义的一个全局变量
static struct kobject *dev_kobj
为driver/base/core.c:44行定义的一个本地变量
struct kobject *sysf