カーネルでいくつかのヘルパー機能を開発しました。カーネルの他の関数によって呼び出されます。現在、彼らは私のカスタムカーネルをパニック状態にします:(
デバッグ目的のためにカーネルにのみ配置され、カーネル機能に影響を与えない手動コードとして使用しました。ビルドして実行した後、ユーザー空間でこれらの関数を呼び出す方法があるかどうか疑問に思います。
答え1
これはあなたの質問に対する直接的な答えではありません。 @BasileStarynkevitch が正しいと思います。一般に、コードが十分に抽象的である場合(実際にカーネルの依存関係ではない場合)、理論的に簡単に/信頼できる作業ではありません。その後、スタブユーザースペースプロセスに接続してそのようにテストすることができるようです。
しかし、カーネルはあなたに役立ついくつかの機能を提供します。UML(ユーザーモードLinux)(このページを作成する時点では、sourceforgeインフラストラクチャの問題が原因でダウンしているようです。すぐにバックアップできるようになります。)
UMLは、カーネル全体をユーザー空間の実行可能ファイルとして構築する特別な種類のLinux ARCHです。この実行ファイルが実行されると、通常はカーネルのように起動しますが、すべてユーザー空間のプロセス空間に含まれます。これは、他のユーザースペースプロセスと同様に、GDBをUMLプロセスに直接接続し、カーネルデバッガを使用せずに正常にデバッグできることを意味します。
少なくとも以下が必要です。
- これは、どのカーネルバージョンを使用しても、カーネルソースツリーに当てはまります。
- ビルドカーネルを使用してください
ARCH=um
。どのカーネルと構成を持っているかに関係なく、これは簡単ではないかもしれません。詳細な手順はsourceforgeページ(利用可能な場合)にあります。返品詳しくはこちらをご覧ください。 - このカーネルを起動するには、起動するファイルシステムも必要です。いくつかあります以下は事前に構築されたものです。。すべてのカーネルですべてのファイルシステムを使用できるわけではないので、賢明に選択する必要があるかもしれません。
- あなたのコードがカーネルモジュールの一部であると仮定します。その場合は、それを使用してモジュールをビルド
ARCH=um
し、UMLカーネルプロセスが実行された後にinsmodを実行する必要があります。
答え2
これは簡単にはできません(ユーザー空間から直接カーネル関数を呼び出す)。ユーザーアプリケーションでカーネル関数を呼び出す標準的な方法は、以下を使用することです。システムコール(2)。
デバイスのインターフェイス(つまり、そのデバイス上)を介してread
カーネル機能を呼び出すいくつかのデバイスを提供するいくつかのカーネルモジュールを作成できます。write
ioctl
カーネル機能を呼び出す新しいシステムコールを追加するためにカーネルをパッチすることができますが、お勧めしません。
ハイパーバイザーや一部の仮想マシンでパッチ付きカーネルを実行したい場合があります。
使用を検討する必要があります。ソケット(7)そしてウェブリンク(7)。これは、カーネルとユーザー空間間の通信用に設計されたLinux固有の機能です。
あなたはする必要があります数週間、ドキュメントを読んでください。この機能を使用してください。バラよりhttp://kernelnewbies.org/もちろん、Linuxのソースコードも勉強する必要があります。コア。
読書に悪くないですねオペレーティングシステム教科書。