[OSDev] VM86, DS jako segmenty 16Bit, przerwania

0

Witam.

Mam kilka pewnych problemów z moim systemem.
1)Problem polega na aplikacjach(TSS) gdzie programy 16bitowe(takie z dosa) operują często na segmentach cs, ds.

push cs
pop ds

Domyślnie ustawiam tablice LDT(a w cs i ds ustawiam index*8+7).
Jak to wszystko ze sobą „połączyć”(aby program „widział” ds jako segment i mógł sobie go modyfikować)?
2) Przy aplikacjach niekorzystających z LDT wszystko działa(chodzi mi o przerwania mojego systemu np. 0x80), lecz gdy korzystam z LDT to kapa. Nie działa :/
Gdzieś przeleciało mi przed oczami że istnieją tablice przerwań ale lokalnych. O co chodzi?
3) Chyba najtrudniejsze.... Chodzi o tryb wirtualny. Gdzieś wyczytałem i z tego opisu próbuje użyć tych przerwań biosa. Tworze proces(TSS) 16bitowy i uruchamiam go. Kodem jest np. ... int 10h ...
Normalnie wykonuje się przerwanie mojego systemu, ale w opisie pisało żeby zmienić tylko flagi procesu, lecz kapa. Jak to zrobić?

0

Kombinuje cały czas z tym VM86 :/
Uruchomiłem taką instrukcję 0xEB 0xFE - czyli nieskonczona petla.
W emulatorze Bochs wyświetliło mi się:

00069079000i[CPU0 ] v8086 mode
00069079000i[CPU0 ] CS.d_b = 16 bit
00069079000i[CPU0 ] SS.d_b = 16 bit
00069079000i[CPU0 ] | EAX=00000000  EBX=00000000  ECX=00000000  EDX=00000000
00069079000i[CPU0 ] | ESP=00000900  EBP=00000900  ESI=00000000  EDI=00000000
00069079000i[CPU0 ] | IOPL=3 NV UP EI PL NZ NA PO NC
00069079000i[CPU0 ] | SEG selector     base    limit G D
00069079000i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00069079000i[CPU0 ] |  CS:0000( 0001| 0|  3) 00000000 0000ffff 0 0
00069079000i[CPU0 ] |  DS:0000( 0000| 0|  3) 00000000 0000ffff 0 0
00069079000i[CPU0 ] |  SS:0000( 0002| 0|  3) 00000000 0000ffff 0 0
00069079000i[CPU0 ] |  ES:0000( 0000| 0|  3) 00000000 0000ffff 0 0
00069079000i[CPU0 ] |  FS:0010( 0000| 0|  3) 00000100 0000ffff 0 0
00069079000i[CPU0 ] |  GS:0010( 0000| 0|  3) 00000100 0000ffff 0 0
00069079000i[CPU0 ] | EIP=00007000 (00007000)
00069079000i[CPU0 ] | CR0=0x00000019 CR1=0 CR2=0x00000000
00069079000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000

Czyli nareszcie mam upragniony tryb(jak widać na razie wyłączyłem stronnicowanie).
Przy próbie przerwania, np int 0x10 wywala mi błąd:
exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
Pewnie jakiegoś drobiazgu mi brakuje [glowa] Proszę o pomoc [!!!]

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