Code: Select all
#define ACS_TSS_GATE 0x09
#define stack_size 1024
#define max_tasks 1
unsigned char task_stack[stack_size];
task();
typedef struct {
unsigned long link,
esp0,
ss0,
esp1,
ss1,
esp2,
ss2,
cr3,
eip,
eflags,
eax,
ecx,
edx,
ebx,
esp,
ebp,
esi,
edi,
es,
cs,
ss,
ds,
fs,
gs,
ldtr;
unsigned int trace,
io_map_addr;
} TSS;
initialize_tasks()
{
TSS tss[max_tasks];
/* number base limit type granularity */
gdt_set_gate(3 , tss[0], sizeof(TSS), ACS_TSS_GATE, 0xCF); /*selector is 0x18*/
gdt_flush();
__asm__ __volatile__("lidt 0x0 \n\t");
tss[0].trace = 0;
tss[0].io_map_addr = sizeof(TSS);
tss[0].ldtr = 0;
tss[0].fs = 0;
tss[0].ds = tss[0].es = tss[0].ss = 0x10;
tss[0].esp = (unsigned int)&task_stack+stack_size;
tss[0].cs = 0x10;
tss[0].eip = (unsigned int)&task;
tss[0].eflags = 0x202L;
__asm__ __volatile__("ltr 0x18 ");
}
task()
{
puts("i am task one!!!\n");
for(;;);
}
Code: Select all
void main()
{
gdt_install();
idt_install();
isrs_install();
irq_install();
keyboard_install();
__asm__ __volatile__ ("sti");
cls();
puts("Hello World!\n");
initialize_tasks();
for (;;);
}