proc.c

来自「参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发」· C语言 代码 · 共 123 行

C
123
字号
#include "include/proc.h"

PUBLIC void initProcStruct()
{
	t32 start;
	start=memAlloc(sizeof(PROCESS)*100);
	printk("start %d",start);
	mallocStructAlloc(STRUCT_PROCESS,sizeof(PROCESS),start,sizeof(PROCESS)*100);
	printk("kmalloc %d",kmalloc());

}

/*
	createProc:创建新的进程
	eip:新进程的入口地址
*/
PUBLIC t32 createProc(t32 eip)
{
	static pid=10;
	PROCESS *child,*father=usrProc;
	PROCESS *next=usrProc;
	child=(PROCESS *)kmalloc();
	memCopy(child,father,sizeof(PROCESS));
	/*新进程的入口点*/
	child->Regs.eip=eip;
	/*分配堆栈空间*/
	child->Regs.esp=memAlloc(1024);
	printk("stack %x",child->Regs.esp);
	child->Pid=pid++;
	child->state=READY;
	child->Priority=15;
	child->InitPriority=15;
	child->next=NULL;
	next=usrProc;
	/*将新进程链入用户进程链表*/
	while(next&&next->next)
		next=next->next;
	next->next=child;
	return pid;

}

/*
	exitProc
	eixtCode:进程退出代码
*/
PUBLIC void exitProc(t32 eixtCode)
{

}
/*
	Schedule:进程调度
*/
PUBLIC void Scheduler()
{
	 LockIrq();//关中断
	 PROCESS *next=NULL;
	 
	int i;
	int Temp=0;

again:
	next=usrProc;
	while(next)
	{
		if(next->state==READY&&next->Priority>Temp)
		{
			Temp=next->Priority;
			pCurrentProc=ReadyProc=next;
			
		}
		next=next->next;
	}
	if(Temp>0)
	{
		ReadyProc->Priority--;
		UnLock();
		return ;
	}
	next=usrProc;
	while(next)
	{
		next->Priority=next->InitPriority;
		next=next->next;
	}
goto again;
	UnLock();
 }

/*
  
	waitEvent:等待事件(比如按键按下,磁盘读数据)
	event:    事件类型
*/

PUBLIC void waitEvent(int event)
{
	ReadyProc->state=event;
	ChangeProcess();

}

/*
	wakeUpEvent:唤醒事件进程(比如按键按下,磁盘读数据)
	event:      事件类型

*/

PUBLIC void wakeUpEvent(int event)
{
//	LockIrq();//关中断
    PROCESS *next=NULL;
	next=usrProc;
	while(next)
	{
		if(next->state==event)
			next->state=READY;
		next=next->next;
	}
	Scheduler();
}

⌨️ 快捷键说明

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