osdev.labedz.org

Procedury wywołań systemowych poziomu jądra systemu

Użycie wywołania systemowego powoduje przekazanie kontroli według informacji zawartej w deskryptorze bramki zadania umieszczonym w IDT. W przypadku implementowanego systemu, wywołanie przerwania programowego 0x22 powoduje zmianę poziomu uprzywilejowania procesora na najwyższy, a następnie uruchomienie procedury gate_wrapper. Procedura ta ma za zadanie uruchomienie procedury rozdzielającej wywołania systemowe sys_calls przekazując jej jako parametry wskaźnik na kontekst aktualnego procesu (podobnie jak podczas wywłaszczania procesów - jedynie fragment struktury jest dostępny), oraz numer wywołania systemowego. Procedura sys_calls uruchomia żądaną przez aplikację procedure wywołania systemowego.

Ponieważ wszystkie argumenty wywołania systemowego znajdują się na stosie aplikacji, istnieje potrzeba chwilowego przełączenia stosu. Aby uniknąć niebezpieczeństwa wywołania w tym momencie przerwania, należy tymczasowo wyzerować flagę IF procesora.

Przykład wywołania systemowego poziomu jądra systemu z pozostawieniem wartości zwracanej na stosie:

void _sys_getpid(dword *process_ESP) { /* push answer on user stack */ __asm__("mov %esp, %ebp"); __asm__("cli"); __asm__("mov (%0), %%esp" : : "r" (process_ESP)); __asm__("push %0" : : "r" (process_table[current_task - 1].pid)); __asm__("mov %0, %%ebx" : : "m" (process_ESP)); __asm__("mov %esp, (%ebx)"); __asm__("mov %ebp, %esp"); __asm__("sti"); }

Po wykonaniu odpowiedniej procedury, wywołanie systemowe kończy pracę, wracając do aplikacji w sposób podobny do powrotu z przerwania.