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