系统启动时在bus系统中注册platform总线

系统启动时在bus系统中注册platform总线

platform总线的注册是由platform_bus_init函数完成的,主要的内容是注册bus_type结构体类型的变量

Linux设备模型–设备驱动模型和sysfs文件系统解读http://www.cnblogs.com/Ph-one/p/5052191.html

该函数在内核启动阶段被调用,简单看下调用过程:

start_kernel()->rest_init()->kernel_init()->do_basic_setup()->driver_init()->platform_bus_init()

注:kernel_init()是在rest_init函数中创建内核线程来执行的
    源代码:kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

platform_bus_init
blog012

bus_register
blog013

函数中,首先调用kobject_set_name设置了bus对象的subsys.kobject->name 为 platform,也就是说会建立一个名为platform的目录

在这里还用到了bus_kset这个变量,这个变量就是在buses_init函数中建立bus目录所对应的kset对象

接着,priv->subsys.kobj.kset = bus_kset,设置subsys的kobj在bus_kset对象包含的集合中,也就是说bus目录下将包含subsys对象所对应的目录,即platform

紧接着调用了kset_register,参数为&priv->subsys。该函数在……在该函数的调用过程中,将调用kobj_kset_join函数,该函数将kojbect添加到kobject->kset结构(也就是他的上一级目录bus)中的链表当中

kset_register函数执行完成后,将在/sys/bus/下建立目录platform。此刻,我们先来看下kset和kobject之间的关系

p.2

然后,调用了bus_create_file函数在/sys/bus/platform/下建立文件uevent

接着调用了2次kset_create_and_add,分别在/sys/bus/platform/下建立了文件夹devicesdrivers

这里和我们之前讲/sys下创建bus目录时用到的kset_create_and_add时的最主要一个区别就是:

此时的parent参数不为NULL,而是&priv->subsys.kobj

也就是说,将要创建的kset的kobject->parent = &priv->subsys.kobj,也即新建的kset被包含在platform文件夹对应的kset中

p.3

随后,调用了add_probe_files创建了属性文件drivers_autoprobedrivers_probe

好了,整个bus_register调用完成了,我们来看下sysfs中实际的情况

[root@yj423 platform]#pwd
/sys/bus/platform
[root@yj423 platform]#ls
devices            drivers            drivers_autoprobe  drivers_probe      uevent

最后,我们对整个bus_register的过程进行一个小结:

p.4

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值