Pisze w C(DJGPP) i asm(nasm).
na razie dokładnie nie opisze bo nie mam projektu pod ręką.
Mianowicie problem z trybem wirtualnym już troszkę rozwiązałem bo nie dokońca umiem przełączać na tryb rmode. Przełączyłem poziom(DPL) na 0 i już udał mi się skok do kodu 16-bitowego, ale jeszcze nie wszystko działa(teraz tak zauważyłem że trzeba chyba flagi przestawić w tss).
Z trybem wirtualnym bawie się od niedawna i troszke to dla mnie magia ;]
Robiłem tak(bez tss):
- Skok(jmp numer_gdt*8:0x7C0C i tu chyba powinno byc iret zamiast jmp) do kodu o adresie 0x7C0C (16-bit).
- Wyłączenie trybu chronionego.
- Skok do poprawnego kodu 16-bitowego(jmp 0:etykieta).
- Załadowanie starej tablicy przerwań(idt - przy starcie bootloadera zapisuje sobie(sidt))
- Wywołanie danego przerwania.
- Załadowanie "nowej" tablicy przerwań(ta co w systemie sobie ustawiłem).
- Uruchomienie trybu chronionego
- Skok(jmp numer_gdt*8:0x7CXX) do kodu 32-bitowego(tego ponizej 1MB - 0x7CXX)
- Powrót do kodu systemowego(robie to instrukcją ret - przed 1 punktem zapisuje na stos adres "powrotu" tak jakbym zamiast jmp robił call)
W bootloaderze zrobiłem coś takiego:
[ORG 0x7C00]
[BITS 16]
jmp start ;przy ładowaniu systemu skacze do kodu bootloadera
reg_ax: dw 0 ;wartosci ustawiam sobie przed skokem
reg_bx: dw 0 ;a po skoku w kodzie sobie wszystko ustawiam
reg_cx: dw 0 ;narazie to jest zrobione eksperymentalnie
reg_dx: dw 0
reg_int: db 0
;i tu dalszy kod
Oczywiście numer_gdt (na razie wynosi nr. 3) ma ustawione że kod jest 16-bitowy.
(Ale dlaczego w trybie 16-bitowym moge używać eax itp :> )
Powyższy sposób sam ort! mając wiedze z plotek. Męczyłem się z tym kilka dni.
Na forum pewnym(ang) przeczytałem że trzeba jeszcze ustawić z flagami i użyć iret(który ma możliwość modyfikowania flagi), bo przyznam że mój sposób troszke przycina :-)
Co do przerwań nadal nie działa nawet z poziomem 0(czyli systemowym).
ort! miałem ustawiony poziom 3(czyli najniższy), gdy teraz mam 0 ustawiłem cs, es, ds itp takie jak są w systemie. Wątki dobrze działają, przełączanie też. Zrobione jest także ort!.
Każdy "wątek" ma zadeklarowane 2 tablice ldt. Jedna jest na kod druga na dane.
Pewnie błąd tkwi gdzieś przy tych DPL, flagach lub... sam nie wiem ;]