[OSDev] Co ma ds do cs w tss'ach?

0

Witam.
Spotkałem się z bardzo dziwacznym problemem ;-(
Tworze wątek, eip ma wpisany adres procedurki(od początku pamięci), proces korzysta z LDT i wszystko ok(przywilej 3).
W procesie są 2 wpisy LDT(od segmentu kodu i danych).
Problem pojawia się, gdy w LDT(danych) zmienię adres początku(Base), w tedy wszystko się psuje.
Wyglądałoby, że tak ma być, lecz ja w procesie nie odwołuję się do danych!

void test_ldt(){
  for(;;);
}

Gdy w LDT(kodu) ustawie adres eip, a samo zaś eip wyzeruje to działa dobrze - i tak ma być, lecz LDT(danych) musi być zawsze adresowany 0, bo inaczej różne błędy się dzieją w zależności gdzie jest adresowany.

Ustawienia w tss

//Index * 8 + 7
cs = 7;
es = 15;
ss = 15;
ds = 15;
fs = 15;
gs = 15;
0

A i jeszcz dodam takie coś.
W emulatorze bochs wywala mi takie coś(jak dam adres(LDT danych) na 1):

fetch_raw_descriptor: LDT: index (1b67)36c > limit (1f)
.....

Probowałem dla ds zrobić osobny wpis w LDT i dalej to samo.

0

Chyba znalazłem problem [!!!] [!!!] [!!!]
Nie wiem czy ja jestem taki tępy, czy zawsze mam pecha i coś przegapiam, a inni nie.
Wydaje mi się, że każdemu powinien taki błąd się stać [???]
Wyłączyłem przerwania żeby nagle jakiś niechciany kod mi nie wyskoczył, a następnie "ręcznie" skoczyłem do procesu. I odziwo nie było błędu. Wynika z tego, że jak jakiś proces sobie chodzi i nagle przychodzi przerwanie to w przerwaniu jest ustawiony ds z procesu. Jak wiadomo przerwanie zegarowe operuje na danych i stąd ten błąd.
Więc przy każdym przerwaniu muszę napisać, aby ładował się systemowy ds? Dziwne :|
Trochę mam teraz poprawiania kodu. Jak poprawie to się okaże czy to na pewno to.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0