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

📄 main.c~

📁 参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发
💻 C~
字号:
#include "include/main.h"
//主函数,初始化各个内核任务
 void Main()
{

        PROCESS    *pProc;
	PROCESS    *next;
	t_8			Priority=15;
	t_16        SelectorLDT=SELECTOR_LDT_FIRST;
	t_8         privilege;
	t_8         rpl;
	int			eflags;
    	int i;
	printk("***************main***********************\n");
	/*初始化内存管理*/
	//initMem();
	/*初始化进程结构体分配器*/
	initProcStruct();
	//ideInit();
	//initFS();
	initTTY();
	initClock();
	SetIrqHandler(0,ClockHandler);
	SetIrqHandler(1,keyboardHandler);
	SetIrqHandler(14,harddiskHandler);	
	pProc=(PROCESS *)kmalloc();
	privilege   = PRIVILEGE_USER;
	rpl         = RPL_USER;
	eflags		= 0x202;
	pProc->state= READY;
	pProc->TTYNum=1;
	pProc->InitPriority=pProc->Priority=15;
	pProc->Pid=2;//进程ID
	pProc->LDTSelector=SelectorLDT;//局部描述符选择子
	//复制GDT中的代码段和数据段到LDT中
	MemoryCopy(&pProc->LDT[0],&gdt[SELECTOR_FLAT_C>>3],sizeof(DESCRIPTOR));
	pProc->LDT[0].Attribute1=DA_C|privilege<<5;
	MemoryCopy(&pProc->LDT[1],&gdt[SELECTOR_FLAT_RW>>3],sizeof(DESCRIPTOR));
	pProc->LDT[1].Attribute1=DA_DRW|privilege<<5;
	//设置各个段寄存器选择子和属性
	pProc->Regs.cs=((8*0)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
	pProc->Regs.ds=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
	pProc->Regs.es=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
	pProc->Regs.fs=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;	
	pProc->Regs.ss=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
	pProc->Regs.gs=(SELECTOR_VIDEO&SA_RPL_MASK)|rpl;
	pProc->Regs.eip=(t_32)TestB;//任务入口点
	pProc->Regs.esp =(t_32)memAlloc(1024);;//任务堆栈
	pProc->Regs.eflags=eflags;//标志位
	pProc->ReturnValue=0;
	//设置GDT中的LDT段
	SetDescriptor(&gdt[  SelectorLDT>>3],vir2phys(Seg2Phys(SELECTOR_FLAT_RW),pProc->LDT),
	LDT_SIZE*sizeof(DESCRIPTOR),DA_LDT);
    	pProc->next=NULL;
	pCurrentProc=NULL;	/*TINIX 	for(i=0;i<NR_TASKS+NR_PROCS;i++){
		if (i < NR_TASKS) {	// 任务 
			p_task		= task_table + i;
			privilege	= PRIVILEGE_TASK;
			rpl		= RPL_TASK;
			eflags		= 0x1202;	// IF=1, IOPL=1, bit 2 is always 1 
		}
		else {			// 用户进程 
			p_task		= user_proc_table + (i - NR_TASKS);
			privilege	= PRIVILEGE_USER;
			rpl		= RPL_USER;
			eflags		= 0x202;	// IF=1, bit 2 is always 1 
		}

		strcpy(p_proc->name, p_task->name);	//name of the process 
		p_proc->pid	= i;			//pid 

		p_proc->ldt_sel	= selector_ldt;
		memcpy(&p_proc->ldts[0], &gdt[SELECTOR_KERNEL_CS >> 3], sizeof(DESCRIPTOR));
		p_proc->ldts[0].attr1 = DA_C | privilege << 5;	/change the DPL 
		memcpy(&p_proc->ldts[1], &gdt[SELECTOR_KERNEL_DS >> 3], sizeof(DESCRIPTOR));
		p_proc->ldts[1].attr1 = DA_DRW | privilege << 5;//change the DPL 
		p_proc->regs.cs		= ((8 * 0) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
		p_proc->regs.ds		= ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
		p_proc->regs.es		= ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
		p_proc->regs.fs		= ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
		p_proc->regs.ss		= ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
		p_proc->regs.gs		= (SELECTOR_KERNEL_GS & SA_RPL_MASK) | rpl;
		p_proc->regs.eip	= (t_32)p_task->initial_eip;
		p_proc->regs.esp	= (t_32)p_task_stack;
		p_proc->regs.eflags	= eflags;

		p_proc->nr_tty		= 0;

		p_task_stack -= p_task->stacksize;
		p_proc++;
		p_task++;
		selector_ldt += 1 << 3;
	}	for(i=0;i<NR_TASKS+NR_PROCS;i++){
		init_descriptor(&gdt[selector_ldt>>3],
				vir2phys(seg2phys(SELECTOR_KERNEL_DS), proc_table[i].ldts),
				LDT_SIZE * sizeof(DESCRIPTOR) - 1,
				DA_LDT);
		p_proc++;
		selector_ldt += 1 << 3;
	}	*/
	ReadyProc=next=usrProc=pProc;
	EnableIrq(0);
	EnableIrq(1);
	EnableIrq(14);
	createProc((t_32)TestC);
	createProc((t_32)TestD);
	ReStart();//启动任务
    while(1){}

}void TestD()
{
	while(1)
	{	
		Delay(1);
		printk("d");
	}
}
void TestA()
{
	while(1)
	{	
		Delay(1);
		printk("A");
	}
}
void TestC()
{
	while(1)
	{
	//	Delay(1);
		getchar();
		printk("C");
	}
}
void TestB()
{	
	while(1)
	{
		Delay(1);
		printk("e");
	}
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -