TSS Descriptor points to invalid TSS

0

Przy takim kodzie:

	mov ax, gdt_tss_selector           ; Jakiś selektor do TSS Deskryptora
	ltr ax
	jmp 28h:0             ; Skacz przez Task Gate

gdt_tss_selector equ 20h
 
                                           ; To tylko wycinek z mojej GDT
gdt_tss_system:
	dw kerntss_size
	dw kerntss
	db 0
	db 10001001b
	db 00000000b
	db 0

gdt_taskswitch:
	dw 0
	dw gdt_tss_selector
	db 0
	db 10000101b
	dw 0 


kernel_task:
	
	jmp kernel_task
kerntss:

dw 0 		; BACKLINK
dw 0		; RESERVED
dd 2c00h	; PL0 Stack
dw 10h		; PL0 SS
dw 0h		; RESERVED

dd 2c00h	; PL1 Stack
dw 10h		; PL1 SS
dw 0h		; RESERVED

dd 2c00h	; PL2 Stack
dw 10h		; PL2 SS
dw 0h		; RESERVED

dd 0		; CR3

dd kernel_task	; EIP
dd 512		; EFLAGS
dd 0		; EAX
dd 0		; ECX
dd 0		; EDX
dd 0		; EBX
dd 9FFFFh	; ESP	
dd 0		; EBP
dd 0		; ESI
dd 0		; EDI
dw 10h		; ES
dw 0		; RESERVED
dw 08h		; CS
dw 0		; RESERVED
dw 10h		; SS
dw 0		; RESERVED
dw 10h		; DS
dw 0		; RESERVED
dw 10h		; FS
dw 0		; RESERVED
dw 10h		; GS
dw 0		; RESERVED
dw 00000000b	; LDT
dw 0		; RESERVED
dd 0FFFFh	; Pointer to IO Bitmap


kerntssend:

kerntss_size equ kerntssend - kerntss - 1

Przy JMPie do Task Gate wyskakuje mi TSS Descriptor points to invalid TSS. Co mam źle?

0

Polecam zainteresowanie sie programowym przelaczaniem kontektow, nie jest trudny, duzo tutoriali jest a szybszy i bardziej elastyczny.

0

Taki mam właśnie w planach tylko mój kernel właśnie przełącza się po załadowaniu pliku do konsoli(od razu z Ring0 kernela do Ring3 konsoli)

/* dopisane */
I jakby co to system korzysta z flat addressing

0

Jesli koniecznie chcesz sie przelaczyc do usermode (u mnie robi to scheduler) to mozesz zrobic cos takiego:

move_to_user_mode:
  mov eax, esp
  push (8*4)|3 ;selektor z segmentem danych z dpl3 (dla ss)
  push eax ;esp
  pushf ;flagi
  push (8*3)|3 ;selektor z segmentem danych z dpl3
  push user_mode ;eip
  iret
  ;iret tutaj sciagnie reszte ze stosu ktora wrzucilismy bo przechodzimy do innego dpla
  user_mode:
  mov ax, (8*4)|3 ;pozostale segmenty z dpl3
  mov ds, ax
  mov es, ax
  mov fs, ax
  mov gs, ax
  ret
0

Moim zdaniem jest tu błąd:
ltr - ładujesz nową wartość Task Register. TR wskazuje na blok pamięci w której będzie zapisany aktualny stan rejestrów itp. jeżeli nastąpi przełączenie. Potem przełączasz właśnie na zadanie którego TSS jest w tm samym miejscu gdzie ma zapisać aktualny stan.

Tak mi sie zdaje :]

0

I teoretycznie procesor powinien poładować ten TSS jakimiś wartościami, którymi się naprawdę nie interesuje bo i tak zaraz załaduję jakiś proces. Błąd mi wyskakuje przy JMP'ie, ale zostawie na razie tego TSS'a bo może uda mi sie znaleźć inny sposób na tego switcha(jeśli inny nie istnieje to powiedzcie dobrzy ludzie)

0

Ale powiedz o jakiego switcha ci chodzi, jak do ring3 to dalem ci kod, jak do aplikacji to najlepiej pobaw sie zamiana stosow na ring0 albo wyszperaj na http://www.netsoft.devtown.net/draco/ jakis link lub poczytaj http://www.acm.uiuc.edu/sigops/roll_your_own/ jesli koniecznie chcesz TSSy. A jesli chcesz sie do jakiegos projektu dolaczyc to zagadaj na priv :P

0

Nie jestem pewien, ale wydaje mi się że gdy wykonujesz ltr to procesor ustawia flage task_budy (czy jakoś tak), i nie możesz go niego skoczyć, bo wywoła wyjątek.

/* dopisane do postu niżej */
ja się z TSS'ami męczyłem kilka miesięcy :d ,ale juz wszystko działa :D

0

OK. Chodzi mi o skoki które nadają się do schedulera. CZYLI - Zamiana privilenge leveli od razu ze stosem.

/* dopisane */

Wolverine, wydaje mi się że twój system korzysta z TSS. U mnie ten iret "na czysto" nie działał, więc raczej od TSS'ów(albo chociażby jednego TSS'a) nie zwieję

/* dopisane */

OK, już działa. Ten ltr rzeczywiście ustawiał busy bit.

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