2012-04-01 8 views
1

この概念をどこかで読んでいるのを覚えています。私はどこに覚えていません。 私はfile.cと言うファイルを持っています。これは他のファイルと一緒に、アプリケーションで使用するライブラリとして他のファイルとともにコンパイルします。KLMとユーザー空間のファイル

ここで、同じファイルをコンパイルして、それをカーネルモジュールでビルドするとします。したがって、同じファイルオブジェクトはユーザー空間とカーネル空間の両方にあり、システムコールを呼び出さずにカーネルデータ構造にアクセスすることができます。私はアプリケーションがシステムコールなしでカーネルデータ構造にアクセスできるライブラリにapiを持つことができます。私はカーネルに何かを書くことができるかどうか分からないが(この方法では不可能だと思う)、カーネルからこのようにいくつかのデータ構造を読むのは良いだろうか?

誰も私にこのアプローチの詳細を教えてもらえますか?私はこれに関してGoogleで何も見つけられませんでした。

答えて

0

これには2つの方法がありますが、最も一般的なものはキャラクタデバイスと呼ばれ、もう1つはブロックデバイスです(つまり、ディスクのようなもの)。

Here's a guide chardevsを登録するドライバを作成する方法について。

1

私はあなたが話していることを誤解しない限り、これは概念的に欠陥のあるアプローチだと思います。

あなたが正しく理解している場合は、同じファイルを2回、1回はモジュールとして、もう一度はユーザスペースプログラムとして2回コンパイルします。次に、両方を実行して、メモリを共有できるようにします。

それで明らかな問題は、プログラムが同じソースコードから来ても、それらは依然として別々の実行可能ファイルとして存在することです。モジュールは独自のプロセスではなく、カーネルが起動するとき(つまりシステムコール)にのみ呼び出されます。それだけでは、システムコールナンセンスから逃れることはできません。

より良い解決策は、目標が何であるかによって異なります。通常は得られないものが必要なため、カーネルデータ構造にアクセスしたいだけですか?あるいは、パフォーマンスについて心配していて、システムコールよりも速くこれらの構造にアクセスしたいですか?

(1)の場合、キャラクタデバイスまたはprocfsファイルを作成できます。これらの両方を使用すると、ユーザスペースプログラムは、その小さなフィンガーをカーネルに到達させることができます。

(2)の場合、あなたは厳しい状況にあり、問題はより不快になります。速度の問題を解決するには、抽出しようとしている正確なデータに大きく依存します。

これは役に立ちますか?

+0

こんにちは、これは、コンテキストスイッチのオーバーヘッドを解決することでした。あなたの返信を読んでいるうちに、私は今考えていることが間違っていることをはっきりと見ています。私がデータを読まなければならない場合、Procfsはやり方です。他の何かのために私はソフト割り込みを通らなければならない、私はsyscallを意味する。 – Pkp

+0

オーバーヘッドの問題は、探しているデータによって大きく異なります。具体的には、変更を求めているデータの頻度はどれくらいですか? –

関連する問題