3

Linux カーネルに新しい (ダミーの) システム コールを追加しようとしています。

1) linux-source/kernel/myfile.c の下にシステム コール コードを追加し、それに応じて Makefile を更新しました。

2) 新しいシステムコール (pedagogictime(int flag,struct timeval *time)) を反映するために、syscall.h、unistd.h、および entry.S ファイルを更新しました。

次に、カーネルをコンパイルし、イメージをインストールして再起動しました。

実行すると: cat /proc/kallsyms | grep "pedag"、これは私が得ている出力です

0000000000000000 T sys_pedagogictime 0000000000000000 d event_exit__pedagogictime 0000000000000000 d event_enter__pedagogictime 0000000000000000 d __syscall_meta_ pedagogictime 0000000000000000 d types _pedagogictime 0000000000000000 d args__pedagogictime 0000000000000000 t trace_init_flags_enter__pedagogictime 0000000000000000 t trace_init_flags_exit__pedagogictime 0000000000000000 t __event_exit__pedagogictime 0000000000000000 t __event_enter__pedagogictime 0000000000000000 t __p_syscall_meta__pedagogictime 0000000000000000 t __initcall_trace_init_flags_exit__pedagogictimeearly 0000000000000000 t __initcall_trace_init_flags_enter__pedagogictimeearly

これは、システム コールが正しく登録されていることを意味します。

私のユーザー空間プログラムでは、次のように書いています。

#define __NR_pedagogictime 1326 //1326 is my system call number
struct timeval *now = (struct timeval *)malloc(sizeof(struct timeval));

    long ret = syscall(__NR_pedagogictime,0,now);
    if(ret)
            perror("syscall ");

しかし、私はエラーが発生しています:

「syscall : 関数が実装されていません」

これについて何か助けていただければ幸いです。ありがとう。

編集:

ところで、syscall() のアセンブリ コードは次のようになります (役立つ場合)。

    movl    $6, %esi
    movl    $1326, %edi
    movl    $0, %eax
    call    syscall
    cltq
4

1 に答える 1

3

間違ったシステムコール番号を選択しました。カーネルがシステムコール数の制限をチェックする方法については、こちらをご覧ください。例 (x86、32 ビット):

496 ENTRY(system_call)
497         RING0_INT_FRAME                 # can't unwind into user space anyway
498         pushl_cfi %eax                  # save orig_eax
499         SAVE_ALL
500         GET_THREAD_INFO(%ebp)
501                                         # system call tracing in operation / emulation
502         testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
503         jnz syscall_trace_entry
504         cmpl $(nr_syscalls), %eax
505         jae syscall_badsys
506 syscall_call:
507         call *sys_call_table(,%eax,4)
508         movl %eax,PT_EAX(%esp)          # store the return value

したがって、このコードが%eax(syscall 番号) とnr_syscalls(sys_call_table サイズ) を比較していることがわかります。以上は につながりsyscall_badsysます。

arch/x86/include/asm/unistd_32.hヘッダーも変更する必要があります。

于 2012-06-28T05:35:25.727 に答える