0

您好我想知道如何从用户空间调用/运行以下函数。

static ssize_t lm70_sense_temp(struct device *dev,
        struct device_attribute *attr, char *buf)

{ //一些代码。. 状态 = sprintf(buf, "%d\n", val); /* 摄氏度 */ . . //一些代码 }

这个函数定义在 linux 源码的 kernel/drivers/hwmon 文件夹下的 lm70.c 驱动中?是否可以将此函数内部变量的值传递给用户应用程序?我想在上述函数中检索 val 变量的值...

4

3 回答 3

1

您不需要从用户空间调用此函数来获取该值 - 它已经通过 sysfs 导出给您。

您可以使用 grep 来查找它是哪个 hwmon 设备:

grep -rl "lm70" /sys/class/hwmon/*/name /sys/class/hwmon/*/*/name

然后你可以从你的用户空间程序中读取温度输入,例如:

#include <stdio.h>
#include <fcntl.h>

#define SENSOR_FILE "/sys/class/hwmon/hwmon0/temp1_input"

int readSensor(void)
{
    int fd, val = -1;
    char buf[32];
    fd = open(SENSOR_FILE, O_RDONLY);
    if (fd < 0) {
        printf("Failed to open %s\n", SENSOR_FILE);
        return val;
    }
    if (read(fd, &buf, sizeof(buf)) > 0) {
        val = atoi(buf);
        printf("Sensor value = %d\n", val);
    } else {
        printf("Failed to read %s\n", SENSOR_FILE);
    }
    close(fd);
    return val;
}

正如其他人已经说过的那样 - 你不能从用户空间调用内核代码,他们的休息时间。

于 2013-04-30T22:28:38.137 回答
1

我不太了解内核内部结构。但是,我lm70_sense_temp在整个内核源代码树中查找,它只出现在文件linux-3.7.1/drivers/hwmon/lm70.c中,首先作为静态函数,然后作为DEVICE_ATTR.

然后我用谷歌搜索linux kernel DEVICE_ATTR并立即找到了device.txt,这表明你可能应该通过 sysfs 阅读它,即在/sys; 阅读sysfs-rules.txt;所以用户应用程序很可能会在下面读取相关内容/sys/

我不赞成您的问题,因为我觉得您可以像我一样搜索几分钟(而且我不是内核专家)。

于 2013-01-02T08:27:10.133 回答
0

您不能直接从用户空间调用驱动程序函数。

如果该函数是用EXPORT_SYMBOLor导出的,EXPORT_SYMBOL_GPL那么我们可以编写一个简单的内核模块并直接调用该函数。结果可以通过 FIFO 或共享内存发送到用户空间。

但是在您的情况下,此功能不会被导出。所以你不应该这样做。

于 2013-01-03T09:02:09.890 回答