(Post gościnny by reenz0h)
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:

2016-05-30 16:31:58 = lukasz1235
{
Ustawienie flagi `1g_pages` pomaga, przynajmniej u mnie na wersji 2.6.2. Później postaram się sprawdzić czy na najnowszej zachowuje się tak samo.
}
2016-05-30 17:19:57 = krycha
{
[config gyna]
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.
}
2016-05-30 17:22:47 = Gynvael Coldwind
{
No i zagadka rozwiązana :)
krycha, lukasz1235, good work :)
}
2016-05-31 05:49:28 = reenz0h
{
Gites. Dzięki krycha za info. ;)
}

Add a comment:

Nick:
URL (optional):
Math captcha: 8 ∗ 4 + 9 =