Какая польза от аргумента num в этом коде? - PullRequest
0 голосов
/ 02 августа 2020

Операционная система « os161 » содержит следующий код. В частности, где определены системные вызовы:

...

#include <kern/syscall.h>
...

#define SYSCALL(sym, num) \
   .set noreorder       ; \
   .globl sym           ; \
   .type sym,@function      ; \
   .ent sym         ; \
sym:                ; \
   j __syscall                  ; \
   addiu v0, $0, SYS_##sym  ; \
   .end sym         ; \
   .set reorder

...

SYSCALL(fork, 0)
SYSCALL(vfork, 1)
SYSCALL(execv, 2)
SYSCALL(_exit, 3)
SYSCALL(waitpid, 4)
SYSCALL(getpid, 5)
...

Внизу каждый системный вызов получает номер. Кажется, я не могу понять, для чего нужны эти числа.

Я не спрашиваю об использовании номеров системных вызовов, я прошу использовать аргумент num для макроса SYSCALL. Я не могу найти, где он используется.

Даже когда номер системного вызова перемещается на v0, аргумент num не используется. Вместо этого он перемещает константу, определенную в файле kern/syscall.h:

...

#define SYS_fork         0
#define SYS_vfork        1
#define SYS_execv        2
#define SYS__exit        3
#define SYS_waitpid      4
#define SYS_getpid       5
...

Как аргумент num может быть каким-то образом полезен?

1 Ответ

1 голос
/ 02 августа 2020

Он используется для других инструментов, чтобы облегчить обслуживание исходного кода. Ниже приводится цитата из Общие сведения о системных вызовах

syscalls.S: Этот файл создается из syscalls-mips.S во время компиляции и является фактическим файлом, собранным в C библиотека. Фактические имена системных вызовов помещаются в этот файл с помощью сценария callno-parse. sh, который считывает их из файлов заголовков ядра. Это позволяет избежать создания второго списка системных вызовов. В реальной системе, как правило, каждая заглушка системного вызова помещается в свой собственный исходный файл, чтобы позволить выборочно связывать их. OS / 161 объединяет их все вместе, чтобы упростить make-файлы. Добавление новых записей в callno.h автоматически приводит к определению новых процедур системного вызова пользовательского уровня, когда вы перестраиваете код пользовательского уровня. Каждый макрос "SYSCALL (name, num)" в этом файле расширяется препроцессором C до объявления соответствующей функции системного вызова.

kern / syscall.h скорее всего производится одним из этих инструментов.

...