您的位置:首页 > 其它

kernel/system_call.c

2010-03-30 15:47 295 查看
Code:

/*

By Marcus Xing

kernel/system_call.c

各功能号的处理函数如下

*/



#include "type.h"

#include "const.h"

#include "ipc.h"

#include "protect.h"

#include "proc.h"

#include "console.h"

#include "tty.h"

#include "global.h"

#include "proto.h"



/*-------------------------------------------------------------System_Call_Write

RINT 0,系统调用1号功能函数

*/

void System_Call_Write(int unused1,int unused2,const char *buf,PCB *pcb)

{

/* 把调用Printf函数的进程绑定的控制台的指针取出来 */

Console *con = &Console_Table[pcb->bind_tty];



/* 如果是Panic调用的或者是Assert调用的并且是系统进程调用的 */

if((*buf == MAGIC_CHAR_PANIC) || (*buf == MAGIC_CHAR_ASSERT && Is_System_Proc[pcb - PCB_Table] == 1))

{

Disable_Int(); /* 为了能hlt住系统,必须关掉中断 */

char *v = (char*)VIDEO_START_ADDR; /* 指向显存首地址 */

char *m = (char*)buf + 1; /* 略掉标记字符 */



/* 不超过显存则继续 */

while((u32)v < VIDEO_START_ADDR + VIDEO_MEM_SIZE)

{

/* 如果串没结束,则打印之 */

if(*m != '/0')

{

*v++ = *m++;

*v++ = Make_Color(GREEN,BLACK);

}

else

{

/* 结束了的话则把剩下的空间填为空,这样则使每隔10行打印一次 */

while((((u32)v - VIDEO_START_ADDR) % (ROW_BYTE_NUM * 10)) != 0)

{

*v++ = ' ';

*v++ = Make_Color(WHITE,BLACK);

}

/* m重新指串的第2个字符 */

m = (char*)buf + 1;

}

}



__asm__ __volatile__("hlt"); /* 叫停系统 */

}



/* 如果在用户进程调用Assert,则略过标志字符 */

if(*buf == MAGIC_CHAR_ASSERT)

{

buf++;

}



/* 取出解析好的串的每一个字符,交给Out_Char打印 */

while(*buf != '/0')

{

Out_Char(con,*buf++);

}

}



/*------------------------------------------------------System_Call_Send_Receive

RING 0,系统调用2号功能

收发消息的大管家

*/

void System_Call_Send_Receive(int function,int send_recev_pid,Message *m,PCB *caller)

{

Assert((caller - PCB_Table) != send_recev_pid); /* 收发进程不同为同一个 */



m->src_proc_pid = caller - PCB_Table; /* 消息注明是谁收的或谁发的 */



/* 进行收发 */

if(function == SEND)

{

MSG_Send(send_recev_pid,m,caller);

}

else if(function == RECEIVE)

{

MSG_Receive(send_recev_pid,m,caller);

}

else

{

Panic("SEND RECEIVE ERROR!");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: