FreeBSD 5内核源代码分析之系统调用过程

2009-05-13 03:53:46来源:未知 阅读 ()

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

FreeBSD 5内核源代码分析之系统调用过程
by wheelz
--------------------------
系统调用开始于用户程序,接着到达libc进行参数的包装,然后调用内核提供的机制进入内核。
内核提供的系统调用进入内核的方式有几种,包括lcall $X, y方式和
int 0x80方式。其实现都在sys/i386/i386/exception.s中。
我们看最常见的int 0x80入口。
1,int 0x80中断向量的初始化。
------------------
在i386CPU的初始化过程中,会调用函数init386() /*XXX*/
其中有:
代码:
(sys/i386/i386/machdep.c)
-----------------------------------
    setidt(IDT_SYSCALL, &IDTVEC(int0x80_syscall), SDT_SYS386TGT, SEL_UPL,
       GSEL(GCODE_SEL, SEL_KPL));
-----------------------------------
在这里设置好int80的中断向量表。
代码:
(sys/i386/include/segments.h)
---------------------------------
#define   IDT_SYSCALL   0x80   /* System Call Interrupt Vector */
#define   SDT_SYS386TGT   15   /* system 386 trap gate */
#define   SEL_UPL   3      /* user priority level */
#define   GSEL(s,r)   (((s)
代码:
(sys/i386/i386/machdep.c)
-----------------------------------
void
setidt(idx, func, typ, dpl, selec)
   int idx;
   inthand_t *func;
   int typ;
   int dpl;
   int selec;
{
   struct gate_descriptor *ip;
   ip = idt + idx;
   ip->gd_looffset = (int)func;
   ip->gd_selector = selec;
   ip->gd_stkcpy = 0;
   ip->gd_xx = 0;
   ip->gd_type = typ;
   ip->gd_dpl = dpl;
   ip->gd_p = 1;
   ip->gd_hioffset = ((int)func)>>16 ;
}
------------------------------------
2,int0x80_syscall
------------------
系统调用的入口是int0x80_syscall,在sys/i386/i386/exception.s中。
它其实是一个包装函数,用汇编写成,其目的是为调用C函数syscall()做准备。
代码:
void
syscall(frame)
   struct trapframe frame;
由于系统调用最终是要调用syscall()这个函数,
因此需要为它准备一个调用栈,包括参数frame,其类型为struct trapframe
代码:
/*
* Exception/Trap Stack Frame
*/
struct trapframe {
   int   tf_fs;
   int   tf_es;
   int   tf_ds;
   int   tf_edi;
   int   tf_esi;
   int   tf_ebp;
   int   tf_isp;
   int   tf_ebx;
   int   tf_edx;
   int   tf_ecx;
   int   tf_eax;

标签:

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

上一篇:bsd6.1下的内核多线程

下一篇:FreeBSD 5 内核源代码分析之中断处理