Wykład 5 Przerwania i wywołania systemowe. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB



Podobne dokumenty
Sygnały. 7. Sygnały (2005/2006)

Obsługa sygnałów. Tomasz Borzyszkowski

Wykład 6 Planista procesora funkcja schedule. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Prezentacja systemu RTLinux

Wykład 2 Proces, stany procesu i przejścia pomiędzy nimi. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Metody obsługi zdarzeń

Przerwania, polling, timery - wykład 9

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Embedded Systems Programming

Systemy operacyjne II

Systemy Operacyjne 1 Laboratorium 2 Procesy i sygnały w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot

Wykład 7 Podręczna pamięć buforowa (ang. buffer cache) w systemie Linuks. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Wykład 2. Struktury systemów komputerowych. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Wykład 13. Linux 2.0.x na maszynach SMP. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2

Wykład 12. Zarządzanie pamięcią (część III) oraz urządzenia sieciowe. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Mikroprocesor Operacje wejścia / wyjścia

Działanie systemu operacyjnego

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Sygnały DRQ i DACK jednego kanału zostały użyte do połączenia kaskadowego obydwu sterowników.

Działanie systemu operacyjnego

Budowa systemów komputerowych

4. Procesy pojęcia podstawowe

Wskaźniki. Informatyka

Programowanie Współbieżne. W Linuxie/Unixie

Futex (Fast Userspace Mutex) Łukasz Białek

Działanie systemu operacyjnego

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Urządzenia wejścia-wyjścia

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Kompilator języka C na procesor 8051 RC51 implementacja

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Jedrzej Ułasiewicz Komputerowe systemy sterowania 1

PMiK Programowanie Mikrokontrolera 8051

Sygnały i ich obsługa

procesy odrębne dzielone

Podstawy programowania komputerów

IPC: Kolejki komunikatów

Zarządzanie procesami i wątkami

1.1 Definicja procesu

Programowanie współbieżne Wykład 2. Iwona Kochańska

Struktury. Przykład W8_1

PRZERWANIA. P1 - Procedura obslugi przerwania. Obsługa zdarzenia Z1 poprzez procedurę obsługi przerwania P1

4. Procesy pojęcia podstawowe

Działanie systemu operacyjnego

System operacyjny MACH

Organizacja typowego mikroprocesora

Procesy, wątki i zasoby

Wstęp do programowania 2

Wykład 3: Implementacja programów wbudowanych

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Mechanizmy z grupy IPC

4. Procesy pojęcia podstawowe

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

Lab 9 Podstawy Programowania

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

Sygnał mechanizm asynchronicznego powiadamiania procesów o zdarzeniach zwykle awaryjnych.

Wątki jądra. Maciej Szwaja

Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Konstrukcje i Technologie w Aparaturze Elektronicznej.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Część I - Sterownik przerwań 8259A i zegar/licznik 8253

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zarządzanie procesorem

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Podstawy Informatyki Układ przerwań

Wykład 10 Zarządzanie pamięcią

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

projektowanie systemu

Układ sterowania, magistrale i organizacja pamięci. Dariusz Chaberski

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Zwielokrotnianie wejścia wyjścia

Systemy operacyjne III

Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:

ZASADY PROGRAMOWANIA KOMPUTERÓW

Wskaźniki. Programowanie Proceduralne 1

Architektura komputera. Cezary Bolek. Uniwersytet Łódzki. Wydział Zarządzania. Katedra Informatyki. System komputerowy

Architektura komputerów. Układy wejścia-wyjścia komputera

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

dr inż. Jarosław Forenc

E S - uniwersum struktury stosu

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

PARADYGMATY PROGRAMOWANIA Wykład 4

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Transkrypt:

Wykład 5 Przerwania i wywołania systemowe Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Porty wejścia-wyjścia Intel x86 posiada 65536 portów wejścia-wyjścia, do których dostęp możliwy jest za pomocą specjalnych rozkazów rodziny in* oraz out* (Przestrzeń adresowa we-wy rozłączna z przestrzenią adresową pamięci). Sterownik powinien skorzystać z funkcji void request_region(unsigned int from, unsigned int num, const char *name) void release_region(unsigned int from, unsigned int num) Aby odpowiednio zarezerwować i zwolnić zakres adresów wejścia wyjścia. Dostępna jest również funkcja check_region sprawdzająca, czy zakres adresów wejścia wyjścia jest wolny. Odczyt danych z portów przy pomocy makra inpb(port) (inpw oraz inpl dla danych 16- i 32-bitowych). Zapis za pomocą makra outb(wartość,port) (outw oraz outl dla danych 16- i 32-bitowych). Makra mają wersje kończące sie na _p (np inpb_p), które czekają kilka mikrosekund po wykonaniu odczytu bądź też zapisu (niektóre urządzenia mogą mieć problemy, jeżeli dane do portów zapisywane są zbyt szybko). Wojciech Kwedlo, Systemy Operacyjne II -2- Wydział Informatyki PB

kanały DMA (na szynie ISA) Kanały ISA DMA rezerwujemy/zwalniamy przy pomocy funkcji int request_dma(unsigned int dmanr, const char * device_id) void free_dma(unsigned int dmanr) Rezerwacja jest głównie przeprowadzana dla celów grzecznościowych. Umożliwia wykrycie sytuacji, w której kilka urządzeń Do dyspozycji mamy następujące API: void enable_dma(unsigned int dmanr) // Włącz kanał, transmisja rozpoczęta void disable_dma(unsigned int dmanr) // Wyłącz kanał // Ustaw tryb transmisji np. zapis albo odczyt void set_dma_mode(unsigned int dmanr, char mode) void set_dma_addr(unsigned int dmanr, unsigned int addr) // Adres początkowy void set_dma_count(unsigned int dmanr, unsigned int count) // Liczbę bajtów // Ile bajtów pozostało do przesłania potencjalnie niebezpieczne int get_dma_residue(unsigned int dmanr) wraz z wszelkimi ograniczneniami szyny ISA i kontrolera 8237 (adres 24-bitowy, długość bloku <=128KB, blok nie może przekraczać granicy 128KB). Najlepiej alokować bufor przy pomocy kmalloc(gfp_dma,) Wojciech Kwedlo, Systemy Operacyjne II -3- Wydział Informatyki PB

Sygnały (przerwania na poziomie użytkownika) Sygnały pozwalają procesowi na reakcję na asynchroniczne zdarznia. Zdarzenia mogą powstać w wyniku akcji procesu, innych procesów lub jądra. Każdy sygnał jest reprezentowany przez stałą w formie SIGXXX. Najczęstsze przyczyny zgłaszania sygnałów to: Akcje (często niepoprawne) procesu (SIGFPE, SIGSEGV, SIGILL,... ) Wciśnięcie klawiszy specjalnych (SIGINT ctrl-c, SIGSTP ctrl-z) Jawne wysłanie sygnału przez inny proces (SIGKILL, dowolny inny sygnał). Reakcją na sygnał może być: (a) Wywołanie handlera zdefiniowanego przez użytkownika, (b) Zabicie procesu (zawsze w przypadku SIGKILL) (c) Zabicie procesu i zapisanie pliku core, (d) Wstrzymanie procesu (zawsze w przypadku SIGSTOP) (e) wznowienie wsztrzymanego procesu (SIGCONT), (f) zignorowanie sygnału Z wyjątkiem SIGKILL, SIGSTOP i SIGCONT proces może kontrolować reakację na sygnały. Sygnał z handlerem ma charakter asynchronicznego przerwania (nie wiemy, kiedy może nadejść) ze wszelkimi tego konsekwencjami dla synchronizacji. Np. w czasie wykonania funkcji malloc otrzymalismy sygnal SIGALARM (timer). Jeżeli teraz jego handler wykona również malloc, to... Podobnie printf, etc... Wojciech Kwedlo, Systemy Operacyjne II -4- Wydział Informatyki PB

API sygnałów (standard POSIX) struct sigaction { void (*sa_handler)(); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); // nie używane Structura sigaction opisuje reakcję na sygnały: sa_handler może być równy: SIG_DFL (akcja domyślna) SIG_IGN (ignoruj sygnał) albo może wskazywać na adres handlera. sa_flags jest bitową ( ) sumą następujących flag SA_NOCLDSTOP (nie generuj sygnał SIHCHLD, gdy proces potomny zostanie przerwany), SA_ONESHOT (po obsłudze jednego sygnału przełącz się na obsługę domyślną, jest to domyślne zachowanie) SA_RESTART (nie odtwarzaj akcji domyślnej po otrzymaniu sygnału), SA_NOMASK (handler sygnału może być przerwany przez siebie samego nie zalecam). sa_mask maska (zbiór) sygnałów zablokowanych podczas obsługi tego sygnału przez handler. (Istnieje odrębne API do operacji na zbiorach sygnałów: sigemptyset, sigadset, sigfillset, etc..) int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); Zmiana lub/i odczyt (aktualnej reakcji na sygnał signum, w zależności od który ze wskaźników act oraz oldact jest różny od NULL Wojciech Kwedlo, Systemy Operacyjne II -5- Wydział Informatyki PB

API sygnałów - c.d. Uśpij proces, do momentu pojawienia się sygnału. int pause(void); Ustaw maskę sygnałów zablokowanych (how SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK) int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); Sprawdź, czy nie są zgłoszone sygnały, których obsługa jest zablokowana. int sigpending(sigset_t *set) Ustaw sygnał SIGALARM (patrz też setitimer) long alarm(long seconds); Wyślij sygnał sig procesowi pid int kill(pid_t pid, int sig) Wojciech Kwedlo, Systemy Operacyjne II -6- Wydział Informatyki PB

Przerwania sprzętowe Dzielą się na przerwania szybkie oraz wolne. Handler obsługi przerwania wolnego wykonuje się z odblokowanymi przerwaniami. Może być więc przerwany przez inne przerwania. Po obsłudze handlera mogą być wywołane inne funkcje (planista, dolne połowy, kolejki zadań). Bardzo ważnym przykładem jest przerwanie zegarowe. Handler przerwania wolnego wywołuje się z zablokowanymi przerwaniami. Dodatkowe czynności nie są wykonywane. Rezerwacja przerwania następuje przy pomocy funkcji: int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) irq numer przerwania. Handler - adres procedury obsługi przerwania irq flags szybkie z flagą SA_INTERRUPT, wolne bez tej flagi. Wojciech Kwedlo, Systemy Operacyjne II -7- Wydział Informatyki PB

Handler obsługi przerwania void handler(int irq, void * dev_id, struct pt_regs *) Znaczenie parametrów: irq numer przerwania (ten sam handler może obsługiwać kilka przerwań) dev_id jest równy parametrowi dev_id przekazanemu funkcji request_irq. Może zostać wykorzystany do przekazania handlerowi dodatkowych danych. pt_regs przechowuje adres struktury w której zawarte są wartości rejestrów procesora dla przerwanego procesu. Handler obsługi przerwania może sprawdzić, czy przerwany proces wykonywał się w trybie jądra, czy też w trybie użytkownika. Zwolnienie przerwania przy pomocy funkcji free_irq. Możliwość współdzielenia przerwań na magistrali PCI (flaga SA_SHIRQ) Wojciech Kwedlo, Systemy Operacyjne II -8- Wydział Informatyki PB

Obsługa przerwania wolnego - pseudokod irq(irq_num,irq_controller) { SAVE_ALL // zapisz na stosie wszystkie rejestry procesora. ++intr_count; // zwiększ liczbę zagnieżdżonych przerwań sti(); // odblokuj przerwania do_irq(irq_num); // wywołaj handler. cli(); // zablokuj przerwania ACK(irq_controller) // potwierdź kontrolerowi przerwań fakt // obsłużenia tego przerwania. --intr_count; goto ret_from_sys_call // O tym bedzie za chwile Natychmiast po zgłoszeniu przerwania przerwania są automatycznie blokowane. Zakładamy, że do momentu potwierdzenia przerwania kontroler nie zgłosi drugiego przerwania tego samego typu. ret_from_sys_call ewentualne wywołanie planisty, obsługa dolnych połów, sygnałów i kolejek zadań. Wojciech Kwedlo, Systemy Operacyjne II -9- Wydział Informatyki PB

Obsługa przerwania szybkiego - pseudokod irq(irq_num,irq_controller) { SAVE_MOST // zapisz na stosie większość rejestry procesora. ++intr_count; // zwiększ liczbę zagnieżdżonych przerwań do_irq(irq_num); // wywołaj handler. ACK(irq_controller) // potwierdź kontrolerowi przerwań fakt // obsłużenia tego przerwania. --intr_count; RESTORE_MOST // odtwórz rejestry procesora Aby maksymalnie przyspieszyć wykonanie handlera nie są zachowane wszystkie rejestry. Zauważmy brak skoku do ret_from_sys_cal Wojciech Kwedlo, Systemy Operacyjne II -10- Wydział Informatyki PB

Podprogram ret_from_sys_call Wywoływany każdorazowo przy powrocie z przerwania wolnego bądź wywołania systemowego. Jego zadania: obsługa sygnałów, uruchomienie dolnych połów, uruchomienie planisty. ret_from_sys_call: if (intr_count) goto extit_now; //przerwanie wewnątrz przerwania if (bh_mask & bh_active) { ++intr_count; sti(); do_bottom_half(); // dolna połowa nie może być przerwana --intr_count; // drugą dolną połową. // przerwany proces działał w trybie jądra if (kernel_mode()) goto exit_now; if (need_resched) { // need_resched!=0 wywołuje planistę schedule(); // przełącz kontekst goto ret_from_sys_call; if (current->signal & ~current->blocked) { do_signal(); exit_now: RESTORE_ALL; // odtwórz wartości rejestrów Wojciech Kwedlo, Systemy Operacyjne II -11- Wydział Informatyki PB

Dolne połowy (ang. bottom halves) Często niektóre mniej ważne czynności nie muszą być wykonane od razu w procedurze przerwania. Np. przeliczenie priorytetów przy obsłudze przerwania zegarowego. Sytuacje w której mamy do czynienia z szybką transmisją danych. W procedurze obsługi przerwania możemy zażądać wykonania dolnej połowy. Jest ona wykonana przy: Powrocie z wolnego przerwania. Powrocie z funkcji systemowej. Reguły synchronizacji są następujące: Kod jądra może być przerwany przez dolną połowę. Dolna połowa nie może być przerwana przez inną dolną połowę. Dolna połowa może być przerwana przez (dowolne) przerwanie. Oczywiście można uzywać cli() oraz sti() aby zakazać wykonania przerwań i dolnych połów. Wojciech Kwedlo, Systemy Operacyjne II -12- Wydział Informatyki PB

Wykorzystanie dolnych połów W systemie istnieją 32 dolne połowy o stałych numerach i procedurach. enable_bh(int nr) oraz disable_bh(int nr) włączają i wyłączają dolną połowę. mark_bh(int nr) zleca wykorzystanie dolnej połowy. Dopuszczalne numery zdefiniowane są w pliku /include/linux/interrupt.h TIMER_BH, KEYBOARD_BH, NET_BH, IMMEDIATE_BH, CONSOLE_BH Dolne połowy mają poważne ograniczenia. Głównym jest ich statyczny charakter. Określone adresy procedur. Ograniczona liczba (32) W swoich programach możemy wykorzystać IMMEDIATE_BH. Wykorzystywana jest ona przy obsłudze kolejek zadań. Wojciech Kwedlo, Systemy Operacyjne II -13- Wydział Informatyki PB

Kolejki zadań task queues Są dynamicznym rozszerzeniem pojęcia dolnych połów. Z dowolnego miejsca w jądrze możemy zlecić wykonanie pewnego kodu w kolejce zadań. Kolejka jest listą funkcji, które mogą być wykonane w późniejszym czasie. struct tq_stuct { struct tq_struct *next; int sync; // Adres funkcji, którą chcemy wywołać void (*routine)(void *); // Dane tej funkcji void *data; // Kolejka zadeklarowana jako wskaźnik na pierwszy element typedef struct tq_struct *task_queue; // Zlecenie funkcji do wykonania w kolejce void queue_task(struct tq_struct *task; task_queue *queue); // makro DECLARE_TASK_QUEUE(x) deklaruje nową kolejkę // uruchomienie (i usunięcie) wszystkich funkcji z kolejki void run_task_queue(task_queue *list); Wojciech Kwedlo, Systemy Operacyjne II -14- Wydział Informatyki PB

Kolejki zadań task queues Wykorzystanie kolejek zadań: Zadeklarować i zainicjalizować zmienną typu task_struct; pole routine ustawić na adres funkcji, pola data na adres danych które chcemy przekazać. Zlecić zadanie do kolejki (gwarantuje jednorazowe (ang. single shot) wywołanie funkcji, w celu ponownego wykonania należy ponowić zlecenie) W Linuxie 2.0 mamy zdefiniowane cztery kolejki. tq_scheduler jest wywoływana z funkcji schedule tq_disk wykorzystywana przez podsystem buforowej pamięci podręcznej tq_timer jest wywoływana przy każdym przerwaniu zegarowym tq_immediate jest wywoływana z dolnej połowy BH_IMMEDIATE. Modyfikując jądro na ogół wykorzystujemy kolejki tq_timer i tq_immediate. Aby uruchomić kolejkę tq_immediate należy wykonać funkcję mark_bh(bh_immediate). Uruchomienie nastąpi z programu ret_from_sys_call Wojciech Kwedlo, Systemy Operacyjne II -15- Wydział Informatyki PB

Przykład - Przerwanie zegara void do_timer(struct pt_regs *regs) { ++jiffies; ++lost_ticks; if (!user_mode(regs)) ++lost_ticks_system; mark_bh(timer_bh); if (tq_timer) mark_bh(tqueue_bh); // uruchomienie kolejki tq_timer; Zmienna jiffies przechowuje liczbę przerwań zegara od momentu włączenia systemu. Można ją wykorzystać przy aktywnym czekaniu. Stała HZ (100, na procesorach Alpha 1000) przechowuję częstotliwość przerwań zegara. Rzeczywisty kod wykonywany jest w dolnej połowie: Zmniejsz pole counter w strukturze task_struct o wartość lost_ticks; Ustaw lost_ticks na zero Jeżeli counter przekroczyło zero ustaw zmienną need_resched na zero. Filozofia Linuksa: obsługując przerwania wykonuj tylko to co naprawdę niezbędne. Wywłaszczenie przy najbliższej okazji Pomaga przy dużym obciążeniu systemu Wojciech Kwedlo, Systemy Operacyjne II -16- Wydział Informatyki PB

Dygresja oczekiwanie w jądrze Jednym ze sposobów realizacji aktywnego czekania w jądrze (np. w sterowniku urządzenia) jest wstawienie kodu: if (need_resched) schedule(); Wadą tego podejścia jest bezczynne oczekiwanie w pętli i marnowanie kwantu procesora. Alternatywne podejście polega na uśpieniu na co najmniej K milisekund: current->state=task_interruptible; current->timeout=jiffies+k*hz/1000; schedule(); Czas odliczany jest z dokładnością przerwań zegarowych (10ms na x86) Proces zostanie obudzony po zaprogramowanym czasie. Ale procesor może otrzymać o wiele później!!! O tym decyduje planista. Wojciech Kwedlo, Systemy Operacyjne II -17- Wydział Informatyki PB

Wywołania systemowe Wywołania systemowe obsługiwane są przez przerwanie programowe 0x80. Numer wywołania służy jako indeks do tablicy sys_call_table przechowującej adresy funkcji obsługujących poszczególne wywołania. int system_call(int num,args) { SAVE_ALL if (num>=nr_sys_calls) errno=-enosys else if (current->flags && PF_TRACESYS) { syscall_trace(); errno=(*sys_call_table[num])(args); syscall_trace(); else errno=(*sys_call_table[num])(args); goto ret_from_sys_call; Wojciech Kwedlo, Systemy Operacyjne II -18- Wydział Informatyki PB

Przykłady prostych wywołań getpid() zwraca identyfikator danego procesu. asmlinkage int sys_getpid() { return current->pid; pause() wstrzymuje proces do momentu zgłoszenia sygnału. asmlinkage int sys_pause() { current->state=task_interruptible; schedule(); return -ERESTARTNOHAND; // Dopiero po sygnale Wojciech Kwedlo, Systemy Operacyjne II -19- Wydział Informatyki PB

Interfejs funkcji systemowych po stronie programów użytkownika Plik./include/linux/asm/unistd.h // open ma numer wywołania trzy #define NR_getpid 5 _syscall0(int,getpid) Makro _sycall0 to czarna magia!!! #define _syscall0(type,name) \ type name(void) \ { \ long res; \ asm volatile ("int $0x80" \ : "=a" ( res) \ : "0" ( NR_##name)); \ if ( res >= 0) \ return (type) res; \ errno = - res; \ return -1; \ Wojciech Kwedlo, Systemy Operacyjne II -20- Wydział Informatyki PB

Implementacja nowego wywołania systemowego Dodać adres funkcji realizującej wywołanie do tablicy (na koniec) w /arch/i386/entry.s i zwiększyć o jeden liczbę w dyrektywie.space.space (NR_syscalls-189)*4 // zmieniamy 189 na 190 Wywołanie systemowe może mieć maksymalnie 3 parametry, jeżeli ma więcej, niech przekazuje adres struktury z parametrami (ale pamiętajmy o verify_area!!!). Po stronie programów użytkownika musimy wygenerować funkcję biblioteczną wywołującą przerwanie 0x80. Dla funkcji int foo(int a,int b,char *c) z trzema argumentami robimy to w sposób następujący: #define NR_foo 190 _syscall3(int,foo,int,a,int,b,char *,c) Ale należy pamiętać, że Linuks zaprojektowano w.g. filozofii Jak najmniej wywołań systemowych. (Trudno usunąć lub zmienić raz dodane nowe wywołanie systemowe). Przy rozszerzaniu systemu należy korzystać ze sterowników urządzeń, pseudo-systemu plików proc itp. Wojciech Kwedlo, Systemy Operacyjne II -21- Wydział Informatyki PB