📄 start.c
字号:
#include "typedef.h"
#include "protect.h"
#include "const.h"
#define GDTEntNumber 5
#define IDTEntNumber 100
t_8 GDTPtr[6];
t_8 IDTPtr[6];
void PM_DispStr(void *);
void PM_DispInt(int i);
void memCopy(void *des,void* src,int length);
void init_8259a();
void init_port(t_32 port,t_32 val);
void init_int(); //初始化中断
void init_idt_desc(t_8 vector,t_8 type,intProcess handle,t_8 privelege);
void softInt();
void outerInt();
struct GDTDescriptor gdt[GDTEntNumber];
struct IGate idt[IDTEntNumber];
void cstart()
{
t_16 *gdtPtrLimit=(t_16 *)GDTPtr;
t_32 *gdtPtrBaseAddr=(t_32 *)GDTPtr+2;
PM_DispInt(sizeof(struct IGate));
memCopy((void *)gdt,(void *)(*(GDTPtr+2)), GDTEntNumber*sizeof(struct GDTDescriptor));
*gdtPtrLimit=GDTEntNumber*sizeof(struct GDTDescriptor)-1;
*gdtPtrBaseAddr=(t_32)gdt;
char str[20]="gdt moved!";
str[10]=160;
str[11]=0;
PM_DispStr((void *)str);
init_int();
t_16 *limit=IDTPtr;
t_32 *base=IDTPtr+2;
*limit=IDTEntNumber*sizeof(struct IGate)-1;
*base=(t_32)idt;
}
void init_8259a()
{
init_port(PORT20_M_8259A,0x11);//initialize master icw1
init_port(PORTA0_S_8259A, 0x11);//initialize slave icw1
init_port(PORT21_M_8259A, 0x20);//initialize master icw2
init_port(PORTA1_s_8259A, 0x28);//initialize slave icw2
init_port(PORT21_M_8259A,0x4);//initialize master icw3
init_port(PORTA1_s_8259A,0x2);//initialize slave icw3
init_port(PORT21_M_8259A,0x1);//initialize master icw4
init_port(PORTA1_s_8259A, 0x1);//initialize master icw4
init_port(PORT21_M_8259A,0xFD); // Master 8259, OCW1.
init_port(PORTA1_s_8259A, 0xFF); // Slave 8259, OCW1.
}
void init_int()
{
init_8259a();
init_idt_desc(INT_VECTOR_BOUNDS,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_BREAKPOINT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_COPROC_ERR,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_COPROC_NOT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_COPROC_SEG,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_DEBUG,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_DIVIDE,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_DOUBLE_FAULT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_INVAL_OP,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_INVAL_TSS,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_NMI,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_OVERFLOW,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_PAGE_FAULT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_PAGE_FAULT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_PROTECTION,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_SEG_NOT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_STACK_FAULT,DA_386IGate,softInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+1,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+2,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+3,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+4,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+5,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+6,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ0+7,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+1,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+2,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+3,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+4,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+5,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+6,DA_386IGate,outerInt,PRIVILEGE_KRNL);
init_idt_desc(INT_VECTOR_IRQ8+7,DA_386IGate,outerInt,PRIVILEGE_KRNL);
}
void outerInt() //0x3095f
{
char str1[20];
str1[0]=0xa0;
str1[1]=0;
PM_DispStr((void *)str1);
char str[20]="outer inturrupt!";
str[17]=160;
str[18]=0;
PM_DispStr((void *)str);
}
void init_idt_desc(t_8 vector, t_8 type, intProcess handle, t_8 privelege)
{
struct IGate * pGate=&idt[vector];
pGate->dcount=0;
t_32 offset=(t_32)handle;
pGate->offset_low16=offset & 0xffff;
pGate->offset_high16=(offset >> 16) & 0xffff;
pGate->selector=SELECTOR_KERNEL_CS;
pGate->type=type | ((privelege << 5) & 0x60);
}
void memCopy(void *des,void *src,int length)
{
t_8 * s_dec=(t_8 *)des;
t_8 * s_src=(t_8 *)src;
int i=0;
for(;i<length;i++)
*(s_dec++)=*(s_src++);
}
void softInt() //0x30a80
{
char str1[20];
str1[0]=0xa0;
str1[1]=0;
PM_DispStr((void *)str1);
char str[20]="soft inturrupt!";
str[16]=160;
str[17]=0;
PM_DispStr((void *)str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -