OS Dev

Kolejny dziwny projekt, jakich wiele…

Nigdy o nim tutaj nie wspominałem, a trwa już dobre 5 lat, więc może warto by było zacząć od odrobiny wykopalisk historycznych. W 2014r. wpadłem na pomysł, żeby w ramach podszkolenia się w Assembly dla procesorów x86 napisać prosty bootloader. Oryginalnie powiązany z moim “panic button” mając na celu nadpisania bootloadera systemu z szyfrowanym dyskiem (LUKS o ile mnie pamięć nie myli), startował PC w trybie 16bit i wyświetlał prostego ASCII-arta.

Te pościgi, te wybuchy…

Te pościgi, te wybuchy…

Później przyszło mi na myśl, że w sumie fajnie by było poznać te bebechy komputera trochę bardziej, więc dopisałem w wielkich bólach kod przechodzący w tryb 32 bitów, całość rozrosła się ponad limity dopuszczalne dla bootloaderów klasycznego BIOSu, więc doszło doczytywanie danych z dysku i kilka innych dziwactw tego trybu pracy procesora. A, skoro już napisałem to, to hej, pora pożegnać średniowiecze i wskoczyć w szalone 64 bity, żeby tekst się bardziej rysowłał na ekranie, albo cokolwiek… nadal nie wiem po co. W każdym razie skończyło się na dodaniu kompresji samego ASCIIart przez RLE i mryganie kolorkami za pomocą przerwań generowanych przez PIT. Projekt zatrzymał się na tym na chwilę i dostępny jest na GitHubie

Finalna “pierwsza” wersja. Jak widać zaszło wiele przełomowych zmian.

Finalna “pierwsza” wersja. Jak widać zaszło wiele przełomowych zmian.

A tak wygląda to teraz…

W tym momencie postanowiłem, że skoro już mam tak rozbudowany kawałek kodu, to może warto by było go przepisać do C, użyć nowocześniejszego sposobu adresacji pamięci, dodać obsługę wyjątków procesora, a kod startowy wymienić na gotowy bootloader. Wybór padł na GRUB, choć przez pewien czas testowałem Syslinux, to niestety jego implementacja obsługi standardu Multiboot na który się zdecydowałem jest niekompletna i wymagała gimnastyki przy pisaniu kodu. Gdy już ten etap zakończył się sukcesem wymieniłem konsolę tekstową na tryb graficzny, po to, by nadal rysować w nim literki, ale tym razem bardziej się z tym męcząc, bo decydując się na takie rozwiązanie pozbawiłem się wbudowanych w BIOS ułatwień do tak skomplikowanych rzeczy. Podyktowane to było przez próbę przeportowania kodu na UEFI, tak aby dało się go uruchomić na nowocześniejszym sprzęcie, jednak możliwości debugowania tego rozwiązania mnie przerosły i do tej pory takie połączenie nie działa. W zamian za to pozostał Multiboot w wersji drugiej, a wbudowany w BOCHS debugger zamieniłem na GDB który ma nieco więcej funkcji, choć i pewne ograniczenia. Rozwiązanie to jednak pozwala na debugowanie kodu również pod emulatorami takimi jak QEMU, VirtualBox czy VMWare, co poskutkowało wykryciem kilku wcześniej nie zauważonych błędów które nie dawały o sobie znać w BOCHS (mającym ponoć idealnie emulować prawdziwego PC).

Finalnie dodałem obsługę obrazów, początkowo w formacie X Bitmap, z której zrezygnowałem na rzecz wbudowanej w GIMPa funkcji eksportu grafiki bezpośrednio do kodu w C, choć wczytywanie typowych bitmap czy czystego strumienia RAW nie byłoby większym problemem, to w ten sposób mam rozwiązanie które trochę bardziej mnie pilnuje odnośnie wybrania prawidłowej głębi kolorów i kilku innych bzdur. Źródła jak zwykle na GitHub.

Innowacyjność wypływająca z monitora

Innowacyjność wypływająca z monitora

Na tym etapie prace utknęły, przynajmniej aktualnie. Niestety, ale żadna firma nie zgłosiła chęci odkupienia tego nowatorskiego systemu operacyjnego, więc musiałem poszukać sobie bardziej dochodowego zajęcia. Ciąg dalszy (może) nastąpi…