Linuxカーネル4.xでシステムコールを追加する方法

Linuxカーネル4.xでシステムコールを追加する方法

Linuxカーネル4.1.6を使用してシステムコールを追加しようとしていますが、私が見つけることができるすべてのドキュメントは以前のバージョンに関するものです。最新のカーネルでどのように行われているかを知っている人や良い参考資料を持っている人はいますか?

次の3つのステップが必要です。

  1. システムコールテーブルに追加されました。私は彼らが今Entry.Sの代わりにArch/x86/syscalls/syscall_64.tblを使用していることに気づきました。だからそこに何かを入れておきました。

  2. asm/unistd.h ファイルに追加します。これでunistd.hファイルが自動的に生成されるので、手動で更新する必要はありませんか?したがって、ファイルが存在しないため、このステップでは何もしません。 https://stackoverflow.com/questions/10988759/arch-x86-include-asm-unistd-h-vs-include-asm-generic-unistd-h

  3. システムコールをカーネルにコンパイルします。カーネル2.6ベースの本(Robert LoveのLinux Kernel Development Book)が提案したように、実際のシステムコールコードを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が思うほどスマートではありません。とにかくどんな助けでもいただければ幸いです。

ありがとうございます。 ~~

ベストアンサー1

~によると_システムコール(2)_syscall0このマクロのマニュアルページは廃止され、必須になる可能性があります#include <linux/unistd.h>。実際、Linux 4.xにはこのマクロはありません。

しかし、インストールすることができますmusl-libcライブラリそしてその_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;
}

上記のコードはテストされていません!

おすすめ記事