日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

linux设备:初始化

發(fā)布時(shí)間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux设备:初始化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文轉(zhuǎn)載自 http://blog.china unix.net/uid-24631445-id-3419097.html 不過(guò)本人在此將源碼修改為3.14.3的源碼了
當(dāng)按下開(kāi)機(jī)鍵后,電腦經(jīng)過(guò)自檢,執(zhí)行引導(dǎo)程序,內(nèi)核初始化,然后創(chuàng)建了內(nèi)核線程init線程,init線程調(diào)用do_basic_setup()來(lái)初始化外部設(shè)備,加載驅(qū)動(dòng)程序.... ?(這一段實(shí)在其他地方看來(lái)的,并不表示我看過(guò)內(nèi)核初始化的代碼)
文件/init/main.c static void __init do_basic_setup(void) { ????????cpuset_init_smp(); ????????usermodehelper_init(); ????????shmem_init(); ????????driver_init(); ????????init_irq_proc(); ????????do_ctors(); ????????usermodehelper_enable(); ????????do_initcalls(); ????????random_int_secret_init(); }
下面是driver_init()函數(shù) 文件/drivers/base/init.c void __init driver_init(void) { ???????? ????????devtmpfs_init(); ????????devices_init(); ????????buses_init(); ????????classes_init(); ????????firmware_init(); ????????hypervisor_init();
???????? ????????platform_bus_init(); ????????cpu_dev_init(); ????????memory_dev_init(); ????????container_dev_init(); }
它又調(diào)用了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); ????????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; }
因此devices_init()就是調(diào)用kset_create_and_add和kobject_create_and_add函數(shù)來(lái)創(chuàng)建kset和kobject對(duì)象。 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與此類似,下面列出這些函數(shù)創(chuàng)建的kset和kobject對(duì)象。在創(chuàng)建這些對(duì)象的時(shí)候也會(huì)在/sys目錄下創(chuàng)建相應(yīng)的目錄。
  1. buses_init:
  2. ?????bus_kset?=?kset_create_and_add("bus",?&bus_uevent_ops,?NULL);
  3. ?????????system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj);

  4. classes_init:
  5. ?????class_kset?=?kset_create_and_add("class",?NULL,?NULL);

  6. firmware_init:
  7. ?????firmware_kobj?=?kobject_create_and_add("firmware",?NULL);

  8. hypervisor_init:
  9. ?????hypervisor_kobj?=?kobject_create_and_add("hypervisor",?NULL);

接著是函數(shù):platform_bus_init(),
文件/drivers/base/platform.c
  1. int?__init platform_bus_init(void)
  2. {
  3. ????int?error;
  4. ????early_platform_cleanup();
  5. ???
  6. ????error?=?device_register(&platform_bus);
  7. ????if(error)?return?error;
  8. ???
  9. ????error?=?bus_register(&platform_bus_type);
  10. ????if(error)
  11. ????device_unregister(&platform_bus);
  12. ????return?error;
  13. }
  14. ?
  15. struct device platform_bus = {
  16. ????.init_name = "platform",
  17. };

  18. struct bus_type platform_bus_type = {
  19. ????.name ?????= "platform",
  20. ????.dev_groups ????= platform_dev_groups,
  21. ????.match ????= platform_match,
  22. ????.uevent ???= platform_uevent,
  23. ????.pm ???????= &platform_dev_pm_ops
  24. };

接著是:cpu_dev_init(); 文件/drivers/base/cpu.c void __init cpu_dev_init(void) { ????????if (subsys_system_register(&cpu_subsys, cpu_root_attr_groups)) ????????????????panic("Failed to register CPU subsystem");
????????cpu_dev_register_generic(); }
struct bus_type cpu_subsys = { ????????.name = "cpu", ????????.dev_name = "cpu", ????????.match = cpu_subsys_match, #ifdef CONFIG_HOTPLUG_CPU ????????.online = cpu_subsys_online, ????????.offline = cpu_subsys_offline, #endif };

下面是subsys_system_register()函數(shù) 文件/drivers/base/bus.c int subsys_system_register(struct bus_type *subsys, ??const struct attribute_group **groups) { ????????return subsys_register(subsys, groups, &system_kset->kobj); } 因此在/sys/devices/system目錄下創(chuàng)建了cpu目錄
最后是memory_dev_init函數(shù) 文件/drivers/base/memory.c int __init memory_dev_init(void) { ????????unsigned int i; ????????int ret; ????????int err; ????????unsigned long block_sz;
????????ret = subsys_system_register(&memory_subsys, memory_root_attr_groups); ????????if (ret) ????????????????goto out;
????????block_sz = get_memory_block_size(); ????????sections_per_block = block_sz / MIN_MEMORY_BLOCK_SIZE;
????????mutex_lock(&mem_sysfs_mutex); ????????for (i = 0; i < NR_MEM_SECTIONS; i += sections_per_block) { ????????????????err = add_memory_block(i); ????????????????if (!ret) ????????????????????????ret = err; ????????} ????????mutex_unlock(&mem_sysfs_mutex);
out: ????????if (ret) ????????????????printk(KERN_ERR "%s() failed: %d\n", __func__, ret); ????????return ret; }
可以看出整個(gè)driver_init()只是在/sys下創(chuàng)建了一系列的kset和kobject對(duì)象和相應(yīng)的目錄,但沒(méi)有創(chuàng)建任何真正的設(shè)備,或者虛擬的設(shè)備。比如/sys/devices/system/cpu目錄下的cpu0目錄的創(chuàng)建,這些可能是在do_initcalls中處理的,我得先搞清楚這個(gè)函數(shù)是怎么起作用的

總結(jié)

以上是生活随笔為你收集整理的linux设备:初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。