helloworld
Linuxカーネルに簡単なシステムコールを追加しました。
sys_helloworld
#include <linux/kernel.h>
asmlinkage long sys_helloworld(void)
{
printk("Hello world\n");
return 0;
}
Hello world
カーネルログに出力するだけです。
私はsys_helloworld
そのようにシステムコールを呼び出しました:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int a = syscall(314); // 314 is the line number of sys_helloworld in syscall table
printf("System call sys_helloworld returned %ld\n", a);
return 0;
}
上記のプログラムはHello world
、カーネルログに正常に出力されます。
私の質問 :
プログラムでsys_hello
(Hello world
カーネルログに出力される)の出力を取得するにはどうすればよいですか?
システムコールに2つの引数を追加する必要があります。書き込み先のバッファーとそのサイズです。次に、を使用snprintf()
して、必要な文字列を印刷できます。正しいsyscall定義マクロを使用していることを確認する必要があります。2つの引数が必要になるため、SYSCALL_DEFINE2
ここで必要になります。
#include <linux/kernel.h> /* For snprintf() */
#include <sys/syscall.h> /* For SYSCALL_DEFINE* macros */
SYSCALL_DEFINE2(sys_helloworld, char *, buff, size_t, buff_sz)
{
snprintf(buff, buff_sz, "Hello world\n");
return 0;
}
完全を期すために、またコンテキストによっては、戻り値を、文字列が切り捨てられたかどうかを確認できるものに変更することをお勧めします。
ユーザーコードは次のように呼び出すことができます:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
char buf[32];
long int a = syscall(314, buf, sizeof(buf));
printf("System call sys_helloworld returned %ld\n", a);
printf("buf = %s\n", buf);
return 0;
}
引数のないシステムコールの場合でもSYSCALL_DEFINE*
、手動で入力するのではなく、マクロを使用してシステムコールを定義する方が一般的に良いスタイルであることに注意してくださいasmlinkage long ....
(を使用しますSYSCALL_DEFINE0
)。これらのマクロはで定義されているinclude/sys/syscall.h
ので、使用する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加