发新话题
打印

DragonFlyBSD的系统调用机制

DragonFlyBSD的系统调用机制

int0x80的就不说了,跟其他都差不离
这里之说int0x81的msg系统调用

首先还是一段汇编,处理上下文信息,值得注意的是,传递来得数据中eax代表调用号,ecx是消息指针,edx是消息长度。处理完上下文,进入 sys/i386/i386/trap.c中的sendsys2(frame)。这里面用union sysunion代表系统调用消息。
union sysunion在内核中定义为
{
struct lwkt_msg lmsg,
struct no_sys no_sys,
struct xxx_args,
...
struct yyy_args
}
这里struct no_sys又包含struct lwkt_msg,xxx_args包含struct no_sys。
实际上xxx_args的剩余部分就是系统调用的用户部分(提供了参数),而struct no_sys则是内核部分,struct lwkt_msg包含了cmd,这个就是frame.ft_eax,也就是系统调用号。而后,用mycpu->curthread-> td_proc获得系统调用表sysentries,以cmd为下标获取struct sysent,然后执行里面的函数,这个函数就是sys_xxx的系统调用处理函数了。

至于为什么调用表是通过当前进程获取的,可能跟进程的模拟环境有关,这部分我还不确定。

TOP

发新话题