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

📄 crt.c

📁 Simple Operating Systems (简称SOS)是一个可以运行在X86平台上(包括QEMU
💻 C
字号:
/* Copyright (C) 2005 David Decotigny   Copyright (C) 2003 Thomas Petazzoni   This program is free software; you can redistribute it and/or   modify it under the terms of the GNU General Public License   as published by the Free Software Foundation; either version 2   of the License, or (at your option) any later version.      This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.      You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,   USA. *//** * @file crt.c * * The C RunTime environment for the basic support of SOS C user * programs */#include <hwcore/swintr.h>#include <string.h>#include "crt.h"/** * Starter function ! */void _start() __attribute__((noreturn));void _start(){  /* This starter function expects a main() function somewhere */  extern int main();  /* Reset the bss section */  extern char _bbss, _ebss;  memset(& _bbss, 0x0, (& _ebss) - (& _bbss));  _sos_exit(main());}/* * By convention, the USER SOS programs always pass 4 arguments to the * kernel syscall handler: in eax/../edx. For less arguments, the * unused registers are filled with 0s. For more arguments, the 4th * syscall parameter gives the address of the array containing the * remaining arguments. In any case, eax corresponds to the syscall * IDentifier. */inlineint _sos_syscall3(int id,		  unsigned int arg1,		  unsigned int arg2,		  unsigned int arg3){  int ret;  asm volatile("movl %1,%%eax \n"	       "movl %2,%%ebx \n"	       "movl %3,%%ecx \n"	       "movl %4,%%edx \n"	       "int  %5\n"	       "movl %%eax, %0"	       :"=g"(ret)	       :"g"(id),"g"(arg1),"g"(arg2),"g"(arg3)	        ,"i"(SOS_SWINTR_SOS_SYSCALL)	       :"eax","ebx","ecx","edx");  return ret;}int _sos_syscall0(int id){  return _sos_syscall3(id, 0, 0, 0);}int _sos_syscall1(int id,	     unsigned int arg1){  return _sos_syscall3(id, arg1, 0, 0);}int _sos_syscall2(int id,		  unsigned int arg1,		  unsigned int arg2){  return _sos_syscall3(id, arg1, arg2, 0);}int _sos_syscall4(int id,		  unsigned int arg1,		  unsigned int arg2,		  unsigned int arg3,		  unsigned int arg4){  unsigned int args[] = { arg3, arg4 };  return _sos_syscall3(id, arg1, arg2, (unsigned)args);}int _sos_syscall5(int id,		  unsigned int arg1,		  unsigned int arg2,		  unsigned int arg3,		  unsigned int arg4,		  unsigned int arg5){  unsigned int args[] = { arg3, arg4, arg5 };  return _sos_syscall3(id, arg1, arg2, (unsigned)args);}int _sos_syscall6(int id,		  unsigned int arg1,		  unsigned int arg2,		  unsigned int arg3,		  unsigned int arg4,		  unsigned int arg5,		  unsigned int arg6){  unsigned int args[] = { arg3, arg4, arg5, arg6 };  return _sos_syscall3(id, arg1, arg2, (unsigned)args);}int _sos_syscall7(int id,		  unsigned int arg1,		  unsigned int arg2,		  unsigned int arg3,		  unsigned int arg4,		  unsigned int arg5,		  unsigned int arg6,		  unsigned int arg7){  unsigned int args[] = { arg3, arg4, arg5, arg6, arg7 };  return _sos_syscall3(id, arg1, arg2, (unsigned)args);}int _sos_syscall8(int id,		  unsigned int arg1,		  unsigned int arg2,		  unsigned int arg3,		  unsigned int arg4,		  unsigned int arg5,		  unsigned int arg6,		  unsigned int arg7,		  unsigned int arg8){  unsigned int args[] = { arg3, arg4, arg5, arg6, arg7, arg8 };  return _sos_syscall3(id, arg1, arg2, (unsigned)args);}void _sos_exit(int status){  _sos_syscall1(SOS_SYSCALL_ID_EXIT, (unsigned)status);    /* Never reached ! */  for ( ; ; )    ;}int _sos_bochs_write(const char * str, unsigned length){  return _sos_syscall2(SOS_SYSCALL_ID_BOCHS_WRITE,		       (unsigned)str,		       length);}

⌨️ 快捷键说明

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