Передать структуру в системный вызов xv6 - PullRequest
0 голосов
/ 20 ноября 2018

Мне известно, что мы не можем напрямую передавать параметры в системный вызов xv6, и мы вынуждены использовать его встроенные методы.

Но все примеры и вопросы на этом сайте посвящены тому, как отправитьцелое число для системного вызова.На что он отвечает, используя метод argint ().

Но мой вопрос в том, можно ли передать "struct" системному вызову xv6?Есть ли какие-либо методы для этого?

Если есть, не могли бы вы привести простой пример?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Хотя приведенный выше ответ верен, но я предпочел написать свои собственные решения, чтобы сделать его более пригодным для других виверов.

Я использовал argptr для передачи указателя на структуру в мой системный вызов.

в sysproc.c:

int sys_counts (void){

    struct countTable *ct;
    argptr (0 , (void*)&ct ,sizeof(*ct));
    return counts(ct);
    }

в proc.c:

int counts (struct countTable *ct){


    for (int i=0 ; i<22 ; i++){
    (ct->system_calls)[i] = count_calls[i] ;
    } 


    return 22;
    }

и, наконец, в моей программе пространства пользователя:

int main (){

    struct countTable *ct = malloc (sizeof (struct countTable));

    // call system call
    counts(ct);


    exit();
    }
0 голосов
/ 24 ноября 2018

Возможна передача структуры через системный вызов.

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

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

Давайте посмотрим на существующую реализацию системного вызова fstat.

int fstat(int fd, struct stat *st);

fstat требует номер дескриптора файла в качестве ввода и выводит соответствующую статистическую информацию, используя struct stat.

struct stat {
  short type;  // Type of file
  int dev;     // File system's disk device
  uint ino;    // Inode number
  short nlink; // Number of links to file
  uint size;   // Size of file in bytes
};

Хотя fstat использует указатель структуры в качестве выходного параметра, его использование в качестве входных данных будет аналогичным.

Функция sys_fstat в коде ядра запускает реализацию системного вызова fstat (соглашение XV6 заключается в обработке выборки параметров из пространства пользователя с помощью функций sys_ *).

int sys_fstat(void)
{
  struct file *f;
  struct stat *st;

  if(argfd(0, 0, &f) < 0 || argptr(1, (void*)&st, sizeof(*st)) < 0)
    return -1;
  return filestat(f, st);
}

Эта функция сначала получает соответствующий структурный файл с номером дескриптора файла, полученным первым аргументом функции fstat (используя argfd). Затем извлекает указатель struct stat, полученный вторым аргументом функции fstat, используя argptr, и сохраняет указанный указатель в локальной переменной указателя (область действия функции).

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

Примечание: Хотя указатель struct stat является указателем пользовательского пространства (расположен в нижней половине виртуального пространства), ядро ​​может использовать его здесь, потому что когда ядро ​​обслуживает системный вызов процесса, он использует собственную таблицу подкачки процесса.

...