在Linux内核中读取文件

时间:2018-11-06 11:20:59

标签: c linux-kernel sysfs android-kernel

因此,在我明白“你不应该那样做”之前,我知道我不应该这样做。但这是对某些研究工作的肮脏,快速的概念证明。如果该概念可行,我将考虑将信息正确导出到模块中。我对这方面的知识非常少,因为我只使用过sysfs来公开我在模块中生成的值,因此朝正确方向的任何指针将不胜感激。我做了很多谷歌搜索,不幸的是我缺席了。

我需要实现的目标: 我需要为运行3.10.9内核的特定Android板(Odroid XU3)读取功率传感器和GPU的设备和sysfs值。

我的模块在哪里运行: 我正在编写一个cpufreq电源调节器,它试图根据系统信息创建FSM(因此需要读取文件)。

在我的州长中,我试图将文件打开为文件指针,然后将其保存并读取每个州长的滴答声。

struct file* f_mali_freq;
struct file* f_mali_load;
struct file* f_big_ina231;
struct file* f_little_ina231;
struct file* f_mem_ina231;
struct file* f_gpu_ina231;

然后,我尝试实现类似于解释herehere的方法。

目前,我已尝试对传感器的文件进行以下操作:

定义和构造

#define INA231_IOCGREG      _IOR('i', 1, struct ina231_iocreg *)
#define INA231_IOCSSTATUS   _IOW('i', 2, struct ina231_iocreg *)
#define INA231_IOCGSTATUS   _IOR('i', 3, struct ina231_iocreg *)

 struct ina231_iocreg {
     unsigned char name[20];
     unsigned int enable;
     unsigned int cur_uV;
     unsigned int cur_uA;
     unsigned int cur_uW;
 } __attribute__ ((packed));

在我的州长的init内调用

f_big_ina231 = open_ina231("/dev/sensor_arm");

static struct file *open_ina231(const char *path)
{
    mm_segment_t old_fs = get_fs();
    struct ina231_iocreg reg;
    struct file *f;
    int ret;

    f = file_open(path);
    if (!f)
        return NULL; // <FAILS HERE

    set_fs(KERNEL_DS);
    if (!f->f_op || !f->f_op->unlocked_ioctl)
        goto out_error;

    /* enable if necessary */
    ret = f->f_op->unlocked_ioctl(f, INA231_IOCGSTATUS, (long unsigned int) &reg);
    if (ret)
        goto out_error;

    if (!reg.enable) {
        reg.enable = true;
        ret = f->f_op->unlocked_ioctl(f, INA231_IOCSSTATUS, (long unsigned int) &reg);
        if (ret)
            goto out_error;
    }
    set_fs(old_fs);
    return f;
out_error:
    KERNEL_DEBUG_MSG(" [OPTIGOV] open_ina231 out_error\n");
    set_fs(old_fs);
    filp_close(f, NULL);
    return NULL;
}

static struct file* file_open(const char *path){
     struct file *f = NULL;

     f = filp_open(path, O_RDWR, 0);
     if(IS_ERR(f)){
         KERNEL_DEBUG_MSG(" [OPTIGOV] file_open failed filp_open\n");
         return NULL;
     }
     return f;
 }

打开文件总是失败,因此我唯一可以得出的结论是该文件不存在。这样,我使用“ opened”标志将代码移到我的州长的重复任务中,这将阻止文件被重复打开。这样就可以在无法打开文件的情况下获得相同的结果。

我尝试了一种更简化的方法(如下),但也失败了。

f_mali_load = file_open("/sys/bus/platform/drivers/mali/11800000.mali/utilization");


static struct file* file_open(const char *path){
struct file *f = NULL;
mm_segment_t oldfs;
int err = 0;

oldfs = get_fs();
set_fs(get_ds());

f = filp_open(path, O_RDONLY, 0);
set_fs(oldfs);

if(IS_ERR(f)){
    KERNEL_DEBUG_MSG(" [OPTIGOV] file_open failed filp_open\n");
    return NULL; // <FAILS HERE
}

KERNEL_DEBUG_MSG(" [OPTIGOV] file_open succedded filp_open\n");

return f;

}

我希望有人能提供帮助或为我指明正确的方向,因为我无法终生了解自己所缺少的东西。

无论如何我都无法测试内核中是否存在文件(除了试图打开它,这就是我正在做的事情)。

欢呼

0 个答案:

没有答案