4

Linux カーネルで定義されたカスタム関数をどこかで呼び出せるようにする必要があります。関数を作成するには、正確に何をする必要がありますか:

void custom_function(int arg);

argシステムコール番号はどこにあり、どこかでできるentry_32.Sことは次のとおりです。

電話custom_function

4

1 に答える 1

1

アセンブリ関数とC関数のスタック処理が異なるため。アセンブリ コード "callq" は、C ルーチンを直接呼び出すことができません。呼び出す前にアセンブリ パラメータを C スタックに入れるコードが必要です。Linux カーネル ソースで定義されているマクロ「asmlinkage」は、関数がアセンブリから呼び出される準備ができていることをコンパイラに伝えるために使用され、コンパイラはこの C 関数の先頭にいくつかのパラメーター配置コードを追加します。

したがって、あなたがしなければならないことは次のとおりです。

呼び出し側

movq <arg6>,%r9     /* 6th arg */
movq <arg5>,%r8     /* 5th arg */
movq <arg4>,%rcx    /* 4th arg */
movq <arg3>,%rdx    /* 3rd arg */
movq <arg2>,%rsi    /* 2nd arg */
movq <arg1>,%rdi    /* 1st arg*/
callq <your-function-name>
movq %rax, <buf-to-return-result>  /* return value */

呼び出し側:

asmlinkage int my-function(int arg1, int arg2, int arg3, ...) {
   <your code>;
   return 0;
}
于 2012-12-12T01:36:03.657 に答える