osdev.labedz.org

Opis

Bochs jest programem, który symuluje kompletny system komputerowy kompatybilny z rodziną IBM-PC/AT. Emulowany komputer może 'posiadać' procesor zgodny z Intel386, Intel486, Pentium lub Pentium Pro, kartę graficzną VGA zgodną ze standardem VESA, napędy dysków, dyskietek, CD-ROM, kartę sieciową zgodną z rodziną NE2000, kartę muzyczną zgodną z kartą Sound Blaster16.

Ponieważ Bochs emuluje całe oprzyrządowanie komputera, programy uruchomione na nim, zachowują się tak jakby były uruchomione na rzeczywistej maszynie. Cecha ta umożliwia uruchamianie szerokiego wachlarzu aplikacji, włącznie z powszechnie znanymi systemami operacyjnymi takimi jak: Windows 95/98/NT/XP, wszystkie dystrybucje Linux'a, BSD i wiele innych.

Emulator ten został napisany całkowicie w języku C++ i jest przeznaczony do uruchamiania na wielu różnych platformach sprzętowych, włącznie z Intel386, PPC, Alpha, Sun czy też MIPS. Ponieważ program emulatora symuluje wykonywanie każdej instrukcji procesora w sposób programowy, nie ma znaczenia na jakiej architekturze został uruchomiony.

W celu podniesienia funkcjonalności emulowanego komputera, Bochs zapewnia połączenie logiczne pomiędzy rzeczywistymi zasobami sprzętowymi komputera, a systemem emulowanym. Dzięki czemu istnieje możliwość rzeczywistego odsłuchania dźwięków generowanych przez emulowaną kartę muzyczną, czy też korzystać z fizycznego połączenia sieciowego w emulowanym systemie operacyjnym.

Najczęstszym powodem instalowania emulatora Bochs jest chęć uruchamiania aplikacji napisanych dla architektury 80x86 na innych platformach sprzętowych, jak również potrzeba posiadania dwóch systemów operacyjnych uruchomionych jednocześnie na jednym komputerze. Jednakże duża zgodność z fizycznym sprzętem, oraz mocno rozbudowany program debuggera zawarty w emulatorze powoduje, że jest on równie chętnie wykorzystywany przez osoby zajmujące się implementacja systemów operacyjnych jako środowisko testowo/uruchomieniowe.

Instalacja

Program Bochs jest rozpowszechniany wraz z wieloma dystrybucjami systemu Linux, bądź też jest dostępny w Internecie, na stronie domowej projektu. Ze strony tej istnieje możliwość zciągnięcia zarówno plików źródłowych emulatora, jak również gotowej wersji binarnej (o ile jest dostępna na naszą platformę). Zaleca się jednak instalację programu ze źródeł, gdyż dopiero w takim przypadku mamy dostęp do niektórych funkcji emulatora.

Jeżeli zamierzamy skompilować program emulatora samemu, należy najpierw rozpakować najnowszą wersję archiwum zawierającą pliki źródłowe, o nazwie bochs-version.tar.gz. Żeby rozpakować archiwum w systemie operacyjnym pochodnym od Unix'a należy wykonać komendę:

$ tar -xvfz bochs-version.tar.gz

Komenda ta założy, w bieżącym katalogu, katalog o nazwie bochs-version w którym będą znajdowały się pliki źródłowe emulatora.

Standardowy proces kompilacji składa się z trzech prostych kroków: configure, make i make install. Skrypt configure ma za zadanie przetestowanie komputera pod względem zgodności, sprawdzenie obecności kompilatora oraz bibliotek i ustawienie skryptów kompilacji, tak aby program emulatora pracował poprawnie na danej maszynie. Najprostszym sposobem konfigurowania jest uruchomienie skryptu bez żadnych dodatkowych parametrów, jednakże wiele opcji emulatora nie będzie dostępnych. Żeby zobaczyć wszystkie opcje konfiguracji należy wykonać polecenie configure -help.

ParametrOpis działania
--with-x11Użyj interfejsu serwera X windows. Na wielu platformach sprzętowych ustawienie standardowe.
--with-svgaDla systemu Linux polecenie używania biblioteki SVGALIB.
--with-all-libsUżyj wszystkich możliwych znalezionych na systemie bibliotek.
--enable-cpu-level = {3,4,5,6}Wybór poziomu emulacji CPU. Wybór 3,4,5,6 oznacza emulacje procesorów odpowiednio i386, i486, Pentium i Pentium Pro.
--enable-cdromUżywaj rzeczywistego napędu CD-ROM.
--enable-sb16={dummy,win,linux,freebsd}Emulacja karty muzycznej. Opcja dummy oznacza emulację, ale nie rzeczywiste generowanie dźwięku.
--enable-ne2000Obsługa karty sieciowej.
--enable-vbeUżywaj rozszerzeń karty VGA (ang. VGA bios extension)
--enable-all-optimizationUżywaj wszystkich możliwych rodzai optymalizacji.
--enable-mmxEmulacja instrukcji MMX
--enable-sse = poziomEmulacja instrukcji SSE; SSE - poziom =1, SSE2 - poziom =2.
--enable-debuggerWkompiluj debugger.
--enable-disasmWkompiluj disassembler.
--enable-pciEmulacja magistrali PCI.
--prefix=katalogKatalog do którego ma zostać zainstalowany emulator
Tabela: Podstawowe parametry konfiguracji procesu kompilacji emulatora Bochs

Do potrzeb implementacji jądra systemu operacyjnego, rozsądny wydaje się skompilowanie emulatora Bochs z następującymi parametrami:

$ cd ./bochs-version $ /configure --prefix=/usr/local/bochs --with-x11 --with-all-libs \ --enable-cpu-level=5 --enable-cdrom --enable-vbe --enable-fpu \ --enable-all-optimization --enable-mmx --enable-sse=2 --enable-debugger \ --enable-disasm --enable-pci

Najważniejszymi składnikami, z punktu widzenia procesu implementacji, są tu opcje dotyczące dołączenia programu debuggera oraz disassemblera, możliwość podglądu programu w oknie serwera X windows, oraz emulacji większość elementów architektury typowego komputera PC.

Po procesie konfiguracji należy program skompilować wykonując instrukcję:

$ make

a następnie:

$ make install

Do ostatniego kroku instalacji wymagane są uprawnienia administratora na danym komputerze. Jeśli nie mamy takich uprawnień, to emulator Bochs możemy zainstalować lokalnie w domowym katalogu. W tym celu należy zmienić wartość parametru --prefix.

Konfiguracja

Oprócz samego programu emulatora, do jego poprawnego uruchomienia, potrzebne są jeszcze trzy elementy: obraz bios'u emulowanego komputera, obraz bios'u karty graficznej emulowanego komputera, oraz przynajmniej jeden bootowalny obraz dysku.

Większość z tych elementów dostarczona jest wraz ze źródłami emulatora lub też dostępne są na stronie internetowej emulatora. Plik biosu komputera nazywa się BIOS-bochs-latest, a karty graficznej VGABIOS-lgpl-latest.

Emulator Bochs konfiguruje się najczęściej za pomocą pliku konfiguracyjnego .bochsrc. W pliku tym znajdują się wszystkie informacje dotyczące emulowanego komputera. Konfiguracja polega na przypisaniu odpowiednich wartości do poszczególnych słów kluczowych i zapisaniu w pliku tekstowym.

display_library: x

Polecenie te określa bibliotekę jaka ma zostać użyta przez emulator do wyświetlania obrazu VGA. Bochs obsługuje ponad dziesięć różnych bibliotek, w zależności od platformy sprzętowej na której jest uruchomiony. W systemach Unix'owych najczęściej będzie to biblioteka x, natomiast w systemach z rodziny Windows, będzie to win32.

megs: 8

Polecenie te określa ilość pamięci typu RAM jaką ma posiadać emulowany komputer. Do celów testowania działania implementowania jądra systemu operacyjnego wartość ta nie musi być duża. Ważnym elementem testów, może być zmiana ilości posiadanej pamięci w emulowanym komputerze - przydatna opcja podczas pisania menadżera pamięci niskiego poziomu.

romimage: file=/usr/local/bochs/share/bochs/BIOS-bochs-latest, address=0xf0000

Polecenie te pozwala wybrać obraz bios'u komputera - nazwę pliku podajemy po parametrze file. W poleceniu tym możemy ustawić adres pamięci pod który ma zostać załadowany BIOS - najczęściej jest to adres 0xf0000.

vgaromimage: /usr/local/bochs/share/bochs/VGABIOS-elpin-2.40

Poleceniem tym wybieramy obraz bios'u karty graficznej.

boot: floppy

Poleceniem tym wybieramy urządzenie z którego ma być bootowany emulowany komputer. Do wyboru jest stacja dysków (floppy), dysk twardy (disk), lub cdrom

floppya: 1_44="/home/labedz/dyplom/img/floppy2.img", status=inserted

Polecenie te umożliwia przypisanie pliku obrazu dyskietki do stacji dysków. Jeżeli chcemy skorzystać z rzeczywistej stacji dysków to zamiast nazwy plików należy wpisać nazwę pliku przypisanego do interesującego nas urządzenia np. 1_44=/dev/fd0. W poleceniu tym mamy też możliwość określenia czy dana dyskietka jest obecna w napędzie.

ips: 1000000

Polecenie to określa ilość emulowanych instrukcji jaka będzie wykonana w ciągu sekundy. Polecenie te jest często używane do kalibrowania wielu zależnych czasowo zdarzeń, takich jak na przykład odświeżanie emulowanej karty VGA. Wartość tego parametru ma wpływ na obciążenie rzeczywistego komputera przez program emulatora. Dla współczesnych komputerów (z zegarem ok. 1Ghz) wartość parametru ips może wynosić około 1 miliona instrukcji na sekundę.

Emulator Bochs ma możliwość pracy z dyskiem twardym, zarówno jako obrazem w pliku czy fizycznym urządzeniem, jednakże do celów testowania implementowanego systemu operacyjnego w zupełności wystarcza praca z dyskietką.

Emulator uruchamia się pisząc w linii komend:

/usr/local/bochs/bin:$ bochs

Po wykonaniu tej instrukcji emulator uruchamia się i udostępnia menu w którym możemy wybrać tryb konfigurowania programu, lub też rozpoczęcie emulacji. Jeżeli chcemy aby emulator rozpoczynał emulacje od razu, należy wykonać powyższą instrukcję dodając do niej parametr -q.

Debugger emulatora Bochs

Jeżeli do emulatora został wkompilowany wewnętrzny debugger, będzie on zawsze uruchomiany przed wykonaniem pierwszej instrukcji emulowanego komputera. Umożliwia to użytkownikowi, na wstępne ustawienie wszelkich pułapek czy zmiennych do podglądu.

Debugger wbudowany w emulator Bochs pracuje w trybie liniowym (podobnie jak konsola systemowa) - każda komenda jest wpisywana w linii i wykonywana po jej zatwierdzeniu klawiszem ENTER. Jeżeli zależy nam na graficznym interfejsie użytkownika, istnieje możliwość zainstalowania nakładki BFE.

Przykłady szczególnie przydatnych komend debuggera Bochs:

KomendaOpis działania
cKontynuuj wykonywanie programu.
stepi[liczba]; si[liczba]; step[liczba]; s[count]Wykonaj określoną liczbę instrukcji. Stadardowo przyjęte '1'.
Ctrl-CPrzerwij wykonywanie programu i przejdź do programu debugger'a.
quit; qWyjście z programu.
Tabela: Komendy kontroli wykonywania programu
KomendaOpis działania
vbreak seg:offUstaw punkt kontrolny pod adresem wirtualnym.
lbreak addr;lb addrUstaw punkt kontrolny pod adresem liniowym.
pbreak addr;break addr;b addrUstaw punkt kontrolny pod adresem fizycznym.
info breakPokaż wszystkie ustawione punkty kontrolne.
delete n;d nUsuń punkt kontrolny.
Tabela: Komendy dotyczące punktów kontrolnych
KomendaOpis działania
x /nuf adresZrzut pamięci od adresu liniowego n - ilość zrzucanych jednostek u - jednostki o wielkości
  • b: bajta
  • h: pół-słowo (16 bitów)
  • w: słowo (32 bitów)
  • g: podwójne słowo (64 bity)
format wyświetlanego obszaru pamięci
    x: liczby szesnastkowe d: liczby dziesiętne u: liczby dziesiętne nieujemne o: liczny ósemkowe t: liczby binarne
setpmem addr rozmiar wartośćUstaw wartość komórki pamięci.
info dirtyPokaż strony, które zostały zmienione (od czasu ostatniego sprawdzenia).
Print-stack liczbaZrzut liczba słów aktualnego stosu programowego.
Tabela: Komendy operacji na pamięci
KomendaOpis działania
set $rej=wartZmień wartość rejestru procesora.
dump_cpuWypis wszystkich rejestrów procesora.
info registersSkrócony wypis rejestrów procesora.
Tabela: Operacje na rejestrach procesora
KomendaOpis działania
watch read addrUstaw podgląd komórki pamięci o określonym adresie; zatrzymaj emulacje i przejdź do debuggera jeśli nastąpi z niej odczyt.
watch write addrUstaw podgląd komórki pamięci o określonym adresie; zatrzymaj emulacje i przejdź do debuggera jeśli nastąpi do niej zapis.
unwatch read addrUsuń podgląd odczytu z określonej komórki.
unwatch write addrUsuń podgląd zapisu z określonej komórki.
watchPokaż listę podglądów
unwatchUsuń wszystkie podglądy
Tabela: Operacje na podglądach pamięci
<
V