Чтение файла в ядре Linux - PullRequest
0 голосов
/ 06 ноября 2018

поэтому, прежде чем я получу обличье "ты не должен этого делать", я знаю, что не должен. Но это для грязного, быстрого доказательства концепции для некоторой исследовательской работы. Если концепция сработает, я посмотрю на правильный экспорт информации в мой модуль. Мои знания в этой области очень малы, так как я когда-либо использовал sysfs только для раскрытия значений, которые я генерирую в своих модулях, любые указатели в правильном направлении будут с благодарностью. Я много гуглил и, к сожалению, потерпел неудачу.

Чего мне нужно достичь: Мне нужно прочитать значения устройства и sysfs для датчиков мощности и графического процессора для моей конкретной платы Android (Odroid XU3), работающей с ядром 3.10.9.

Где работает мой модуль: Я пишу регулятор мощности 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;

Затем я попытался реализовать методы, подобные тем, которые объясняют здесь и здесь .

В настоящее время я пробовал следующее для файлов моих датчиков:

определяет и структурирует

#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));

вызвано из инициата моего губернатора

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;
 }

Открытие файла всегда заканчивается неудачей, поэтому я могу прийти к единственному выводу, что файл не существует. Таким образом, я переместил код в повторяющуюся задачу моего губернатора с флагом «открыт», который помешал бы повторному открытию файлов. Это дало те же результаты, когда файлы не могли быть открыты.

Я попробовал более упрощенный подход (ниже), который также не удался.

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;

}

Я надеюсь, что кто-то может помочь или указать мне правильное направление, поскольку я не могу на всю жизнь понять, чего мне не хватает.

Мне не удалось найти способ проверки, существует ли файл в ядре (кроме попыток открыть его, что я и делаю).

Приветствия

...