Ответ 1
Прочтите это: http://zoo.cs.yale.edu/classes/cs422/2010/xv6-book/trap.pdf
Это объясняет это довольно хорошо.
Может ли кто-нибудь сказать мне/указать мне какие-либо ссылки на то, как добавить системный вызов/утилиту в XV6
исчерпывающий поиск в google был бесполезным, и взломать жесткий способ также пока не был продуктивным.
в справочнике также не было какого-либо приветственного примера для начала любая помощь очень ценится
Прочтите это: http://zoo.cs.yale.edu/classes/cs422/2010/xv6-book/trap.pdf
Это объясняет это довольно хорошо.
Чтобы добавить системный вызов, который можно вызвать в оболочке xv6, вы должны так что-то с пятью файлами
usys.S использовать макрос для определения соединения вызова пользователя с функцией системного вызова
defs.h добавить новое объявление для нового системного вызова
Я объясню простой пример добавления системного вызова в 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, который вызывает ваш системный вызов, размер адресного пространства этой же программы будет возвращен в соответствии с тем, что мы здесь реализовали.