日期:2014-05-16  浏览次数:20869 次

linux源码分析 sysfs
最近在读linux源代码(slab部分),有一个工具slabinfo可以查看slab的相关信息,其实slabinfo就是读取sys/kernel/slab下面的文件。现在有一问题,sysfs是用来允许用户态进程读取内核数据的,但是我想知道只是如何实现的,具体说,就是想知道以下方面的问题:
1.假设内核中每一部分如slab允许用户态程序访问其中数据,那么slab程序和sysfs是如何建立关系的呢?是slab调用sysfs的借口将数据写入(在数据需要更新时)?还是将sysfs中的某个属性文件和内核中某一数据建立某种关联,当读取属性文件的时侯再读取内核数据?请给出确定答案和分析。
2.我在读取slab源码的时候没有发现和sysfs建立关联的蛛丝马迹,不知是错过了还是不需要在slab源码中和sysfs建立关联,而在引用slab接口的模块中使用sysfs?

------解决方案--------------------
我用的内核版本是2.6.18。
通过cat /proc/slabinfo可以看到已经注册到内核的slab信息。

下面简单介绍一下/proc/slabinfo的实现:
在proc_root_init函数里注册了PROC文件系统proc_fs_type,并进行了mount。
在proc_misc_init函数里,在PROC文件系统中添加了slabinfo文件,此文件的操作函数集为proc_slabinfo_operations。

具体的slab信息是proc_slabinfo_operations操作集访问cache_chain链来实现的。

这里更多的是文件系统的内容,而不是内存管理的内容。

另,如果我们的内核版本不一样,其实现也可能会有差别。


------解决方案--------------------
1.一般都是用户通过文件读取的时候,会调用slab实现的如proc_read之类的函数,返回给用户什么内容都可以在read里面实现。