Na ostatnim streamie OSDev#3 Gynvael kontynuował rozwijanie bootloader'a, aby ostatecznie wejść w tryb long mode. Ustawił odpowiednie parametry procesora (GDT, PAE, EFER MSR, etc.), ale próba wejścia w stronicowanie przy użyciu 1GB stron nie powiodła się. Emulator Bochs przerywał działanie z błędem "physical address not available":
<bochs:1> c
(0).[166562263] ??? (physical address not available)
Next at t=166562264
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0
Postanowiłem znaleźć trochę wolnego czasu i spróbować uruchomić ten kod u siebie.
Udało mi się stworzyć działający stage2, który przechodzi do long mode ze stronicowaniem 4kB i 2MB, ale przy próbie ze stronami 1GB pojawiał się ten sam błąd. Kod możecie znaleźć tutaj. Starałem się, aby źródła były jak najjaśniej opisane, aby nie było wielkich problemów z ich zrozumieniem.
W dokumentacji Bochsa znalazłem parametr 1g_pages, który włącza obsługę 1GB stron w long mode. Ale to nie pomogło, jak również upewnienie się, że Bochs wspiera tryb x86-64 (wymagany przy konfiguracji tego parametru) poprzez przekompilowanie najświeższej wersji emulatora.
Jedyna rzecz, która mi pozostała to upewnienie się, czy jest to wina błędu w kodzie, czy może samego emulatora. Uruchomiłem więc floppy.bin pod Qemu i okazało się, że kod działa poprawnie:
$ qemu-system-x86_64 -fda floppy.bin
Niestety z braku czasu nie wiem, czemu ten sam kod nie działa pod Bochsem. Może w wolnej chwili temu się przyjrzę i za zgodą Gynvaela umieszczę wyjaśnienie na jego blogu.
Podziękowania...
... dla Gynvaela za zajęcię się na swoim streamie tematem OSDev. Pisanie własnego systemu operacyjnego jest fascynującym zadaniem i wymaga zgłębienia wielu elementów, poczynając od działania procesora, pamięci, etapów uruchamiania komputera, BIOSu, a kończąc na kwestiach separacji user mode/kernel mode, wywłaszczania, szeregowania zadań, obsługi przerwań czy zarządzania pamięcią. Dzięki Gyn!Warto przeczytać
[+] http://wiki.osdev.org/Boot_Sequence[+] http://wiki.osdev.org/GDT_Tutorial
[+] http://wiki.osdev.org/User:Stephanvanschaik/Setting_Up_Long_Mode
[+] http://duartes.org/gustavo/blog/post/how-computers-boot-up/
[+] http://duartes.org/gustavo/blog/post/kernel-boot-process/
[+] http://duartes.org/gustavo/blog/category/internals/
Comments:
cpu: model=core2_penryn_t9600
Ustawienie tutaj "cpuid: 1g_pages=1", nie daje nic.
Pogrzebałem trochę w internecie i natrafiłem na stronę:
http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html
W sekcji 4.3.5 (cpuid) jest napisane:
This defines features and functionality supported by Bochs emulated CPU. These settings are only valid and configurable if the cpu model is set to the default value 'bx_generic'.
Więc według tego ustawiłem "model=bx_generic" i teraz flaga "1g_pages" działa jak trzeba.
krycha, lukasz1235, good work :)
Add a comment: