問題タブ [linux-device-driver]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-device-driver - inb() および outb() 経由で通信するためのデバイス ベース アドレスの検索
ドライブに関する特定の情報を見つけることができるように、inb()、inw()、outb()、および outw() コマンドを使用してディスク ドライブと通信しようとしています。ただし、これらのコマンドを使用するには、デバイスの正しい I/O ポートが必要です。正しい I/O ポートがあれば、探している情報を簡単に見つけることができますが、Linux でデバイスの I/O ポートのベース アドレスを見つける方法がわかりません。
DOS では、Hdat2 を使用してデバイスのベース アドレスを見つけることができますが、Linux でアドレスを見つけようとしています。Linux でどのデバイスがどの I/O ポートにマップされているかを調べる方法はありますか?
/proc には ioports というファイルがあり、いくつかの情報が含まれていますが、この情報を特定のデバイスに関連付ける方法はわかりません。
どんな助けでも大歓迎です。ありがとう!
network-programming - Linux と 2 つの NIC を備えた標準 PC を使用したネットワーク アプライアンス プロトタイプの構築
ネットワーク アプライアンスのプロトタイプを作成したいと考えています。このアプライアンスは、イーサネット パケットを透過的に操作すると想定されています。2 つのネットワーク インターフェイス カードがあり、1 枚のカードが外側のレッグ (つまりeth0 ) に接続され、もう 1 枚が内側のレッグ (つまりeth1 ) に接続されているとします。
添付画像のような一般的なネットワーク レイアウトでは、ルーターと LAN のスイッチの間に配置されます。
私の計画は、カーネル ドライバー レベルでフックするソフトウェアを作成し、着信および発信パケットに対して必要なことは何でも行うことです。
たとえば、「送信」パケット (eth1) は操作され、他の NIC (eth0) に渡され、次の希望に転送されます。
私の質問は次のとおりです。
- これは実行可能ですか?
- これらの NIC には IP アドレスがありませんが、問題になるのでしょうか?
ご回答ありがとうございます。
(いいえ、そのようなデバイスはまだ市場に出回っていません。そのため、「車輪を再発明する理由」スタイルの回答は関係ありません)
典型的なネットワーク図 http://img163.imageshack.us/img163/1249/stackpost.png
linux-kernel - ユーザー空間アプリケーションでのタスクレットの利点
下半分に疑問があります。ここでは、タスクレットのみを考えます。また、プリエンプティブルでないカーネルのみを考慮します。
rx 割り込み処理が約 10 個の関数呼び出しを実行しているイーサネット ドライバを考えてみます。(悪いプログラミング :))
ここで、タスクレットに 9 つの関数呼び出しを移動でき、割り込み処理で呼び出す必要があるのは 1 つだけである場合のパフォーマンスの観点を見ると、tcp 読み取りアプリケーションで本当に良いパフォーマンスを得ることができますか?
言い換えると、ユーザー空間アプリケーションへの切り替えがあると、スケジュールされたタスクレットの 9 つの関数呼び出しがすべて呼び出され、実質的に、ユーザー空間アプリケーションは「スケジュールされたすべてのタスクセット」が終了した後にのみパケット兼データを取得できるようになります。完了?正しい?
下半分を使用することで、すべての割り込みを有効にしていることは理解しています..しかし、割り込みに依存するアプリケーションが、割り込みハンドラー自体または下半分に10個の関数全体を配置することで、実際に何かを得るかどうかは疑問です。
つまり、タスクレットを使用することで、ユーザー空間アプリケーションのパフォーマンスが向上しますか?
linux - Linuxドライバーの学習
私は今日、ドライバーのプログラミングを学んでいます。
私はこの本から学んでいますLinuxデバイスドライバー
しかし、私は少し練習不足です。私が始めることができるいくつかの簡単なプロジェクトを私に勧めてもらえますか?
または、初心者が何が起こっているのかを理解できるオープンソースプロジェクト。
追加の例とチュートリアルを歓迎します。
手伝ってくれてありがとう。
c - ユーザー空間のLinuxブロックデバイスドライバーを作成するには?
Linux ブロック デバイス ドライバーを作成したいと考えています。ドライバーはハードウェアにアクセスする必要がないため、ユーザー空間に配置できます。
まず、この Makefile を使用してブロック デバイス ドライバーの例を作成してみました。
ただし、修正方法がわからないこれらのエラーが発生します。標準出力と標準エラー出力は次のとおりです。
これに関する任意の助けをいただければ幸いです。
ありがとう、アンドレアス
linux-device-driver - Linux System.map に関数名とアドレスがありません
AT91SAM9263 ボードで組み込み開発を行っていますが、奇妙な問題に遭遇しました。Debian Linux カーネル 2.6.18.4 を実行しており、arm-linux-gcc 3.4.6 でクロスコンパイルされ、C ライブラリに uClibc-0.9.28 を使用しています。カーネル デバイス ドライバーをデバッグしていますが、特定の関数が System.map ファイルに表示されません。当然のことながら、ブレークポイントを設定することはできません。奇妙なことに、その呼び出し関数に割り込むと、ステップインできません。gdb の nexti コマンドを使用すると、関数は実行されますが、ソースはスキップされます。関数は atmel_rx_chars(struct uart_port *port) です。これは atmel_serial.c で宣言された static void 関数であり、その例は [1] に示されています。同じファイル (atmel_tx_chars(struct uart_port *port)、たとえば) これらは同じファイルで宣言され、実際には System.map ファイルでインデックス化されています。[2] によると、「System.map は 'nm vmlinux' によって生成され、無関係または興味のないシンボルは grep で抽出されます。」nm (および objdump) を使用してすべてのシンボルを表示しようとしましたが、それでも出力に表示されません。ただし、atmel_rx_chars vmlinux を grep すると、一致が返されます。私は自分自身を少しパワーユーザーだと思っていましたが、その後は本当に困惑しています. どんなアドバイスでも大歓迎です。私は自分自身を少しパワーユーザーだと思っていましたが、その後は本当に困惑しています. どんなアドバイスでも大歓迎です。私は自分自身を少しパワーユーザーだと思っていましたが、その後は本当に困惑しています. どんなアドバイスでも大歓迎です。
ありがとうございました、
ジェイス
[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2]http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap
linux-kernel - -o ループなしでマウント
Linux カーネル用のダミー (RAM ディスク) ブロック デバイス ドライバーを作成しました。ドライバーがロードされると、/dev/mybd として表示されます。
dd コマンドを使用してデータを正常に転送でき、コピーされたデータを正常に比較できます。
問題は、その上に ext2/3 ファイルシステムを作成するときに、mount コマンドで -o loop オプションを使用する必要があることです。それ以外の場合、マウントは次の結果で失敗します。
マウント: fs タイプが正しくない、オプションが正しくない、mybd のスーパーブロックが正しくない、コードページまたはヘルパー プログラムがない、またはその他のエラー
何が問題なのですか?助けてください。
ありがとう。
linux-kernel - 割り込み記述子テーブルの変更
Linux 2.6.26カーネルバージョンを使用しており、カーネルモジュールを使用して割り込み記述子テーブルを変更しようとしています。ここでページフォールトテーブルエントリを変更しようとしているだけです。そのため、元のIDTのコピーを作成し、ページフォールトテーブルエントリのみに変更を加えます。ISRの目的は、元のページフォールトハンドラーを呼び出す前に、ページフォールトの情報を出力することです。しかし、insmodを使用してカーネルをロードすると、カーネルがクラッシュします。つまり、「loadIDTR」関数を使用してカーネルがクラッシュします。さらにデバッグすると、IDTRをロードしてもエントリを変更しないことで、正常に機能することがわかりました。私は考えが足りません。
以下のコードを貼り付けました
c - ユーザー空間をカーネル空間と sysfs に変更し、sysfs を使用して igmpv3 pkt の 1 つの予約値を変更する方法
以前にクエリを投稿しましたが、kernel2.6 に組み込まれている igmpv3 (Linux) を変更したいのと同じことを繰り返しています。ファイルから値を読み取り、igmpv3 パケット内の予約済み (res 1) 値を適切に決定するようにします。これはホストによって送信されます。
これは、ユーザー空間からカーネル空間の変数を変更するというより一般的な質問であると言って、上記の質問にさらに追加したいと思います。
その 1 つに対して ctuffli は次のように答えています。
ユーザー ランド プログラムの観点からは、ドライバーは、変更したい変数を含むコードではなく、適切に定義されたインターフェイスを備えた "ブラック ボックス" と考える必要があります。このメンタル モデルを使用すると、次の 4 つの方法 (インターフェイスなど) を使用して、制御情報をドライバーに伝達することを考慮する必要があります。
- コマンド ライン オプション。初期化中に利用可能なカーネルモジュールにパラメーターを渡すことができます。
- IOCTL。これは、制御情報をドライバーに渡す従来の方法ですが、このメカニズムは sysfs よりも使用するのが少し面倒です。
- proc プロセス情報疑似ファイルシステム。proc は /proc ディレクトリにファイルを作成し、ユーザー ランド プログラムが読み書きできるようにします。以前は、このインターフェースはドライバーとの通信にも使用されていました。proc は sysfs に似ていますが、新しいドライバー (Linux 2.6) では代わりに sysfs を使用する必要があります。これは、proc の目的がプロセスのステータスを報告することだからです。
- sysfs は、ドライバーとデバイスに関する情報をエクスポートするために使用される疑似ファイル システムです。
ドライバーと通信する必要がある時期 (つまり、初期化、実行時) に応じて、新しいコマンド ライン オプションまたは新しい sysfs エントリを追加して、ドライバーがパケット内の予約済みフィールドの値を処理する方法を変更する必要があります。
Ctuffli さん、ご回答ありがとうございます。sysfs についての知識はありません。詳細を教えていただけますか?igmpv3 pkt の予約値の 1 つを 0 または 1 または 2 のいずれかに変更したいと考えています。変更する必要があるのはこれだけです。この特定の問題の詳細を教えてください。