web-dev-qa-db-ja.com

ユーザースペースでカーネルレベルの関数を呼び出す方法

カーネルでいくつかのヘルパー関数を開発しました。それらはカーネル内の他の関数によって呼び出されます。現在、彼らは私のカスタムカーネルをパニックにします:(

デバッグのために、カーネルの機能に影響を与えずに、カーネル内にあるだけのパッシブコードとして作成しました。ビルドして実行した後、ユーザースペースでこれらの関数を呼び出す方法があるかどうか疑問に思っていますか?

2
alifornia

それを簡単に行うことはできません(ユーザースペースからカーネル関数を直接呼び出す)。

デバイスのインターフェース(つまり、そのデバイスのreadwriteioctl)を介してカーネル関数を呼び出すカーネルモジュール(デバイスを提供する)を作成できます。 。

カーネルにパッチを適用して(ただし、そうすることはお勧めしません)、カーネル関数を呼び出す新しいシステムコールを追加することもできます。

パッチを適用したカーネルをハイパーバイザーまたはVMで実行することをお勧めします

これはあなたの質問に対する直接の答えではありません-@ BasileStarynkevitchは正しいと思います、一般的に、これは簡単に/信頼できることではありませんが、少なくとも理論的には、コードが十分に抽象的である場合(実際にはどのコードにも当てはまりません)カーネルの依存関係)次に、それをスタブユーザースペースプロセスにリンクして、その方法でテストできると思います。

カーネルはあなたに役立つかもしれない何かを提供すると言っています--- ML(ユーザーモードLinux) (執筆時点で、このページはsourceforgeインフラの問題のためにダウンしているようです-うまくいけばそれすぐに戻ってきます)

UMLは、カーネル全体をユーザースペースの実行可能ファイルとして構築する特別なLinuxArchです。この実行可能ファイルを実行すると、カーネルが通常行うように起動しますが、すべて1つのユーザースペースプロセスのスペース内に含まれています。これは、他のユーザースペースプロセスと同じようにGDBをUMLプロセスに直接フックして、カーネルデバッガーをいじる必要なしに、通常どおりにデバッグできることを意味します。

少なくとも次のものが必要です。

  • 使用しているカーネルフレーバーに対応するカーネルソースツリー。
  • Arch=umを使用してカーネルを構築します。これは、使用しているカーネルと構成が何であれ、簡単な場合とそうでない場合があります。それが戻ってきた場合、詳細な手順はsourceforgeページにあります。また 詳細はこちら
  • このカーネルを起動するには、起動するためのファイルシステムも必要です。いくつかあります ここに事前に構築されたもの 。すべてのファイルシステムがすべてのカーネルで機能するわけではないことに注意してください。そのため、慎重に選択する必要がある場合があります。
  • あなたのコードはカーネルモジュールの一部であると思います。その場合は、Arch=umを使用してこのモジュールをビルドし、UMLカーネルプロセスが起動して実行されたらinsmodする必要があります。
2
Digital Trauma