Как перекрывать системный вызов с другим типом возврата в ядре - PullRequest
0 голосов
/ 08 марта 2020

Я попытался реализовать функцию самоопределения рядов и сопоставить их с исходным системным вызовом, который можно вызывать в пользовательском режиме.

sz = write(fd, write_buf, strlen(write_buf));

Способ, которым я перекрываю эти системные ряды, вызывает следующий пример (в ядре )

const struct file_operations my_fops = {
    .owner = MY_MODULE,
    .read = my_read,
    .write = my_write,
    .open = my_open,
    .release = my_release,
    .llseek = my_lseek,
};

static int my_open(struct inode *inode, struct file *file)
{
    // my implementation ...
    return 0;
}

Хорошо работает, когда я звоню open, тогда на самом деле будет звонить my_open. Но что, если тип возврата отличается от системного вызова origin?

Тип возврата read равен ssize_t, произойдет сбой компиляции, если я верну самоопределенный тип в функции my_read.

Мне интересно, есть ли подход, чтобы решить это? Вот что я хочу.

// in user space
my_type sz;
// it will fail cuz return type of write is ssize_t
sz = write(fd, write_buf, strlen(write_buf));
// in kernel space
static my_type fib_write(struct file *file,
                         const char *buf,
                         size_t size,
                         loff_t *offset)
{
    return {.upper = 0, .lower = 1};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...