4 godziny stracone na przeszukiwaniu jądra systemu za bardzo poważnym bugiem.
Zapowiadało się prosto, ot nowa aplikacja dodana do systemu sprawiła, że stare ls i ps przestały działać, a Bochs wywalał się zanim złapałem wyjątek procesora...
Wyłączenie nowej aplikacji z systemu naprawiało problem, więc wniosek czyżby cały system się nie załadował i ucieło kawałek na końcu?
Przeczesanie bootloadera nie przyniosło jakichkolwiek rezultatów, wszystko było na tip - top.
No to analizujemy w którym miejscu wywalał się np. process ls... drugie wywołanie przerwania (jakiegokolwiek) WTF?
Przeglądam logi Bochsa, a tam: wektor przerwania nie istnieje albo nieprawidłowy segment kodu... zaczyna się pięknie.
Uruchamiam jeszcze raz proces ls i zatrzymuje przez wywołaniem drugiego przerwania, sprawdzam tablicę przerwań: jest na miejscu. Sprawdzam tablicę GDT... fuck, gdzie się podziały rekordy CS i DS dla jądra? Ktoś je nadpisał śmiećmi...
Raz jeszcze uruchamiam proces, tym razem przed wywołaniem pierwszego przerwania... GDT prawidłowe. Czyli, gdzieś w tej procedurze obsługi przerwania (przesyłanie argumentów do procesu)... jedziemy z tym... Przy wertowaniu tony linii kodu stronicującej przestrzeń dla przesyłanych argumentów, nagle otrzymuę na moje żądanie adres nowej strony/ramki... której adres dziwnie znajomy.. FUCKx2 to adres tablicy binarnej mapy pamięci... jakim cudem proces dostał ten adres? Sprawdzam binarną mapę pamięci w pamięci, a tam... kolejne śmieci... (idę po tabletki uspokajające).
No dobra, teraz uruchamiam system raz jeszcze, tylko zastawiam pułapkę na próbę nadpisania cokolwiek to tablicy binarnej mapy pamięci... ciach, prach... złapała się na nią procedura inicjalizacji nowego procesu, wywołana przez process shell (no w porządku, powłoka uruchamia ls)... ale dlaczego wkłada tam ARGUMENTY do cholery....?
Znowu analiza... tym razem od początku inicjalizacji procesu ls. Binarna mapa pamięci jeszcze jest prawidłowa, ale coś mało w niej opisanych stron: 0xFE (czyli 8 wolnych stron), że jak?? Czyżby kończyła się pamięć RAM? Sprawdzam co dzieje się dalej... i wszystko jasne... pamięć się skończyła i nie wykonałem testu czy otrzymałem prawidłowy adres wolnej strony (Flaga CF) - zarazem jako wynik wypluło adres binarnej mapy pamięci.
Suma sumarum... system Cyjon... przekroczył magiczną barierę 1 MiB wykorzystania pamięci RAM...
Teraz muszę poświęcić się systemowi obsługi wszelakich błędów, nie mam w przyszłości tyle czasu na szukanie tak... prostego powodu błedu.