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

📄 syscall.c

📁 一个完整的GUI界面OS,单盘启动 实现了多线程、FAT32文件读写
💻 C
字号:
//-----------------------------------------------------------------------------------------------------------------------
//          Kernel SysCall For FireXOS  1.10 
//
//          Version  1.10
//
//          Create by  xiaofan                                   2004.9.20
//
//          Update by xiaofan                                    2004.9.20
//------------------------------------------------------------------------------------------------------------------------

#include "Syscall.h"
#include "Console.h"
#include "VMalloc.h"
#include "Process.h"
#include "Traps.h"
#include "Fs.h"
#include "GUI.h"
#include "MsDos.h"
#include "Schedule.h"
#include "PageAlloc.h"
#include "String.h"
#include "Mouse.h"
#include "PageAlloc.h"

typedef unsigned long (*syscall_fuc)(regs_t);

//----------------------------------------------------------------------------------------------////  空系统调用////----------------------------------------------------------------------------------------------
unsigned long sys_nosys(regs_t reg)
{
  return 0;
}

//----------------------------------------------------------------------------------------------////  系统调用 显示OS信息////----------------------------------------------------------------------------------------------
unsigned long sys_info (regs_t reg)
{
	ConsolePrintf("OS System Infomation \n");
	return 0;
}

//----------------------------------------------------------------------------------------------////  系统调用 获取当前进程号////----------------------------------------------------------------------------------------------
unsigned long sys_get_cur_instance(regs_t reg)
{
	reg.eax=ProcCurrent->pid;
	return reg.eax;
}

//--------------------------------------------------------------------------------------//// 系统调用 Fork////--------------------------------------------------------------------------------------
unsigned long sys_fork(regs_t reg)
{
	int procEntry;

	procEntry = GetProcessEntry();	

	if(procEntry < 0)		return procEntry;
	reg.eax=DoProcessClone(procEntry, &reg);
	return reg.eax;
}

//----------------------------------------------------------------------------------------------////  系统调用 核心内存分配////----------------------------------------------------------------------------------------------
unsigned long sys_malloc(regs_t reg)
{
  unsigned long size=reg.ebx;
	reg.eax=VMalloc(size);
	//ConsoleMsg("VMalloc a Mem Addr %08x Size %08x\n",reg.eax,size);
	return reg.eax;
}


//----------------------------------------------------------------------------------------------////  系统调用 核心内存释放////----------------------------------------------------------------------------------------------
unsigned long sys_free(regs_t reg)
{
	unsigned long base=reg.ebx;
	unsigned long size=reg.ecx;
	VFree(base,size);
	//ConsoleMsg("Free a Mem Addr %08x Size%08x\n",reg.ebx,size);
	return 0;
}


//----------------------------------------------------------------------------------------------////  系统调用 获取物理内存页面信息////----------------------------------------------------------------------------------------------
unsigned long sys_page_info(regs_t reg)
{
	int* pTotalPage=(int*)reg.ebx;
	int* pFreePage= (int*)reg.ecx;

	*pTotalPage=(int)PAGING_PAGES;
	*pFreePage =PageManagerScan();

	return 0;
}


//----------------------------------------------------------------------------------------------////  系统调用 获取虚拟内存空洞信息////----------------------------------------------------------------------------------------------
unsigned long sys_mem_hole_info(regs_t reg)
{
	unsigned long* pHoleSize= (unsigned long*)reg.ebx;
	unsigned long* pHoleNum = (unsigned long*)reg.ecx;

	unsigned long  size,num;

	VMemScan(&size,&num);

	*pHoleSize=size;
	*pHoleNum =num;

	return 0;
}

//----------------------------------------------------------------------------------------------////  系统调用 注册窗口////----------------------------------------------------------------------------------------------
unsigned long sys_register_win(regs_t reg)
{
	WINSTRUCT* pWin;

	unsigned long  pid=ProcCurrent->pid;

	pWin=(WINSTRUCT*)reg.ebx;
	pWin->hWnd+=(pid<<16);

	AddWinSoltToArray(pWin);
  
	//ConsolePrintf("Register a win hWnd = %08x",pWin->hWnd);
	reg.eax=pWin->hWnd;
	return reg.eax;
}

//----------------------------------------------------------------------------------------------////  系统调用 获取DC////----------------------------------------------------------------------------------------------
unsigned long sys_get_dc(regs_t reg)
{
	HDC      hdc;
	HWND     hWnd=reg.ebx;
	hdc=GetDC(hWnd);

	reg.eax=(unsigned long)hdc;
	return reg.eax;

}


//----------------------------------------------------------------------------------------------////  系统调用 设定窗体位置////----------------------------------------------------------------------------------------------
unsigned long sys_set_win_pos(regs_t reg)
{
	HWND     hWnd=reg.ebx;
	POINT*   pt;
  int      x,y;

	pt=(POINT*)reg.ecx;

	x=pt->x;
	y=pt->y;
  
	reg.eax=SetWndPos(hWnd,x,y);
	return reg.eax;
}



//----------------------------------------------------------------------------------------------////  系统调用 设定窗体大小////----------------------------------------------------------------------------------------------
unsigned long sys_set_win_size(regs_t reg)
{

	HWND     hWnd=reg.ebx;
  int      w,h;

	w=reg.ecx;
	h=reg.edx;

	reg.eax=SetWndSize(hWnd,w,h);
	return reg.eax;
}


//----------------------------------------------------------------------------------------------////  系统调用 获得窗体大小////----------------------------------------------------------------------------------------------
unsigned long sys_get_win_rect(regs_t reg)
{
	HWND     hWnd=reg.ebx;
	RECT     rc;
	RECT*    pRect;

	pRect=(RECT*)(reg.ecx);

	rc=GetWinRect(hWnd);

	memcpy(pRect,&rc,sizeof(RECT));

	reg.eax=0;
	return reg.eax;

}


//----------------------------------------------------------------------------------------------////  系统调用 设置指定窗体以下所有窗体的剪裁域////----------------------------------------------------------------------------------------------
unsigned long sys_set_below_cliprgn(regs_t reg)
{
	HWND     hWnd=reg.ebx;

	SetBelowClipRgn(hWnd);

	return 1;
}

//----------------------------------------------------------------------------------------------////  系统调用 设置指定窗体以上所有窗体的剪裁域////----------------------------------------------------------------------------------------------
unsigned long sys_set_above_cliprgn(regs_t reg)
{
	HWND     hWnd=reg.ebx;

	SetAboveClipRgn(hWnd);

	return 1;
}

//----------------------------------------------------------------------------------------------////  系统调用 设置指定窗体以下所有窗体的刷新域////----------------------------------------------------------------------------------------------
unsigned long sys_set_below_invrgn(regs_t reg)
{
	HWND     hWnd=reg.ebx;
	RECT     rc;
	RECT*    pRect;

	pRect=(RECT*)(reg.ecx);

	memcpy(&rc,pRect,sizeof(RECT));
	
	SetBelowInvalidRng(hWnd,rc);

	return 1;

}

//----------------------------------------------------------------------------------------------////  系统调用打开文件////----------------------------------------------------------------------------------------------
unsigned long sys_fileopen(regs_t reg)
{
	FILE* fp=NULL;
	unsigned char* filename=(unsigned char*)reg.ebx;
	fp=Fat32_OpenFile(filename);
	reg.eax=(unsigned long)fp;
	return reg.eax;
}

//----------------------------------------------------------------------------------------------////  系统调用读文件////----------------------------------------------------------------------------------------------
unsigned long sys_fileread(regs_t reg)
{
	FILE* fp=(FILE*)reg.ebx;
	unsigned char* buf=(unsigned char*)reg.ecx;
	unsigned long  size=reg.edx;

	reg.eax=Fat32_Read(fp,buf,size);

	return reg.eax;
}


//----------------------------------------------------------------------------------------------////  系统调用 获取窗体进程号////----------------------------------------------------------------------------------------------
unsigned long sys_get_win_instance(regs_t reg)
{
	int i;
  HWND     hWnd=reg.ebx;

	for(i=0;i<MAX_WINSLOT;i++)
	{
		if(WinArray[i].bUsed && hWnd==WinArray[i].win.hWnd)
		{	  
			reg.eax=WinArray[i].win.hInstance;
			return reg.eax;
		}
	}

	reg.eax=0;
	return reg.eax;
}

//----------------------------------------------------------------------------------------------////  系统调用 获取窗体消息队列////----------------------------------------------------------------------------------------------
unsigned long sys_get_message_queue(regs_t reg)
{
	register int i;
	unsigned long pMsgQueue;
	HWND     hWnd=reg.ebx;

	for(i=0;i<MAX_WINSLOT;i++)
	{
		if(WinArray[i].bUsed && hWnd==WinArray[i].win.hWnd)
		{	  
			pMsgQueue=(unsigned long)(WinArray[i].win.MessageQueue);
			reg.eax=pMsgQueue;
		  return reg.eax;
	  }
	}
	reg.eax=NULL;
	return reg.eax;

}

//----------------------------------------------------------------------------------------------////  系统调用 获取窗体消息处理函数指针////----------------------------------------------------------------------------------------------
unsigned long sys_get_winproc(regs_t reg)
{
	register int i;
	unsigned long pWndProc;
	HWND     hWnd=reg.ebx;

	for(i=0;i<MAX_WINSLOT;i++)
	{
		if(WinArray[i].bUsed && hWnd==WinArray[i].win.hWnd)
		{	  
			pWndProc=(unsigned long)(WinArray[i].win.WindowProc);
			reg.eax=pWndProc;
		  return reg.eax;
	  }
	}
	reg.eax=NULL;
	return reg.eax;


}


//----------------------------------------------------------------------------------------------////  系统调用 向指定窗体发送消息////----------------------------------------------------------------------------------------------
unsigned long sys_send_message(regs_t reg)
{
	int i;
	KnlMes  mes;
	KnlMes* pMes=(KnlMes*)(reg.ecx);
	HWND    hWnd=reg.ebx;

	for(i=0;i<MAX_WINSLOT;i++)
	{
		if(WinArray[i].bUsed && hWnd==WinArray[i].win.hWnd)
		{
			memcpy(&mes,pMes,sizeof(KnlMes));
			KnlPutMessage(WinArray[i].win.MessageQueue,mes);
			reg.eax=1;
			return reg.eax;
		}
	}

	reg.eax=0;
	return reg.eax;
}


//----------------------------------------------------------------------------------------------////  系统调用 刷新鼠标缓冲////----------------------------------------------------------------------------------------------
unsigned long sys_refresh_ms_buf(regs_t reg)
{
	RECT  aInvRect;
	RECT* pRect;
	pRect=(RECT*)(reg.ebx);
	memcpy(&aInvRect,pRect,sizeof(RECT));
	RefreshMouseBuf(aInvRect);
	reg.eax=0;
	return reg.eax;
}

//----------------------------------------------------------------------------------------------////  系统调用 锁定当前进程////----------------------------------------------------------------------------------------------
unsigned long sys_lock_proc(regs_t reg)
{
	unsigned char bLock=(unsigned char)reg.ebx;
	SetSwitching(bLock);
	reg.eax=0;
	return reg.eax;
}


//----------------------------------------------------------------------------------------------////  系统调用 阻塞当前进程////----------------------------------------------------------------------------------------------
unsigned long sys_block_proc(regs_t reg)
{
	int                     i;
	ProcStruct              *rp;
	HINSTANCE               hInstance=reg.ebx;

	for (rp=&proc[0],i=0;rp<&proc[MAX_PROCESS];++rp,++i)
	{
		if(rp->pid==hInstance)
		{
			rp->procFlag=P_BLOCK;
		  rp->totalTick=0;
			Schedule();
			return TRUE;
		}
	}
  
	return FALSE;
}

//----------------------------------------------------------------------------------------------////  系统调用 唤醒进程////----------------------------------------------------------------------------------------------
unsigned long sys_wakeup_proc(regs_t reg)
{
	int                     i;
	ProcStruct              *rp;
	HINSTANCE               hInstance=reg.ebx;

	for (rp=&proc[0],i=0;rp<&proc[MAX_PROCESS];++rp,++i)
	{
		if(rp->pid==hInstance)
		{
			rp->procFlag=P_RUN;
		  rp->totalTick=10;
			Schedule();
			return TRUE;
		}
	}
  
	return FALSE;
}



syscall_fuc	syscall_table[5][16] = {
/*
**0x0X: kernel
*/              {
               sys_info , sys_fork , sys_nosys, sys_nosys,
        	     sys_lock_proc, sys_get_cur_instance, sys_block_proc, sys_wakeup_proc,
	             sys_nosys, sys_nosys, sys_nosys, sys_nosys,
	             sys_nosys, sys_nosys, sys_nosys, sys_nosys,
                 },
/*
**0x1X: mm call
*/             {
               sys_malloc, sys_free,  sys_page_info, sys_mem_hole_info,
        	     sys_nosys,  sys_nosys, sys_nosys, sys_nosys,
	             sys_nosys,  sys_nosys, sys_nosys, sys_nosys,
	             sys_nosys,  sys_nosys, sys_nosys, sys_nosys,
                 },
/*
**0x2X: file system call
*/             {
               sys_fileopen, sys_fileread, sys_nosys, sys_nosys,
        	     sys_nosys, sys_nosys, sys_nosys, sys_nosys,
	             sys_nosys, sys_nosys, sys_nosys, sys_nosys,
	             sys_nosys, sys_nosys, sys_nosys, sys_nosys,
                 },
/*
**0x3X: API
*/            {
	             sys_register_win, sys_nosys, sys_nosys, sys_nosys,
        	     sys_send_message, sys_nosys, sys_nosys, sys_nosys,
	             sys_refresh_ms_buf, sys_nosys, sys_nosys, sys_nosys,
	             sys_nosys, sys_nosys, sys_nosys, sys_nosys,
                 },
/*
**0x4X: windows call
*/             {
               sys_get_dc, sys_get_message_queue, sys_get_winproc, sys_get_win_instance,
        	     sys_set_win_pos, sys_set_win_size, sys_get_win_rect, sys_nosys,
	             sys_set_below_cliprgn, sys_set_below_invrgn, sys_set_above_cliprgn, sys_nosys,
	             sys_nosys, sys_nosys, sys_nosys, sys_nosys,
                 },
};


#define NR_SYSCALL 0x50


unsigned long _system_call(int eax, unsigned ebx, unsigned ecx, unsigned edx)
{
	unsigned long ret_val;

	__asm__ __volatile__("int %1\n"
		: "=a"(ret_val)		/* EAX	    EBX		ECX		EDX */
		: "i"(0x80), "a"((unsigned)eax), "b"(ebx), "c"(ecx), "d"(edx));

	return ret_val;
}


extern int sys_call(void);


void SystemCallInit(void)
{
	 ConsolePrintf("Set the system call");
	 SetSystemGate(0x80,&sys_call);
	 ConsolePrintOK();
}

⌨️ 快捷键说明

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