Instalacja xv6 (x86)
Pobierz z github system operacyjny
xv6
z łatą
xv6.patch. Łata pozwala na kompilację dla nowszych
wersji gcc np. 13.x.x:
$ git clone https://github.com/mit-pdos/xv6-public.git
Cloning into 'xv6-public'...
...
$ cd xv6-public
$ wget https://cs.pwr.edu.pl/zawada/akiso/xv6.patch
$ patch -p1 -i xv6.patch
Możesz teraz zbudować i uruchomić ten system. Na początek musisz zainstalować
emulator
qemu (np.
apt install
qemu lub
pacman -S qemu-desktop):
$ make qemu
Można też uruchomić bezpośrednio w terminalu (bez środowiska graficznego) przez
emulator qemu tak:
$ make qemu-nox
Wyjście z emulatora mamy przez kombinację klawiszy
ctrl+a x, czyli
jednocześnie naciskamy
ctrl i
a, potem klawisz
x. Pomoc
skrótów pokazuje kombinacja
ctrl+a h np.
ctrl+a c - konsola qemu
gdzie można zobaczyć dużo informacji o maszynie emulującej przez qemu np.
info,
info mem,
info block,
info registers,
info qtree.
System możemy śledzić przez
debugger gdb uruchamiając:
$ make qemu-gdb # lub make qemu-nox-gdb
i w drugim terminalu na początek pozwolmy gdb na automatyczne ładownie pliku
.gdbinit który jest przygotowany w źródłach xv6:
$ echo "set auto-load safe-path /" >>~/.gdbinit # komendę uruchamiamy tylko raz!
Uruchamiamy gdb:
$ cd xv6-public
$ gdb ./kernel
GNU gdb (GDB) 13.2
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./kernel...
+ target remote localhost:26000
The target architecture is set to "i8086".
[f000:fff0] 0xffff0: ljmp $0x3630,$0xf000e05b
0x0000fff0 in ?? ()
+ symbol-file kernel
(gdb) break *0x7c00
Breakpoint 1 at 0x7c00
(gdb) c
Continuing.
[ 0:7c00] => 0x7c00: cli
Thread 1 hit Breakpoint 1, 0x00007c00 in ?? ()
(gdb)
Szczegóły tego, co widzisz, prawdopodobnie będą się różnić od powyższych
w zależności od wersji gdb, której używasz, ale gdb powinien się
zatrzymać w punkcie przerwania i powinna to być powyższa instrukcja cli.