注意:我现在列出这个问题,我不反对更改实现(将类的创建移动到公共(public)区域例如)如果它让事情变得更容易......我只是不知道该怎么做。 :尾注
我有两个 Linux 内核模块,我正在尝试为它们更新/sys 条目。在谷歌和其他来源上搜索,我看到了很多代码:
static dev_t MyDev;
static struct class *c1;
static int __init start_func(void)
{
...
MyDev = MKDEV(nMajor, MINOR_VERSION);
register_chrdev_region(MyDev, 1, MODULE_NAME);
c1 = class_create(THIS_MODULE, "chardrv");
device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
....
我已经验证了我的第一个模块此代码有效,并且它正确地创建了:
/sys/class/chardrv/<MODULE_NAME>
条目。我想知道的是如何在现有类中创 build 备。换句话说,我的一个模块创建了这个新的 chardrv 类,现在我希望我的另一个模块也能够在同一类下注册它的设备。
我不能再次调用 class_create()(在第二个模块中),因为那个“chardrv”类已经存在了......
所以我可以检查/sys/class/chardrv 是否存在,这可以帮助我决定是否需要调用 class_create(),这不是问题。让我们在这里放一些伪代码来澄清:
if ( path "/sys/class/chardrv" does not exist)
new_class = class_create("chardrv")
else
new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
所以按照这个例子,如果我的类已经存在,而我只是想将我的新设备从第二个模块添加到其中,我假设我需要创建一个类结构并以某种方式填充它使用正确的“chardrv 类”属性,然后像以前一样调用 device_create,但我不确定该怎么做。
最佳答案
要对同一类使用 device_create
函数,只需将指向同一类的指针传递给它即可。
由于您想在与创建类所在的模块不同的模块中调用 device_create
,因此您需要导出指向该类的指针的符号。您可以使用 EXPORT_SYMBOL
宏来执行此操作。
例如:
module1.c:
extern struct class *c1; /* declare as extern */
EXPORT_SYMBOL(c1); /* use EXPORT_SYMBOL to export c1 */
static dev_t mod1_dev;
static int __init start_func(void)
{
...
/* define class here */
c1 = class_create(THIS_MODULE, "chardrv");
/* create first device */
device_create(c1, NULL, mod1_dev, NULL, "mod1_dev");
....
}
module2.c
extern struct class *c1; /* declare as extern */
static dev_t mod2_dev;
static int __init start_func(void)
{
...
/* c1 is defined in module 1 */
/* create second device */
device_create(c1, NULL, mod2_dev, NULL, "mod2_dev");
....
}
注意:您需要在 module2 之前插入 module1,因为类指针是在 module1 中定义和导出的。
这应该创建您期望的目录:
/sys/class/chardrv/mod1_dev
/sys/class/chardrv/mod2_dev
顺便说一下,如果您在尝试加载第二个模块时收到无效参数
错误,您可能必须add a KBUILD_EXTRA_SYMBOLS
line to your Makefile .
关于c - 在 Linux 中,如何在现有类中使用 device_create?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993467/