Как добавить новый системный вызов в OS/161?

Я пытаюсь добавить новый системный вызов в мой код OS/161, но у меня возникают проблемы с поиском, где добавить прототипы. Я полагаю, что вы должны добавить его в пространство ядра и пространство пользователя, но я не уверен точно, в какие файлы поместить прототип. Где-нибудь есть руководство, объясняющее, как добавить образец системного вызова в OS/161??

В качестве теста я пытаюсь добавить функцию, printone(), что когда пользователь запускает эту программу, он просто напечатает "1".

1 ответ

Добавьте другой номер системного вызова, например, SYS_print1 в callno.h или где эти константы, как SYS_fork а также SYS_read определены.

Найти место, где они используются для выбора функций для вызова, похоже, что это должно быть mips_syscall(), Хотя я не уверен, почему в этой версии исходного кода есть только SYS_reboot звонил sys_reboot(), Эта ссылка на исходный код, вероятно, неполная. Комментарий предполагает, что:

00049 mips_syscall(struct trapframe *tf)
00050 {
...
00070         switch (callno) {
00071             case SYS_reboot:
00072                 err = sys_reboot(tf->tf_a0);
00073                 break;
00074 
00075             /* Add stuff here */
00076  
00077             default:
00078                 kprintf("Unknown syscall %d\n", callno);
00079                 err = ENOSYS;
00080                 break;
00081         }
...
00108 }

Аналогичным образом добавьте свой case SYS_print1: и реализовать функциональность в выделенной функции, скажем, sys_print1(),

Это должно быть для ядра.

Прототип пользовательского режима для print1() может быть объявлено в unistd.h наряду с read() и тому подобное.

Похоже, реализация пользовательского режима read() может быть в файле сборки. И это разумно, так как в конце концов он должен выполнить MIPS syscall Инструкция недоступна непосредственно в C. Вы должны реализовать print1() аналогичным образом (загрузить SYS_print1 в соответствующий реестр и выполнить syscall).

Другие вопросы по тегам