Как передать значение в функцию системного вызова в XV6?

Я пытаюсь создать простой планировщик на основе приоритетов в XV6. Для этого мне также нужно создать системный вызов, который позволит процессу установить свой приоритет. Я сделал все необходимое для создания системного вызова, как описано здесь и в других местах:

как добавить системный вызов / утилиту в xv6 < / а>

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

Объявление Extern (syscall.c):

...
extern int sys_setpty(void);

static int (*syscalls[])(void) = {
...
[SYS_setpty]  sys_setpty,
};

Вектор системных вызовов (syscall.h):

#define SYS_setpty 22

Реализация (sysproc.c):

void
sys_setpty(int pid, int pty)
{
  cprintf("function pid: %d \n", pid);
  cprintf("function pty: %d \n", pty);
}

(defs.h и user.h):

void setpty(int, int);

Макрос (usys.S):

SYSCALL(setpty)

Вызов функции:

setpty(3, 50);

Выход:

function pid: 16843009
function pty: 16843009

Значения всегда совпадают с точным числом: 16843009. Я проверил, правильно ли работает cprintf, присвоив значения pid и pty. Я потратил около 6 часов, пытаясь каждую возможную комбинацию всего, что я могу придумать, и начинаю думать, что в XV6 нет встроенного механизма для передачи значений через системный вызов. Я что-то упускаю? Заранее спасибо.


person bertmoog    schedule 21.11.2014    source источник


Ответы (1)


Передача аргументов из функций уровня пользователя в функции уровня ядра невозможна в XV6. XV6 имеет свои собственные встроенные функции для передачи аргументов в функцию ядра. Например, чтобы передать целое число, вызывается функция argint (). В реализации, которую я использовал для функции установки приоритета, это выглядело бы примерно так:

argint(0, &pid);

... чтобы получить первый аргумент, который является идентификатором процесса, и:

argint(1, &pty);

... чтобы получить второй аргумент, который является желаемым приоритетом. Вызов функции из пользовательского процесса выглядит так:

setpty(getpid(), priority);
person bertmoog    schedule 25.11.2014
comment
Благодаря вашему собственному ответу +1 я узнал, как передавать параметры из пользовательского пространства в пространство ядра. Однако я не мог составить расписание на основе приоритета. :( - person WannaBeCoder; 17.03.2015