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
gdb
i podajemy ścieżkę do programu, który będziemy debugować:$ gdb ./nasz_program
. - Stawiamy
breakpoint
w miejscu, od którego chcemy zacząć debugowanie:b nazwa_funkcji
(b
to 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.
gdb
zamykamy 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
qemu
ze studentsa:$ scp <login>@students.mimuw.edu.pl:/home/students/inf/PUBLIC/SO/scenariusze/4/minix.img minix_original.img
Tworzymy obraz copy-on-write:
$ qemu-img create -f qcow2 -F raw -o backing_file=minix_original.img minix.img
Tworzymy 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 1024M
Na 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 1024M
Uruchamiamy obraz:
$ ./run_minix.sh
Kopiujemy nasz klucz publiczny na minix:
$ ssh-copy-id root@localhost -p 10022
Dodajemy minixa do
.ssh/config
:Host minix HostName localhost Port 10022 User root
Teraz możemy zalogować się na minixa:
$ ssh minix
Instalujemy
nano
irsync
na minixie:$ pkgin install nano $ pkgin install rsync
Kopiujemy 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:
.gitignore
src/include
src/lib/libc
src/minix/servers
src/minix/kernel
src/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.