2015-02-11 3 views
1

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

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

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, спасибо!

Обновлено

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

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

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

Если такая структура выделена внутри 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; 
} 
+0

так, если я объявляю следующее 'структура PROCINFO * procInfo; ', как бы я выделил память для этого, прежде чем я сделаю системный вызов? Сейчас я делаю системный вызов, но я не выделяю никакой памяти для структуры. – Ammar

+1

'malloc (sizeof (struct procInfo))'. Или вы можете просто выделить его в стеке (определите его без '*'), как это обычно используется для 'fstat'. – StenSoft

+0

Вы так говорите? 'struct procInfo * procInfo = malloc (sizeof (struct procInfo));' Я не думаю, что это сработало! – Ammar

Смежные вопросы