Wednesday, April 18, 2012

搞定一个kobjects, sysfs相关的问题

最近在把一个功能从“新”的2.6.38内核BACK PORT到2.6.9上面。碰到了很多稀奇古怪的问题。比如有的函数,在EXPORT_SYMBOL之后,可以被其他函数调用,但是返回的指针的高32位会被自动清零(目标是 X86/64BIT SMP). 搞了半天,发现一定要在.H里面声明一下才行。

今天搞的SYSFS的一个问题。在我把新代码复制到老的内核上面之后,发现少了一部分SYSFS文件,但是其他几个又在的。于是看了半天SYSFS, KOBJECT. 总算搞清楚了一点。

KOBJECTS可以指定一个KTYPES,在KTYPES里面包括有SYSFS_OP 和DEFAULT_ATTRS。如果这些都设置好了,在KOBJECT_ADD的时候,就会自动在 SYSFS下面生成相应的 SYSFS 文件。另外一个方法是调用sysfs_create_file. 这样可以添加新的文件。

在新的内核里面,KTYPES是在 调用KOBJECT_INIT 或者类似函数的时候,就要传过去的。然后在函数内部设置好。老的内核还是要自己设置。

需要注意的是,设置 KTYPES 一定要在调用 KOBJECT_ADD(或者类似函数)之前。否则设了也没用。我今天就是调试了半天才发现这点。

另外比较奇怪的是,开始我把ktypes设置放到了后面,然后跑了下,发现多了几个sysfs文件。于是让我误以为ktypes已经设置好了。后来才发现根本没放对地方。不过为啥放在后面也会多出几个sysfs文件呢?这个就搞不清楚了。先回家去再说。

No comments: