所以,我正在从FreeBSD转到Linux上进行驱动程序编写,我有两个问题。
在FreeBSD中,有following:
struct sysent { /* system call table */
int sy_narg; /* number of arguments */
sy_call_t *sy_call; /* implementing function */
au_event_t sy_auevent; /* audit event associated with syscall */
systrace_args_func_t sy_systrace_args_func;
/* optional argument conversion function. */
u_int32_t sy_entry; /* DTrace entry ID for systrace. */
u_int32_t sy_return; /* DTrace return ID for systrace. */
u_int32_t sy_flags; /* General flags for system calls. */
u_int32_t sy_thrcnt;
};
现在,当我写一个驱动程序或其他什么时,我可以填写它,并通过SYSCALL_MODULE(9)
向用户空间提供系统调用。
在用户空间中,我可以使用:
int mod_find(const char *)
,mod_stat(int mod_id, module_stat *)
和
syscall(int syscall_num, [args])
用于查找,获取详细信息和执行任意系统调用的函数。
我在Linux中知道我们有syscall(2)
,但我们是否有查找系统调用号码的功能?另外,如何让我的模块可供用户空间使用甚至调用它?
编辑:我做了一些阅读,我知道我可以改变syscall_64.tbl
;然而,这是静态的,我想通过/dev
动态而不是必需的东西。