SO 2023
ASM
Nieoficjalny spis instrukcji asemblera x86 (nie jest idealny, ale za to podany w dość czytelnej postaci): https://www.felixcloutier.com/x86/index.html.
Poradnik o asemblerze na wikibooks: https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture.
GDB
Rozszerzenie PEDA do gdb: https://github.com/longld/peda.
Jak używać gdb (wersja bardzo skompresowana):
- Uruchamiamy
gdbi podajemy ścieżkę do programu, który będziemy debugować:$ gdb ./nasz_program. - Stawiamy
breakpointw miejscu, od którego chcemy zacząć debugowanie:b nazwa_funkcji(bto skrót odbreakpoint). - Uruchamiamy program:
r(skrót odrun). - Teraz program powinien zacząć działać i dotrzeć aż do pierwszego wystąpienia breakpointu. W tym momencie przydadzą się 3 komendy
gdb:s(skrót odstep) - wykonuje jedną instrukcję, jeśli jest to wywołanie funkcji, to wchodzi do niej.n(skrót odnext) - wykonuje jedną instrukcję, ale omija wywołania funkcji.c(skrót odcontinue) - kontynuuje wykonanie programu aż do ponownego natrafienia na breakpoint.
gdbzamykamy podając komendęq(skrót odquit).
MINIX
Konfiguracja środowiska do pracy z kodem źródłowym Minixa może wyglądać następująco:
Pobieramy obraz
qemuze studentsa:$ scp <login>@students.mimuw.edu.pl:/home/students/inf/PUBLIC/SO/scenariusze/4/minix.img minix_original.imgTworzymy obraz copy-on-write:
$ qemu-img create -f qcow2 -F raw -o backing_file=minix_original.img minix.imgTworzymy skrypt uruchamiający obraz
run_minix.sh:qemu-system-x86_64 -curses -drive file=minix.img -enable-kvm -machine kernel_irqchip=off -rtc base=localtime -net user,hostfwd=tcp::10022-:22 -net nic,model=virtio -m 1024MNa systemie Mac OS X być może zadziała coś takiego:
qemu-system-x86_64 -display curses -drive file=minix.img -machine accel=hvf -rtc base=localtime -net user,hostfwd=tcp::10022-:22 -net nic,model=virtio -m 1024MUruchamiamy obraz:
$ ./run_minix.shKopiujemy nasz klucz publiczny na minix:
$ ssh-copy-id root@localhost -p 10022Dodajemy minixa do
.ssh/config:Host minix HostName localhost Port 10022 User rootTeraz możemy zalogować się na minixa:
$ ssh minixInstalujemy
nanoirsyncna minixie:$ pkgin install nano $ pkgin install rsyncKopiujemy kod źródłowy z minixa na hosta i inicjalizujemy repozytorium gita:
$ mkdir minix_source $ rsync -vrazh minix:/usr/src minix_source $ cd minix_source $ git init .Dodajemy plik
.gitignore:*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*/*.* */*/*/*/*/*/*/*.* */*/*/*/*/*/*.* */*/*/*/*/*.* */*/*/*/*.* */*/*/*.* */*/*.* */*.* *.* !/**/*.c !/**/*.h !/**/Makefile !/**/makefile !/**/Makefile.inc !/**/makefile.inc !.gitignore
- Commitujemy:
.gitignoresrc/includesrc/lib/libcsrc/minix/serverssrc/minix/kernelsrc/minix/lib/libsys
- Tworzymy skrypt kopiujący kod źródłowy z hosta na minixa
sync.sh:rsync -vrazh src minix:/usr/
- Tworzymy skrypt do backupowania obrazu minixa
backup.sh(przed wykonaniem backupu należy wyłączyćqemu):month=$( date +%m ) day=$( date +%d ) hour=$( date +%H ) minute=$( date +%M ) cp minix.img minix_${month}.${day}T${hour}:${minute}.img
- Teraz możemy edytować kod źródłowy na hoście (na przykład CLionem lub VSCode) i kompilować go na minixie. Wszystkie zmiany powinny być widoczne w
git status. Przykładowe flow edycji kodu może wyglądać tak:- Edytujemy kod w IDE
- Przysyłamy zmiany za pomocą rsync (uwaga, rsync wysyła też pliki *.o, także nadpisze Wam wszystkie wcześniej skompilowane pliki)
- W minixie uruchamiamy skrypt do kompilowania, wyglądający mniej więcej tak:
cd /usr/src; make includes || exit 1 cd /usr/src/minix/kernel; make clean && make || exit 1 make install || exit 1 cd /usr/src/minix/lib/libsys; make clean && make || exit 1 make install || exit 1 cd /usr/src/minix/servers/sched; make clean && make || exit 1 make install || exit 1 cd /usr/src/minix/servers/pm; make clean && make || exit 1 make install || exit 1 cd /usr/src/lib/libc; make clean && make || exit 1 make install || exit 1 cd /usr/src/releasetools; make hdboot - Jeśli wszystkie polecenia się udały, to wykonujemy
$ reboot, a w oknie wyboru wersji jądra wybieramy2. - Jeśli system się nie uruchomi, możemy zamknąć qemu i uruchomić minixa ponownie, ale wybierając
1- uruchomi się wtedy poprzednia wersja jądra.