Подтвердить что ты не робот

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

Может ли кто-нибудь сказать мне/указать мне какие-либо ссылки на то, как добавить системный вызов/утилиту в XV6

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

в справочнике также не было какого-либо приветственного примера для начала любая помощь очень ценится

4b9b3361

Ответ 2

Чтобы добавить системный вызов, который можно вызвать в оболочке xv6, вы должны так что-то с пятью файлами

  • sysproc.c добавьте реальную реализацию вашего метода здесь.
  • syscall.h определить положение вектора системного вызова, подключающегося к вашей реализации
  • user.h определить функцию, которая может быть вызвана через оболочку
  • syscall.c внешние определяют функцию, соединяющую оболочку и ядро, используйте позицию, определенную в syscall.h, чтобы добавить функцию в вектор системного вызова
  • usys.S использовать макрос для определения соединения вызова пользователя с функцией системного вызова

  • defs.h добавить новое объявление для нового системного вызова

  • sysfunc.h добавьте новый обработчик системных вызовов в этот файл, также как "int sys_newsystemcall (void)"

Ответ 3

Я объясню простой пример добавления системного вызова в xv6.

Предположим, что вам нужно добавить системный вызов, чтобы получить размер адресного пространства текущей запущенной программы пользователя. Вы можете назвать свой системный вызов как getmysize() и вызвать этот системный вызов из пользовательской программы.

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

#include "types.h"
#include "stat.h"
#include "user.h"

int main(void){
  printf(1,"The size of my address space is %d bytes\n", getmysize());
  exit();
}

Эта программа написана с целью демонстрации работы только системного вызова.

Теперь мы добавим наш системный вызов в xv6.

Сначала добавьте следующую строку в конец файла syscall.h.

#define SYS_getmysize 23

Обратите внимание, что здесь 23 может меняться в зависимости от числа, указанного перед строкой, которую вы собираетесь добавить в файл. То есть, если номер системного вызова равен 22 в строке перед строкой, которую вы собираетесь добавить, ваша строка должна иметь номер 23. Простой.

Теперь добавьте следующие строки в файл syscall.c.

extern int sys_getmysize(void);

и в массиве системных вызовов добавьте следующую строку.

[SYS_getmysize] sys_getmysize,

В файле sysproc.c, где выполняется реализация вашего системного вызова, если это системный вызов, связанный с обработкой процессов или управлением памятью, поставьте реализацию нашего системного вызова следующим образом.

int 
sys_getmysize(void)
{
   return proc->sz;
}

Теперь в файле usys.S добавьте строку,

SYSCALL(getmysize)

Затем в файле user.h добавьте следующее. Вот как ваша программа пользователя видит ваш системный вызов.

int getmysize(void);

Ok. Теперь вы готовы запустить свою пользовательскую программу и посмотреть, как работает ваш системный вызов.

При запуске myprog.c, который вызывает ваш системный вызов, размер адресного пространства этой же программы будет возвращен в соответствии с тем, что мы здесь реализовали.