• 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
92 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

+20 głosów
1 odpowiedź 406 wizyt
pytanie zadane 7 października 2017 w Nasze projekty przez Eryk Andrzejewski Mędrzec (155,160 p.)
–1 głos
1 odpowiedź 58 wizyt
pytanie zadane 15 kwietnia w Offtop przez CyberDevelop Gaduła (4,400 p.)
0 głosów
2 odpowiedzi 37 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

63,340 zapytań

109,599 odpowiedzi

228,959 komentarzy

44,170 pasjonatów

Przeglądających: 204
Pasjonatów: 7 Gości: 197

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.

...