Linuxカーネル4.1.6を使用してシステムコールを追加しようとしていますが、見つけることができるドキュメントはすべて古いバージョンのものです。新しいカーネルでそれがどのように行われるか知っている人や、良いリファレンスがありますか?
3つのステップがあるはずです:
システムコールテーブルに追加します。現在、entry.Sの代わりにArch/x86/syscalls /syscall_64.tblを使用していることがわかりました。だから私はそこに何かを入れました。
Asm/unistd.hファイルに追加します。どうやらunistd.hファイルが自動的に生成されるようになったので、手動で更新する必要はありませんか?したがって、ファイルが存在しないため、このステップでは何もしていません。 https://stackoverflow.com/questions/10988759/Arch-x86-include-asm-unistd-h-vs-include-asm-generic-unistd-h
システムコールをカーネルにコンパイルします。カーネル2.6に基づく本(Robert LoveによるLinuxカーネル開発本)で提案されているように、実際のシステムコールコードをkernel/sys.cに追加しました。カーネルを再度コンパイルしました。
次に、本で提案されているようにクライアントプログラムを作成しましたが、コンパイルしようとすると、不明な型名「helloworld」と表示されます。私のプログラムは本とは異なりますが、構造は同じです。
#include <stdio.h>
#define __NR_helloworld 323
__syscall0(long, helloworld)
int main()
{
printf("I will now call helloworld syscall:\n");
helloworld();
return 0;
}
インターネット(および入手可能な本)はこの情報を深刻に欠いているようです-またはGoogleは思ったほど賢くありません。とにかくどんな助けも大歓迎です。
ありがとう。 〜
〜
〜
_ syscall(2) のマニュアルページによると、_syscall0
マクロは廃止されている可能性があり、#include <linux/unistd.h>
が必要です。確かにLinux4.xにはそれがありません
ただし、 musl-libc をインストールして、その_syscall
関数を使用することもできます。
また、ユーザーコードで間接 syscall(2) を使用することもできます。したがって、テストプログラムは次のようになります。
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>
#define __NR_helloworld 323
static inline long mysys_helloworld(void) { return syscall(__NR_helloworld,NULL); }
int main (int argc, char**argv) {
printf("will do the helloworld syscall\n");
if (mysys_helloworld()) perror("helloworld");
return 0;
}
上記のコードはテストされていません!
それでは、インストラクターがインターネットから切り取って貼り付けるだけでなく、ソースを読んでもらいたいと仮定すると、それは間違いなくうまく設計された割り当てです。 (とは言っても、linuxカーネルコードは読みやすいとは言えません。etagsの使い方を知っていることを確認してください。何が起こっているのかを確認するには、マクロを3レベル深くトレースする必要があることが多いためです。)