• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed OsDev, IDT (Interrupt Descriptor Table)

0 głosów
108 wizyt
pytanie zadane 29 lipca 2018 w C i C++ przez Mateusz1223 Użytkownik (990 p.)
zamknięte 30 lipca 2018 przez Mateusz1223

Witam! Tworzę swojego amatorskiego OS'a i natrafiłem na problem z IDT (Interrupt Descriptor Table). Po załadowaniu IDT specjalnie dzielę przez 0 aby poleciało przerwanie. Niestety w zamian leci triple fault. OS'a uruchamiam na bochs. System jest 32 bitowy.

Oto kod:

kernel.c

#include "kernel.h"

void _start(void)
{
	term = New_TerminalB8000();
	T_Clear(term);
	idt_init();
	
	int a = 5;
	int b = 0;
	T_Print(term, "%d", a/b);
		
	for(;;);
}

idt.h

#pragma once
#include "common.h"
#include "int_handlers.h"
#include "terminal.h"
#include "kernel.h"

struct IDTEntry
{
   uint16_t offset_0_15; // offset bits 0..15
   uint16_t selector; // a code segment selector in GDT or LDT
   uint8_t zero;      // unused, set to 0
   uint8_t flags; // type and attributes, see below
   uint16_t offset_16_31; // offset bits 16..31
}__attribute__((packed));

struct IDTR
{
	uint16_t limit;
	uint32_t base;
}__attribute__((packed));

typedef struct IDTEntry IDTEntry;
typedef struct IDTR IDTR;

void idt_init();

idt.c

#include "idt.h"

#define SETIDTDESCR(d, offset) { \
	d.offset_0_15 = ((uint32_t)offset & 0xffff); \
	d.selector = 0x8; \
	d.zero = 0; \
	d.flags = 0x8E; \
	d.offset_16_31 = (((uint32_t)offset >> 16) & 0xffff); \
}

IDTEntry IDT[256];

void idt_init()
{
	for(int i=0; i<=32; i++)
		SETIDTDESCR(IDT[i], interrupt_handler);
	
	IDTR ptr = {
		(uint16_t)((256 * 8) - 1),
		(uint32_t)IDT
	};
	
	__asm("lidt [0]" : : "m"(ptr));
}

int_handlers.h

#pragma once
#include "common.h"
#include "kernel.h"

void interrupt_handler();

int_handlers.c

#include "int_handlers.h"

void interrupt_handler()
{
    T_Print(term, "Interrupt");
    for(;;);
}

Z góry dziękuję za pomoc!smiley

Zamykam już to zapytanie, ponieważ dostałem odpowiedź na innym forum. Zainteresowanych odsyłam pod link https://forum.osdev.org/viewtopic.php?f=1&t=33091&p=285039#p285039.

komentarz zamknięcia: Dostałem odpowiedź na innym forum

Podobne pytania

+21 głosów
1 odpowiedź 423 wizyt
pytanie zadane 7 października 2017 w Nasze projekty przez Eryk Andrzejewski Mędrzec (159,500 p.)
–1 głos
1 odpowiedź 64 wizyt
pytanie zadane 15 kwietnia w Offtop przez CyberDevelop Gaduła (4,450 p.)
0 głosów
2 odpowiedzi 49 wizyt
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

65,683 zapytań

112,321 odpowiedzi

237,045 komentarzy

46,657 pasjonatów

Przeglądających: 214
Pasjonatów: 7 Gości: 207

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...