Как реализовать системный вызов, имеющий параметр структуры?

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

Например, у меня есть следующая структура.

struct procInfo{
int processID[64]; // the PID of each process
};

Допустим, системный вызов, который я хочу реализовать, int getProcessIds(struct procInfo*) и я называю это внутри файла с именем pcid.c,

Я хочу, чтобы системный вызов захватил идентификаторы процессов из планировщика внутри proc.c файл, чтобы я мог распечатать их внутри моего pcid.c файл.

Я знаю, как создавать регулярные системные вызовы, которые не имеют входных параметров. Я также знаю, как распечатать идентификаторы процессов, используя этот системный вызов внутри proc.c файл, однако я не знаю, как распечатать их внутри pcid.c файл. Я не понимаю, как возвращается указатель Strucutre, чтобы я мог распечатать его внутри pcid.c,

Я последовал за аналогичным системным вызовом int fstat(int fd, struct stat*) но я не вижу, как указатель структуры возвращается.

Я надеюсь, что мой вопрос ясен, я использую операционную систему XV6, спасибо!

обновленный

Я смог заставить его работать, мне не нужно было использовать malloc для выделения памяти. Вот странная вещь, хотя, я добавил еще одну переменную в свою структуру, так вот, что это стало.

struct procInfo{
int processID[64]; // the PID of each process
char processname[64][16] // the name of each process
};

После системного вызова внутри proc.c файл, вот как я печатаю значения.

printf(1,"Name = %s\n" ,procInfo->processname[0]);
printf(1,"PID = %d\n" , procInfo->processID[0] );

Но странно то, что я получаю trap 14 err 4 on cpu 1 eip 0x510 addr 0x7417ba08--kill procОднако я попытался напечатать только одно значение, и это сработало.

printf(1,"Name = %s\n" ,procInfo->processname[0]);
//printf(1,"PID = %d\n" , procInfo->processID[0] );

Или же

//printf(1,"Name = %s\n" ,procInfo->processname[0]);
printf(1,"PID = %d\n" , procInfo->processID[0] );

Почему это работает, когда я печатаю только один из них? Я правильно печатаю?

1 ответ

Указатель не возвращается, но указывает на выделенную память, куда будет записываться системный вызов. Вызывающая сторона должна выделить память перед вызовом системного вызова.

Если такая структура уже есть внутри proc.c, вы должны скопировать его в предоставленный буфер с memcpy, Вы никогда не должны передавать ссылки на память ядра программам пользовательского пространства, кроме огромного риска для безопасности, он также может измениться в любое время без ведома программы или находиться в области памяти, недоступной для программы.

Типичное использование будет следующим:

Часть пользовательского пространства:

struct procInfo info;
getProcessIds(&info);

Часть пространства ядра:

int getProcessIds(struct procInfo *info)
{
    struct procInfo *localInfo = getProccessInfoFromScheduler();
    memcpy(info, localInfo, sizeof(struct procInfo));
    return 0;
}
Другие вопросы по тегам