Как реализовать системный вызов, имеющий параметр структуры?
Я хочу реализовать системный вызов, в котором я передаю ссылку на структурную переменную, затем я хотел бы отобразить значения в том же файле.
Например, у меня есть следующая структура.
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;
}