⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 start.c

📁 一个简单的操作系统,用的是nasm写的,包括进程调度,中断处理
💻 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 + -