kernel.asm
Code: Select all
[BITS 32]
[global start]
[extern _k_main] ;this is in kernel.c
start:
call _k_main
sti ;this causes trouble, a large number of interrupt trigger
hlt
Code: Select all
[GLOBAL _idt_flush]
[GLOBAL _isr_handler]
[extern _isr_c_handler]
_idt_flush:
mov eax, [esp+4]
lidt [eax]
ret
_isr_handler:
pusha
push gs
push fs
push es
push ds
call _isr_c_handler ; Call the C interrupt handler
pop ds
pop es
pop fs
pop gs
popa
iret
Code: Select all
typedef unsigned int u32int;
typedef int s32int;
typedef unsigned short u16int;
typedef short s16int;
typedef unsigned char u8int;
typedef char s8int;
void k_clear_screen();
void putchar(char c);
int cursor_pos = 0;
extern void isr_handler();
void putchar(char c) {
char *vidmem = (char *) 0xb8000;
vidmem[2*cursor_pos + 1] = 0x07;
vidmem[2* (cursor_pos ++)] = c;
}
struct idt_entry_struct
{
u16int base_lo;
u16int sel;
u8int always0;
u8int flags;
u16int base_hi;
} __attribute__((packed));
typedef struct idt_entry_struct idt_entry_t;
struct idt_ptr_struct
{
u16int limit;
u32int base;
} __attribute__((packed));
typedef struct idt_ptr_struct idt_ptr_t;
idt_entry_t idt_entries[256];
idt_ptr_t idt_ptr;
static void idt_set_gate(u8int num, u32int base, u16int sel, u8int flags)
{
idt_entries[num].base_lo = base & 0xFFFF;
idt_entries[num].base_hi = (base >> 16) & 0xFFFF;
idt_entries[num].sel = sel;
idt_entries[num].always0 = 0;
idt_entries[num].flags = flags /* | 0x60 */;
}
static void init_idt()
{
int i;
idt_ptr.limit = sizeof(idt_entry_t) * 256 -1;
idt_ptr.base = (u32int)&idt_entries;
for(i = 0; i < 32 ; i++)
idt_set_gate(i, (u32int)isr_handler , 0x08, 0x8E);
idt_flush((u32int)&idt_ptr);
}
void isr_c_handler()
{
putchar('a');
}
k_main()
{
k_clear_screen();
init_idt();
};
void k_clear_screen()
{
char *vidmem = (char *) 0xb8000;
unsigned int i = 0;
while (i < (80* 25* 2 ) ) {
vidmem[i] = ' ';
i++;
vidmem[i] = 0x07;
i++;
};
};