problem z IDT i GDT




rafal1mi04.05.2007 12:00:38
#
Dołączył: 04.05.2007

Witam mam taki kod [c] int main(void) { print("hello", 3); disable_irq(0); sti(); for(;;) ; } [/c]

[c] static unsigned int cached_irq_mask = 0xffff;

define __byte(x,y) (((unsigned char *)&(y))[x])

define cached_21 (__byte(0,cached_irq_mask))

define cached_A1 (__byte(1,cached_irq_mask))

void disable_irq(unsigned int irq) { unsigned int mask = 1 << irq; cached_irq_mask |= mask; if (irq & 8) { outb(cached_A1,0xA1); } else { outb(cached_21,0x21); } } [/c]

a sam start = [asm] [BITS 32] EXTERN _main [SECTION .text]

GLOBAL _start _start: cli mov esp,kstack+4096 mov ax,0x10 mov ds,ax mov es,ax mov fs,ax mov gs,ax lgdt [gdt_descr] lidt [idt_descr] jmp .1 .1: push dword 0 push dword 0 push dword 0 push dword L6 EXTERN _main push dword _main L6: hlt

[SECTION .bss] kstack: resd 1024

[SECTION .data] gdt_descr: dw 256*8-1 dd _gdt

GLOBAL _gdt _gdt: dd 0,0 dd 0x0000FFFF,0x00CF9A00 dd 0x0000FFFF,0x00CF9200 dd 0,0 times 254 dd 0,0

idt_descr: dw 256*8-1 dd _idt

GLOBAL _idt _idt: times 256 dd 0,0 [/asm]

problem polega na tym ze mimo iz zablokowalem irq0 to maszyna sie resetuje, jak ustawialem przerwanie na cos to tak samo bylo.

bledy z bochsa

00003166057i[CPU0 ] WARNING: Encountered an unknown instruction (signalling illegal instruction) 00003166057e[CPU0 ] interrupt(): gate descriptor is not valid sys seg 00003166057e[CPU0 ] interrupt(): gate descriptor is not valid sys seg 00003166057i[CPU0 ] protected mode 00003166057i[CPU0 ] CS.d_b = 32 bit 00003166057i[CPU0 ] SS.d_b = 32 bit 00003166057i[CPU0 ] | EAX=000000ff EBX=00000000 ECX=00000008 EDX=000000a1 00003166057i[CPU0 ] | ESP=00010004 EBP=00000000 ESI=000088ca EDI=0000ffde 00003166057i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf ZF af PF cf 00003166057i[CPU0 ] | SEG selector base limit G D 00003166057i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00003166057i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 000fffff 1 1 00003166057i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 000fffff 1 1 00003166057i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 000fffff 1 1 00003166057i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 000fffff 1 1 00003166057i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 000fffff 1 1 00003166057i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 000fffff 1 1 00003166057i[CPU0 ] | EIP=04244c8b (04244c8b) 00003166057i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000 00003166057i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 00003166057i[CPU0 ] >> (invalid) : FFFF 00003166057e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting 00003166057i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called

Jak naprawic dziada ?

Nevar05.07.2007 01:20:09
#
Dołączył: 05.07.2007

00003166057i[CPU0 ] WARNING: Encountered an unknown instruction (signalling illegal instruction) 00003166057e[CPU0 ] interrupt(): gate descriptor is not valid sys seg 00003166057e[CPU0 ] interrupt(): gate descriptor is not valid sys seg

Błąd jest sygnalizowany w lini pierwszej. Prubowano wykonac instrukcje "nielegalnie". Może to oznaczać, że chodzi o instrukcje uprzywilejowaną którą chcesz wykonać z priv3 lub coś w tym stylu, ale nie jestem tego pewien.

W każdym razie następnie jest pruba obsłużenia wyjątku, a następnie wyjątku od wyjątku :P i za trzecim razem to już jest reset. Reset wynika z tego iż nie masz prawdopodobnie ustawionych wyjątków. A błąd generuje to co opisałem wyżej.

Najlepiej zapoznać się z możliwosciami debuggera w bochs, ale do tego trzeba znac assemblera.




Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?