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

先研究 /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);
	else
		printk("%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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值