1

我正在 Linux 内核 3.8.0 上构建系统调用。我将代码添加到 pre>/usr/src/linux/kernel/sys.c 但我找不到任何要添加的 unistd_32.h

#define __NR_helloworld

和 syscall_table_32.h 添加

.
长 sys_helloworld
有一个名为 unistd.h 的文件。但它似乎不是正确的文件

<pre>#ifndef _ASM_X86_UNISTD_H
#define _ASM_X86_UNISTD_H 1

#include <uapi/asm/unistd.h>


# ifdef CONFIG_X86_X32_ABI
#  define __SYSCALL_MASK (~(__X32_SYSCALL_BIT))
# else
#  define __SYSCALL_MASK (~0)
# endif

# ifdef CONFIG_X86_32

#  include <asm/unistd_32.h>
#  define __ARCH_WANT_STAT64
#  define __ARCH_WANT_SYS_IPC
#  define __ARCH_WANT_SYS_OLD_MMAP
#  define __ARCH_WANT_SYS_OLD_SELECT

# else

#  include <asm/unistd_64.h>
#  include <asm/unistd_64_x32.h>
#  define __ARCH_WANT_COMPAT_SYS_TIME

# endif

# define __ARCH_WANT_OLD_READDIR
# define __ARCH_WANT_OLD_STAT
# define __ARCH_WANT_SYS_ALARM
# define __ARCH_WANT_SYS_FADVISE64
# define __ARCH_WANT_SYS_GETHOSTNAME
# define __ARCH_WANT_SYS_GETPGRP
# define __ARCH_WANT_SYS_LLSEEK
# define __ARCH_WANT_SYS_NICE
# define __ARCH_WANT_SYS_OLDUMOUNT
# define __ARCH_WANT_SYS_OLD_GETRLIMIT
# define __ARCH_WANT_SYS_OLD_UNAME
# define __ARCH_WANT_SYS_PAUSE
# define __ARCH_WANT_SYS_RT_SIGACTION
# define __ARCH_WANT_SYS_RT_SIGSUSPEND
# define __ARCH_WANT_SYS_SGETMASK
# define __ARCH_WANT_SYS_SIGNAL
# define __ARCH_WANT_SYS_SIGPENDING
# define __ARCH_WANT_SYS_SIGPROCMASK
# define __ARCH_WANT_SYS_SOCKETCALL
# define __ARCH_WANT_SYS_TIME
# define __ARCH_WANT_SYS_UTIME
# define __ARCH_WANT_SYS_WAITPID
# define __ARCH_WANT_SYS_FORK
# define __ARCH_WANT_SYS_VFORK
# define __ARCH_WANT_SYS_CLONE

/*
 * "Conditional" syscalls
 *
 * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
 * but it doesn't work on all toolchains, so we just do it by hand
 */
# define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")

#endif /* _ASM_X86_UNISTD_H */</pre>

请帮忙谢谢

4

2 回答 2

1

在最新内核中添加系统调用的方式已更改。现在您需要修改以下文件以添加新的系统调用。

      arch/x86/syscalls/syscall_32.tbl >> for 32-bit 
      arch/x86/syscalls/syscall_64.tbl >> for 64-bit
      include/linux/syscalls.h    

添加 sys_finit_module 的示例:

vim /arch/x86/syscalls/syscall_32.tbl

       347  i386    process_vm_readv    sys_process_vm_readv          compat_sys_process_vm_readv
       348  i386    process_vm_writev   sys_process_vm_writev       compat_sys_process_vm_writev
       349  i386    kcmp            sys_kcmp
       **350    i386    finit_module        sys_finit_module**

vim 包括/linux/syscalls.h

     asmlinkage long sys_finit_module(int fd, const char __user *uargs);
于 2013-12-01T05:18:36.553 回答
0

在内核 4.4.3 中,我认为文件位于:

arch/x86/entry/syscall_32.tbl >> 用于 32 位,arch/x86/entry/syscall_64.tbl >> 用于 64 位

于 2016-01-23T07:27:42.933 回答