Do spisu treści rozdziału 3

Zadanie 17:

Cztery proste zadanka.


1. Rozgrzewka

Zmodyfikować jądro tak, aby proces mógł ignorować sygnały SIGKILL i SIGSTOP, co standardowo jest zabronione.
Napisać program którego, który nie daje się ani zatrzymać, ani zabić.


2. Rzemiosło

Jeśli plik wykonywalny w systemie Linux ma tak zwany atrybut s, to proces, który go wykona uzyskuje uprawnienia administratora. Procesowi zmienia się efektywny identyfikator użytkownika (euid).
Zmodyfikować jądro tak, że jeśli użytkownik uruchomi dowolny program z pierwszym parametrem równym !@#@!, to jądro będzie wycinać ten parametr z listy parametrów, tak że drugi parametr stanie się pierwszym, trzeci drugim itd.
Następnie podany pogram, ma się wykonać z tak zmodyfikowaną listą parametrów, ale jeszcze dodatkowo ma posiadać uprawnienia administratora.

Sprawdzić czy zrobiona modyfikacja działa:
Zalogować się jako użytkownik z małymi uprawnieniami, a następnie uruchomić:
bash !@#@!
i sprawdzić, czy rzeczywiście w nowej powłoce uzyska się uprawnienia administratora.


3. Algorytm

a) Przy wykonywaniu fork(), jądro przeszukuje sekwencyjnie numery procesów (pid), w celu znalezienia pierwszego wolnego.

Zaimplementować, w podany poniżej sposób, inną metodę przydzielenia numeru nowemu procesowi.
Przygotować dwie funkcje mieszające(f1 i f2), zależne na przykład od czasu systemowego,
które statystycznie przydzielają każdy pid z tym samym prawdopodobieństwem.

Następnie zastosować następujący algorytm:
pid = f1()
jeśli ten pid jest już zajęty to pid = f2()
   jeśli ten również jest już zajęty to przeszukuj sekwencyjnie od tego numeru pid, który zwróciła funkcja f2, aż
      znajdziesz pierwszy wolny numer dla nowego procesu.

Za pomocą instrukcji ps porównać jakie numery były przydzielone procesom przed i po modyfikacji jądra.

b) Zastosować analogiczny algorytm przy znajdowaniu wolnego miejsca w tabeli procesów, w miejsce istniejącego tam algorytmu sekwencyjnego.


4. Dogrywka

Dodać do jądra nową domenę wykonywania, która rózni się od standardowej domeny Linux tylko numerami sygnałów - np. SIGSTOP ma w niej ten numer, co SIGSEGV standardowo.
Ponadto zmodyfkować jądro tak, że jeśli program wykonywalny ma nazwę odpowiadającą wzorcowi: dziwne.*, to uruchamia się on w naszej domenie.
Napisać program dziwne.test.c, wykorzystujący tak "odwrócone" sygnały i zademonstrować, że jądro faktycznie korzysta z nowej domeny i "odwraca" sygnały z powrotem, na zrozumiałe dla Linuxa.


Autor: Sławek Poreda