potrzebuje upewnic sie co do kilku rzeczy.
manual to lanie wody i nie jestem pewien czy nie opuscilem niczego istotnego.
TSS jest struktura opisujaca context procesora. zawiera wszystko procz rejestrow x87 i sse (wlasnie, jak one sa azchowywane).
zmiana taska moze nastapic tylko raz, flaga NT jest ustawiana i busy bit w segmencie.
powrot przez iret, flagi sie czyszcza.
teraz jak dziala realizacja context switcha w osach?
jak one przelaczaja watki?
procesor ma rejestr TR, ktory zawiera informacje jak stosy dla poszczegolnych cpl'i.
jesli zmienie cpl, to ss i esp jest automatycznie pushowane na nowy stack (64bit zawsze jest) i zastepywane przez odpowiednia wartosc z TR. powrot analogicznie.
wiec jesli zrobie intX, iret, div/0, czy cokolwiek, cpu skopiuje na nowy stos stary esp i ss.
a nastepnie wykona normalne wejscie, czyli push eflags, push cs, push eip i skoczy pod cs:epi handlera.
stos handlera interruptu:
ss3
esp3
eflags
cs3
eip3
iret analogicznie, jesli popujac CS nastapi zmiana cpl, popuje stary ss, esp.
exceptiony i interrupty sa jedyne zmieniajace cpl, bo call/jmp dla conforming segmentu uruchamia go w dpl = cpl.
wiec jak wyglada multitasking?
cpu jest w cpl = 3, jest jakis interrupt. handler dziala w ring0 zazwyczaj.
po wejsciu w handlera, na stosie jest stary esp bo nastapila zmiana cpl. handler sie wykonuje, i przed iretd, jakas funkcja sprawdza, czy watek wykozystal swoj przydzielony limit cykli. jesli nie, iret, jeli tak - zmienia GPRy, cr3, fpu, sse, elfags na wartosci z jakiejs abstrakcyjnej tabeli z listy watkow.
po zmianie stosu, sprawa jest identyczna. watek zawsze jest opuszczany z ss, esp, elfags, cs, eip, wiec iret 'powraca' do innego watku i kolo sie zamyka.
i teraz co to jest ten TSS?
jak to sie ma do calosci?
jak wykonam int na task gate, badz call na TSS descriptor, kontext cpu sie zamienia z zawartoscia TSS, i ustawia busy flag. wyjscie resetuje to. po co to jest?
czym sie rozni TSS segment od TSS tabeli zawierajacel kontext cpu? jest jakis zwiazek?
ostatnia kwestia jak wyglada przekazywanie argumentow do exceptionow?
ss
esp
eflags
cs
eip
error
jak handler ma wiedziec, ze zostal mu przekazany error code?
jest jakis standard? nie doszukalem sie w manualu.