Как добавить новый системный вызов в 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
).