通过打印学习Linux内核之sysfs(1)

来源:互联网 发布:淘宝众筹产品首页 编辑:程序博客网 时间:2024/06/01 22:15

先研究 /lib/kobject.c 吧

先打开该文件把所有的pr_info或者pr_err全部改为printk,能多打印就多打印了

哦,如果要修改代码,我们可以选择用vim,如果你喜欢的话,不过我们用的是deepin系统,可以用sublime-text,用apt-get 安装即可


修改函数kset_create_and_add,添加如下两行:

if(parent_kobj)printk("%s:%d:%s:name = %s,parent_kobj->name = %s,parent_kobj->sd->name= %s\n",__FILE__,__LINE__,__func__,name,kobject_name(parent_kobj),parent_kobj->sd->name);elseprintk("%s:%d:%s:name = %s\n",__FILE__,__LINE__,__func__,name);

第一次修改内核核心代码,有木有很激动?哪怕只是添加几行打印语句。看起来很简单的打印,如果没有上面的判断parent_kobj 是否为空,内核就根本启动不了。

重新make编译,并qemu启动,可以看到大量的打印语句,比较多的是函数kobject_add_internal 和 fill_kobj_path,因为我们把他们的pr_debug改为了printk,所以打印信息都出来了,我们先分析函数kobject_add_internal 的日志,举例:

kobject: 'port' (9fbf6c70): kobject_add_internal: parent: 'clcd@1f000', set: 'devicetree'

那就是新建了一个名叫 port 的kobject,其父为clcd@1f000,如果在目录/sys/下执行命令:

find -name port
可以看到其中一个结果为:

./firmware/devicetree/base/smb/motherboard/iofpga@7,00000000/clcd@1f000/port

这就是该条语句对应的展示,就是新建了一个文件夹,类似的我们可以分析其他日志,也都是新建了一个文件夹,parent就是其父文件夹

我们看kobject_add_internal 的函数源码中就包含了create_dir函数的调用,所以是一致的。

而我们添加的代码,看起来是创建了一些device和driver,module等目录,因为代码中可以看到kset_create_and_add调用kset_register,最终还是会调用kobject_add_internal,kset中包含了一个kobject


下面我们来调试一下函数populate_dir ,看看attr的名称都是些啥东西,在函数populate_dir中sysfs_create_file之前加入一行打印:

printk("%s:%d:%s:kobj->name = %s,attr->name= %s\n",__FILE__,__LINE__,__func__,kobject_name(kobj),attr->name);
编译运行,查看日志中关于attr的内容,举例:

lib/kobject.c:59:populate_dir:kobj->name = rx-0,attr->name= rps_cpus
同样我们在/sys目录下find名称rps_cpus,可以看到搜索结果中有./devices/virtual/net/lo/queues/rx-0/rps_cpus,其是一个文件,其他日志也可以对应查看,都是对应一个文件,那么我们可以暂时这么来理解 kobject和它的 attr

而kset和kobject的关系,我们从日志中看看,举例:

kobject: 'kernel' (9f4ee500): kobject_add_internal: parent: '<NULL>', set: '<NULL>'
这是kobject的parent和set都为NULL的情况,对应的是/sys目录下的一级目录,后面的日志中也可以看到power,module,block等路径也是这么创建出来的

0 0
原创粉丝点击