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