Linux驱动程序通过sysfs访问

Ted*_*ton 7 linux kernel driver linux-device-driver sysfs

我正在制作一个小内核模块,以提供用户空间访问ARMv7芯片的某些内核模式功能(特别是缓存控制).我正在阅读Corbet,Rubini和Hartman的Linux设备驱动程序.在其中,他们描述了如何制作完整的驱动程序+设备+总线.我根本不想创建一个总线驱动程序.事实上,我正在制作的"驱动程序"根本不需要与设备定义匹配 - 它与平台的CPU隐式匹配.任何人都可以向我解释:

  1. 在sysfs中我的属性应该去哪里?它应该在我的模块条目下/sysfs/modules/mymodule吗?/sys/devices/platform似乎也很有希望,也是如此/sys/devices/system/cpu.
  2. 如果存在我应该放置kobject/属性的现有位置,我该如何将其插入?我如何获得必要的kset?我见过的所有例子都创建了一个kset然后从它链接到kobject- 我还没有看到用于请求现有命名的API kset

很抱歉,如果这显然是不可能的,或者某些地方有一些非常直接且易于发现的例子,我还没有因某些原因而发现.任何人都可以对此有所了解吗?

Bre*_*nks 8

我没有使用过很多sysfs,但是我找到了一个看起来很简单的例子,它和你正在做的很相似(当然,它也在ARM下).看一下arch/arm/mach-omap1/pm.c,特别是idle_show/ idle_storesysfs文件.它被注册(使用sysfs_create_file())为/sys/power/sleep_while_idle并使用全局/sys/powerkobj(定义include/linux/kobject.h).在那里定义了一些其他全局kobj,你可以使用,虽然我不认为任何适合你的驱动程序.

这会成为平台驱动程序吗?作为一个不适合任何公共汽车的司机,它似乎很合适.平台驱动程序在/ sys/devices/platform下获得自己的目录,并且可以在那里拥有属性.看看drivers/hwmon/coretemp.c,里面有temp1_crit,temp1_crit_alarm,temp1_input,等作为属性.它看起来相当简单:创建属性(可能带有__ATTR()?),将它们全部列在数组中,定义一个attribute_group,sysfs_create_group()probe()函数中注册它,然后sysfs_remove_group()remove()函数中注销它.

sysfs_create_group如果您需要其他示例,可能还有其他平台驱动程序可以定义属性(搜索).希望这可以帮助!