как добавить системный вызов / утилиту в xv6 - PullRequest
15 голосов
/ 05 ноября 2011

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

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

В справочнике также не было ни одного примера с Hello World. любая помощь с благодарностью

Ответы [ 3 ]

48 голосов
/ 03 ноября 2012

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

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

  • defs.h добавить предварительную декларацию для вашего нового системного вызова

  • sysfunc.h добавить новый обработчик системных вызовов в этот файл, например, "int sys_newsystemcall (void)" *
13 голосов
/ 28 мая 2016

Я объясню простой пример добавления системного вызова в 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 file.

extern int sys_getmysize(void);

и в массив syscalls, добавьте следующую строку в.

[SYS_getmysize] sys_getmysize,

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

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

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

SYSCALL(getmysize)

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

int getmysize(void);

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

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

5 голосов
/ 23 февраля 2012

Читать это: http://zoo.cs.yale.edu/classes/cs422/2010/xv6-book/trap.pdf
Это очень хорошо объясняет

...