﻿{"id":21,"date":"2026-01-06T13:09:18","date_gmt":"2026-01-06T13:09:18","guid":{"rendered":"https:\/\/pamietnik.ovh\/?p=21"},"modified":"2026-01-06T13:09:18","modified_gmt":"2026-01-06T13:09:18","slug":"jak-przygotowac-sie-do-developmentu-systemow-operacyjnych","status":"publish","type":"post","link":"https:\/\/pamietnik.ovh\/index.php\/2026\/01\/06\/jak-przygotowac-sie-do-developmentu-systemow-operacyjnych\/","title":{"rendered":"Jak przygotowa\u0107 si\u0119 do developmentu system\u00f3w operacyjnych"},"content":{"rendered":"\n<p>Prawdopodobnie jeste\u015b tutaj aby nauczy\u0107 si\u0119 jak zacz\u0105\u0107 przygod\u0119 z OSDEVem. To jest szybki poradnik aby zacz\u0105\u0107 wy\u015bwietla\u0107 tekst na swoim w\u0142asnym ekranie. Zaczniemy tutaj z pisaniem prostego assemblera, kt\u00f3ry normalnie jest uznawany jako bootloader. Polecam zainstalowanie jakiego\u015b IDE takiego jak Visual Studio Code lub innych. W tym przypadku u\u017cyjemy VS Code.<\/p>\n\n\n\n<p>Do tego poradnika narazie potrzebujemy dw\u00f3ch program\u00f3w:<\/p>\n\n\n\n<p>    <strong>nasm <\/strong>&#8211; Potrzebny do kompilowania kodu                                                                                                  <\/p>\n\n\n\n<p>    <strong>qemu <\/strong>&#8211; Potrzebny do uruchamiania systemu<\/p>\n\n\n\n<p>Teraz poka\u017ce kod kt\u00f3ry pisze Hello, World! na ekranie &#8211;<\/p>\n\n\n\n<pre><code>\nbits 16\norg 0x7c00\n\nglobal start\nstart:\n    push cs\n    pop ds\n    mov si, msg\nprint:\n   lodsb\n   test al, al\n   jz .done\n   mov ah, 0x0e\n   int 0x10\n   jmp print\n.done:\n    hlt\n    jmp .done\n\nmsg: db \"Hello, World!\", 0\ntimes 510-($-$$) db 0\ndw 0xAA55\n<\/code><\/pre>\n\n\n\n<p>To mo\u017ce by\u0107 skomplikowane, wi\u0119c wyja\u015bnie wszystkie linie tutaj:<\/p>\n\n\n\n<p><strong>bits 16<\/strong> &#8211; Potrzebny, aby kompilator wiedzia\u0142 \u017ce jeste\u015bmy w trybie 16-bitowym<\/p>\n\n\n\n<p><strong>org 0x7c00 <\/strong>&#8211; Ta linia jest bardzo wa\u017cna, bo linker zazwyczaj ustawia nasz kod na adresie 0x0, wi\u0119c nadpisujemy BIOS, i wtedy nie ma co odpali\u0107, bo nie ma czym.<\/p>\n\n\n\n<p><strong>global start <\/strong>&#8211; Ta linia powoduje \u017ce BIOS wie gdzie znajduje si\u0119 punkt wej\u015bciowy dla systemu<\/p>\n\n\n\n<p><strong>start<\/strong> &#8211; Definicja &#8220;funkcji&#8221;<\/p>\n\n\n\n<p><strong>push cs<\/strong> &#8211; Jest taka rzecz jak stack, kt\u00f3ra ma jakie\u015b dane, i u\u017cywa tzw. stack pointera (sp), i kiedy my wykonujemy push (co\u015b) to warto\u015b\u0107 tego co\u015b jest wrzucona na adres na kt\u00f3ry wskazuje stack pointer, i obni\u017ca warto\u015b\u0107 sp o 4.<\/p>\n\n\n\n<p><strong>pop ds<\/strong> &#8211; Pop (co\u015b) to jest to samo jak z push (co\u015b), tylko na odwr\u00f3t. Pop (co\u015b) zyskuje dane z sp i warto\u015b\u0107 tych danych znajduje si\u0119 w tym czym\u015b.<\/p>\n\n\n\n<p><strong>mov si, msg<\/strong> &#8211; Instrukcja mov powoduje, \u017ce warto\u015b\u0107 pierwszej rzeczy podanej, jest r\u00f3wna drugiej rzeczy, czyli w tym przypadku SI ma warto\u015b\u0107 &#8220;Hello, World!&#8221;.<\/p>\n\n\n\n<p><strong>print<\/strong> &#8211; Definicja &#8220;funkcji&#8221; kt\u00f3ra s\u0142u\u017cy za pokazywanie liter na ekran<\/p>\n\n\n\n<p><strong>lodsb<\/strong> \u2013 Ta instrukcja jest troch\u0119 skomplikowana, ale bardzo przydatna. Dzia\u0142a mniej wi\u0119cej tak:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> mov al, &#91;si] inc si <\/code><\/pre>\n\n\n\n<p>Czyli: bierze bajt spod adresu wskazywanego przez rejestr <code>SI<\/code>, zapisuje go do <code>AL<\/code>, a potem zwi\u0119ksza <code>SI<\/code>, \u017ceby wskazywa\u0142 na nast\u0119pny znak w pami\u0119ci.<\/p>\n\n\n\n<p><strong>test al, al<\/strong> \u2013 Ta instrukcja sprawdza, czy rejestr <code>AL<\/code> ma warto\u015b\u0107 0. Nie zmienia jego warto\u015bci, tylko ustawia flagi procesora.<\/p>\n\n\n\n<p><strong>jz .done<\/strong> \u2013 Je\u015bli wynik testu by\u0142 r\u00f3wny zero (czyli trafili\u015bmy na znak <code>0<\/code> ko\u0144cz\u0105cy string), skaczemy do etykiety <code>.done<\/code>.<\/p>\n\n\n\n<p><strong>mov ah, 0x0e<\/strong> \u2013 Ustawiamy funkcj\u0119 BIOS-u. <code>0x0E<\/code> to tryb \u201eteletype output\u201d, kt\u00f3ry wypisuje znak na ekranie i automatycznie przesuwa kursor.<\/p>\n\n\n\n<p><strong>int 0x10<\/strong> \u2013 Wywo\u0142anie przerwania BIOS-u odpowiedzialnego za obs\u0142ug\u0119 ekranu. BIOS bierze znak z rejestru <code>AL<\/code> i wypisuje go.<\/p>\n\n\n\n<p><strong>jmp print<\/strong> \u2013 Skaczemy z powrotem do etykiety <code>print<\/code>, aby wypisa\u0107 kolejny znak.<\/p>\n\n\n\n<p><strong>.done:<\/strong> \u2013 Etykieta ko\u0144cz\u0105ca p\u0119tl\u0119 wypisywania tekstu.<\/p>\n\n\n\n<p><strong>hlt<\/strong> \u2013 Instrukcja zatrzymuj\u0105ca procesor do momentu nast\u0119pnego przerwania. Poniewa\u017c nie mamy jeszcze systemu operacyjnego, po prostu \u201ezamra\u017camy\u201d CPU.<\/p>\n\n\n\n<p><strong>jmp .done<\/strong> \u2013 Prosta p\u0119tla niesko\u0144czona. Gdyby procesor si\u0119 obudzi\u0142, wr\u00f3ci z powrotem do <code>hlt<\/code>.<\/p>\n\n\n\n<p><strong>msg: db &#8220;Hello, World!&#8221;, 0<\/strong> \u2013 Definicja danych. Tworzymy w pami\u0119ci tekst zako\u0144czony bajtem <code>0<\/code>, kt\u00f3ry informuje nasz kod, gdzie ko\u0144czy si\u0119 napis.<\/p>\n\n\n\n<p><strong>times 510-($-$$) db 0<\/strong> \u2013 Dope\u0142niamy sektor zerami tak, aby ca\u0142y bootloader mia\u0142 dok\u0142adnie 512 bajt\u00f3w.<\/p>\n\n\n\n<p><strong>dw 0xAA55<\/strong> \u2013 Sygnatura bootloadera. BIOS sprawdza te dwa bajty, aby upewni\u0107 si\u0119, \u017ce sektor jest bootowalny. Bez tego kod si\u0119 nie uruchomi.<\/p>\n\n\n\n<p>Po skompilowaniu tego kodu i uruchomieniu go w QEMU zobaczysz na ekranie klasyczne <strong>Hello, World!<\/strong>. To jest pierwszy krok w OSDEV-ie \u2013 od tego momentu masz pe\u0142n\u0105 kontrol\u0119 nad maszyn\u0105.<\/p>\n\n\n\n<p>Aby skompilowa\u0107 ten kod, mo\u017cna u\u017cy\u0107 instrukcji: <code>nasm -f bin plik.asm -o os.bin<\/code>, gdzie plik.asm to jest wasz plik kt\u00f3ry stworzyli\u015bcie i gdzie macie kod. Po tym wystarczy uruchomi\u0107: <code>qemu-system-i386 -drive format=raw,file=os.bin<\/code>, i gotowe! Je\u017celi qemu si\u0119 zamknie od razu, to prawdopodobnie zapomnieli\u015bcie sygnatury bootloadera.<\/p>\n\n\n\n<p>I to jest koniec na ten poradnik. W nast\u0119pnym poradniku poka\u017c\u0119 jak zainstalowa\u0107 cross compiler, i pokaza\u0107 co\u015b wi\u0119cej na ekranie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prawdopodobnie jeste\u015b tutaj aby nauczy\u0107 si\u0119 jak zacz\u0105\u0107 przygod\u0119 z OSDEVem. To jest szybki poradnik aby zacz\u0105\u0107 wy\u015bwietla\u0107 tekst na<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,6],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-osdev","category-tutoriale"],"_links":{"self":[{"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":2,"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":23,"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/posts\/21\/revisions\/23"}],"wp:attachment":[{"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pamietnik.ovh\/index.php\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}