BSD系统调用规范

2009-05-13 01:37:47来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

好象是04年写的,而且用到了我的服务器NETBSD上.蛮好用的
操作系统系统调用设计规范
           ------基于OpenBSD系统
       作者:xie_minix
   
    操作系统的大致分层中,系统调用是放在中间层,其下是软件中断或设备驱动例程,其上为用户进程.他执
行以下两个功能:
. 检查由用户进程提交的参数
. 调用核心例程来执行用户所需求功能
不管调用成功是失败,系统都将返回给一个结果给调用进程,一般我们采用全局变量error(位于sys/sys/error.h)
中的值作为返回结果.值为0代表调用成功,非0代表失败,其值对应error.h中的值.在检查到用户提交的参数
有错误时,系统将会由一段C库例程填充error的值,并设置寄存器EAX为-1(即返回值).
    BSD类操作系统的系统调用申明在/sys/sys/syscall.h中,我们所说的系统调用号全部在此申明,如:
#define SYS_open   5   说明SYS_open实际上是5号系统调用,用户端的系统调用申明,也就是我们编译器所
使用的头文件位于:/usr/include/sys/syscall.h中。其中所申明的系统调用常量值和/sys/sys/syscall.h中
的值是一样的。我们打开一文件可以使用系统调用:
fd=syscall("/sys/sys/syscall.h",O_RDONLY,S_IRWXU);
或通用的:
fd=open("/sys/sys/syscall.h",O_RDONLY);
我们为了彻底弄清函数的工作过程,不得不了解编译器的一些简单原理。
对于open函数,编译器使用/sys/lib/csu/common.h中的
#define open(name, f, m) __syscall(SYS_open, (name), (f), (m))
来解释open函数。在汇编代码过程中,使用的是/lib/libc/arch/i386/sys/syscall.S中的一个汇编语言过
程,当然我在这指的是Inter的CPU,不同的CPU所使用的编译库是不同的(位于/sys/arch下)
#include "SYS.h"
SYSENTRY(syscall)
/*
SYSENTRY宏展开后为
.text; .align 2, 0x90;
.globl _thread_sys_syscall;
.type _thread_sys_syscall,@function;
_thread_sys_syscall:
.weak syscall;  
syscall = _thread_sys_syscall
.globl CERROR
*/
pop %ecx /* 用户进程返回地址 */
pop %eax /* C过程压栈的系统调用号 */
push %ecx /*调换返回地址在栈顶的顺序,使栈顶是返回地址,有利于中断返回*/
int $0x80 /*执行0X80号中断*/
push %ecx /* 保持堆栈的平衡 */
jc err /*进入到核心后(中断程序),如果有错误,中断返回时carry位置位*/
ret
err:
#ifdef PIC
   pushl %ebx;
call 666f;/*本身此段在内存中的位置是不确定的,编译后标号666确定了,所以要call 666f*/
666:
popl %ebx;
addl $_C_LABEL(_GLOBAL_OFFSET_TABLE_)+[.-666b], %ebx
movl (CERROR)@GOT(%ebx), %ecx
popl %ebx
jmp *%ecx
#else
jmp CERROR
#endif
/sys/arch/i386/i386/trap.c中对系统调用所做的处理.
void
syscall(frame)
struct trapframe frame;
{
register caddr_t params;
register struct sysent *callp;
register struct proc *p;
int orig_error, error, opc, nsys;
size_t argsize;
register_t code, args[8], rval[2];
u_quad_t sticks;
uvmexp.syscalls++;
p = curproc;
sticks = p->p_sticks;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BSD基于IP的新协议实现(教学用)

下一篇:使用Jail和ipfilter结合构建高安全服务器