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!");
}
}
/*
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!");
}
}
相关文章推荐
- Adding a New System Call into the Linux Kernel 2.6
- linux新增system call(for kernel 2.6)
- kernel/system_call.asm
- kernel/system_call.asm
- Add a system call to the linux kernel in Ubuntu
- Android 中用内核模块实现系统调用(Implement system call by kernel module in Android)
- 方便查看 linux/kernel/system_call.s
- linux新增system call(for kernel 2.6)
- Linux Systemcall By INT 0x80、Llinux Kernel Debug Based On Sourcecode
- project 1 Adding a System Call to the Linux Kernel(初版)
- How Linux kernel handles the send system call
- Implement a System Call in Kernel 3.10.56 (X86_64)
- kernel/system_call.c
- ZZ: linux新增system call(for kernel 2.6)
- [Fw]How to Add a System Call(Fedora Core 6 Kernel : 2.6.18)
- add a system call in linux kernel
- 分享一个图:Linux kernel System Call Interface and glibc
- systemtap dump kernel function call stack and print function parameters
- Linux系统内核分析实验——system_call中断处理过程