本文转载自 http://blog.china unix.net/uid-24631445-id-3419097.html
不过本人在此将源码修改为3.14.3的源码了
当按下开机键后,电脑经过自检,执行引导程序,内核初始化,然后创建了内核线程init线程,init线程调用do_basic_setup()来初始化外部设备,加载驱动程序....
(这一段实在其他地方看来的,并不表示我看过内核初始化的代码)
文件/init/main.c
static void __init do_basic_setup(void)
{
}
下面是driver_init()函数
文件/drivers/base/init.c
void __init driver_init(void)
{
}
它又调用了devices_init()、buses_init()、chasses_init();
下面是devices_init()
文件/drivers/base/core.c
int __init devices_init(void)
{
}
devices_kset
=
kset_create_and_add
(
"devices"
,
&
device_uevent_ops
,
NULL
)
;
dev_kobj
=
kobject_create_and_add
(
"dev"
,
NULL
)
;
sysfs_dev_block_kobj
=
kobject_create_and_add
(
"block"
,
dev_kobj
)
;
sysfs_dev_char_kobj
=
kobject_create_and_add
(
"char"
,
dev_kobj
)
;
下面的buses_init,classes_init,firmware_init,hypervisor_init与此类似,下面列出这些函数创建的kset和kobject对象。在创建这些对象的时候也会在/sys目录下创建相应的目录。
- buses_init:
-
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
-
system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj); -
- classes_init:
-
class_kset = kset_create_and_add("class", NULL, NULL);
-
- firmware_init:
-
firmware_kobj = kobject_create_and_add("firmware", NULL);
-
- hypervisor_init:
-
hypervisor_kobj = kobject_create_and_add("hypervisor", NULL);
接着是函数:platform_bus_init(),
文件/drivers/base/platform.c
- int
__init platform_bus_init(void)
- {
-
int error;
-
early_platform_cleanup();
-
-
error = device_register(&platform_bus);
-
if(error) return error;
-
-
error = bus_register(&platform_bus_type);
-
if(error) -
device_unregister(&platform_bus);
-
return error;
- }
-
- struct device platform_bus = {
-
.init_name = "platform", - };
-
- struct bus_type platform_bus_type = {
-
.name = "platform", -
.dev_groups = platform_dev_groups, -
.match = platform_match, -
.uevent = platform_uevent, -
.pm = &platform_dev_pm_ops - };
接着是:
cpu_dev_init
(
)
;
文件
/drivers/base/cpu.c
void __init cpu_dev_init(void)
{
}
struct bus_type cpu_subsys = {
#ifdef CONFIG_HOTPLUG_CPU
#endif
};
下面是
subsys_system_register()函数
文件/drivers/base/bus.c
int subsys_system_register(struct bus_type *subsys,
{
}
因此在/sys/devices/system目录下创建了cpu目录
最后是memory_dev_init函数
文件/drivers/base/memory.c
int __init memory_dev_init(void)
{
out:
}
可以看出整个driver_init()只是在/sys下创建了一系列的kset和kobject对象和相应的目录,但没有创建任何真正的设备,或者虚拟的设备。比如/sys/devices/system/cpu目录下的cpu0目录的创建,这些可能是在do_initcalls中处理的,我得先搞清楚这个函数是怎么起作用的