Несовместимый тип указателя при добавлении системного вызова xv6 - с использованием согласованного типа возвращаемого значения, определенного в sysfunc.h - PullRequest
0 голосов
/ 28 февраля 2019

Это мой первый вопрос, так что конструктивная критика приветствуется:)

Я пытаюсь добавить системный вызов в xv6.Я делал это раньше, но я никогда не сталкивался с этой конкретной ошибкой.Я получаю сообщение об ошибке:

kernel/syscall.c:106:16: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
 [SYS_getpinfo] sys_getpinfo,

Я немного погуглил, и похоже, что проблема заключается либо в том, что я не определил свой системный вызов где-то, что мне нужно (обычно sysfunc.h),или я использовал другой тип возврата в одном из определений.Дело в том, что я проверил и перепроверил типы возвращаемых данных и добавил системный вызов буквально везде, где только могу придумать, и все еще получаю эту ошибку.

Мне интересно, есть ли способ просто привести тип указателя?В любом случае, если у вас есть идея, почему это все еще происходит, или как это исправить, я буду очень признателен.

Здесь я везде определил свой системный вызов:

sysproc.c:

int sys_getpinfo(struct pstat* p){
    //implementation
}

sysfunc.h:

int sys_getpinfo(struct pstat*);

user.h:

int getpinfo(struct pstat*);

usys.S:

SYSCALL(getpinfo)

syscall.c:

[SYS_getpinfo] sys_getpinfo,

syscall.h:

#define SYS_getpinfo 22

Спасибо за чтение!

1 Ответ

0 голосов
/ 02 марта 2019

Статический массив syscalls определяется следующим образом (в syscall.c):

static int (*syscalls[])(void) = {

Это означает, что все указатели на функции, добавленные в этот массив, должны возвращать тип int и не должны ожидать параметров.

Новая реализованная вами функция sys не соответствует описанной выше, поскольку вы определили ее так, что она ожидает параметр указателя структуры.

Исправьте функцию, чтобы она не получала никаких параметров.Если вам нужен параметр из пользовательского пространства для реализации системного вызова, вы должны заставить пользовательское пространство передать его в свой пользовательский стек и извлечь его оттуда в оболочке sys_getpinfo.Пожалуйста, смотрите этот вопрос для получения дополнительной информации о том, как.

...