kernel/system_call.c

Code:
  1. /*  
  2.     By Marcus Xing  
  3.     kernel/system_call.c  
  4.     各功能号的处理函数如下  
  5. */  
  6.   
  7. #include "type.h"   
  8. #include "const.h"   
  9. #include "ipc.h"   
  10. #include "protect.h"   
  11. #include "proc.h"   
  12. #include "console.h"   
  13. #include "tty.h"   
  14. #include "global.h"   
  15. #include "proto.h"   
  16.   
  17. /*-------------------------------------------------------------System_Call_Write  
  18.     RINT 0,系统调用1号功能函数  
  19. */  
  20. void System_Call_Write(int unused1,int unused2,const char *buf,PCB *pcb)   
  21. {   
  22.     /* 把调用Printf函数的进程绑定的控制台的指针取出来 */  
  23.     Console *con = &Console_Table[pcb->bind_tty];   
  24.        
  25.     /* 如果是Panic调用的或者是Assert调用的并且是系统进程调用的 */  
  26.     if((*buf == MAGIC_CHAR_PANIC) || (*buf == MAGIC_CHAR_ASSERT && Is_System_Proc[pcb - PCB_Table] == 1))   
  27.     {   
  28.         Disable_Int();                      /* 为了能hlt住系统,必须关掉中断 */  
  29.         char *v = (char*)VIDEO_START_ADDR;  /* 指向显存首地址 */  
  30.         char *m = (char*)buf + 1;           /* 略掉标记字符 */  
  31.            
  32.         /* 不超过显存则继续 */  
  33.         while((u32)v < VIDEO_START_ADDR + VIDEO_MEM_SIZE)   
  34.         {   
  35.             /* 如果串没结束,则打印之 */  
  36.             if(*m != '/0')   
  37.             {   
  38.                 *v++ = *m++;   
  39.                 *v++ = Make_Color(GREEN,BLACK);   
  40.             }   
  41.             else  
  42.             {   
  43.                 /* 结束了的话则把剩下的空间填为空,这样则使每隔10行打印一次 */  
  44.                 while((((u32)v - VIDEO_START_ADDR)  % (ROW_BYTE_NUM * 10)) != 0)   
  45.                 {   
  46.                     *v++ = ' ';   
  47.                     *v++ = Make_Color(WHITE,BLACK);   
  48.                 }   
  49.                 /* m重新指串的第2个字符 */  
  50.                 m = (char*)buf + 1;   
  51.             }   
  52.         }   
  53.            
  54.         __asm__ __volatile__("hlt");        /* 叫停系统 */  
  55.     }   
  56.        
  57.     /* 如果在用户进程调用Assert,则略过标志字符 */  
  58.     if(*buf == MAGIC_CHAR_ASSERT)   
  59.     {   
  60.         buf++;   
  61.     }          
  62.        
  63.     /* 取出解析好的串的每一个字符,交给Out_Char打印 */  
  64.     while(*buf != '/0')    
  65.     {   
  66.         Out_Char(con,*buf++);   
  67.     }   
  68. }   
  69.   
  70. /*------------------------------------------------------System_Call_Send_Receive  
  71.     RING 0,系统调用2号功能  
  72.     收发消息的大管家  
  73. */  
  74. void System_Call_Send_Receive(int function,int send_recev_pid,Message *m,PCB *caller)   
  75. {   
  76.     Assert((caller - PCB_Table) != send_recev_pid);     /* 收发进程不同为同一个 */  
  77.        
  78.     m->src_proc_pid = caller - PCB_Table;       /* 消息注明是谁收的或谁发的 */  
  79.        
  80.     /* 进行收发 */  
  81.     if(function == SEND)   
  82.     {   
  83.         MSG_Send(send_recev_pid,m,caller);   
  84.     }   
  85.     else if(function == RECEIVE)   
  86.     {   
  87.         MSG_Receive(send_recev_pid,m,caller);   
  88.     }   
  89.     else  
  90.     {   
  91.         Panic("SEND RECEIVE ERROR!");   
  92.     }   
  93. }   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值