問題タブ [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.

0 投票する
3 に答える
2701 参照

c - Linuxデバイスドライバーの静的関数?

Linuxコードのデバイスドライバーのほとんどの関数定義が静的として定義されている理由はありますか? これには理由がありますか?

これはスコーピングのためであり、名前空間の汚染を防ぐためであると言われましたが、このコンテキストで静的定義が使用される理由を詳しく説明できる人はいますか?

0 投票する
1 に答える
750 参照

linux - Linux デバイス ドライバの安全でない FXSAVE/FXRSTOR バグ -- 前例はありますか?

厄介な問題が発生し、デバッグしようとしている会社の多くのエンジニアが一時的に困惑しました。

C++ プログラムは通常、MPI を備えたマルチコア コンピューターのクラスターで実行されます。

非常に長い時間 (おそらく数日) 実行された後、突然失敗します。

それに取り組んでいるほとんどのエンジニアは、プログラム自体にバグがある可能性を排除したため、ハードウェアの問題の可能性を非難し始めていますが、Linux カーネル モジュールまたはデバイスのいずれかにソフトウェアの問題があるに違いないと思います。運転者。

疑わしいのは、カーネル モジュールまたはデバイス ドライバーが、いくつかの浮動小数点計算を行うために、SMP システムでは安全でない方法で FXSAVE/FXRSTOR を実行していることです。これは、再入可能にする必要があるカーネル ルーチンの静的バッファに対して FXSAVE を実行するのと同じくらい簡単なことかもしれません。これにより、競合状態のバグが発生し、スレッドの浮動小数点コンテキストがほとんど破損しなくなります。

アプリケーション レベルでは、FXSAVE/FXRSTOR コンテキストの一部である MXCSR の 1 つまたは複数のビットが突然変更されているように見えますが、それを変更するアプリケーション コードはありません。

何年も前に Windows で似たようなことがありましたが、最終的にはビデオ ドライバーのバグであることが判明しました。アプリケーション コードがオペレーティング システムによってプリエンプトされたときに、そのスレッドのコンテキストの一部の MXCSR ビットが破損していました。

私は Linux カーネルのハッキングやデバイス ドライバーの開発の専門家ではありませんが、再入可能性の規則が大幅に変更されていることを読んでいます。非 SMP システムと SMP (マルチコア) システムの間。カーネル バージョン間。など。したがって、競合状態のバグの可能性は妥当と思われます。

私の質問は次のとおりです。その説明に当てはまる既知の Linux ドライバー (またはカーネル) のバグはありますか?

同様の症状があった場合、私が引用できる前例があれば参考になります。この時点で、関係者の多くは (IMHO) 「私のコードにはバグがないので、ハードウェアが悪いに違いない」と考えて時間を無駄にしています。それを超えて、本当の原因である可能性が高いものを探したいと思います.

0 投票する
2 に答える
4647 参照

linux - Linux デバイス ドライバーで浮動小数点を使用するためのコーディング規則は何ですか?

これはこの質問に関連して います。

私は Linux デバイス ドライバーやカーネル モジュールの専門家ではありませんが、Rubini & Corbet による「Linux Device Drivers」[O'Reilly] や多数のオンライン ソースを読んでいますが、見つけることができませんでした。この特定の問題についてはまだ何もありません。

カーネルまたはドライバー モジュールが浮動小数点レジスタを使用できるのはいつですか?
もしそうなら、誰がその内容を保存して復元する責任がありますか?
(x86-64 アーキテクチャを想定)

私の理解が正しければ、KM が実行されているときは常に、何らかのアプリケーション スレッドからプリエンプトされたハードウェア コンテキスト (またはハードウェア スレッドまたはレジスタ セット - 任意の名前) を使用しています。KM を c で記述した場合、コンパイラは汎用レジスタが適切に保存および復元されることを (アプリケーションと同様に) 正しく保証しますが、浮動小数点レジスタではそれが自動的に行われません。さらに言えば、多くの KM は、プロセッサに浮動小数点機能があると想定することさえできません。

浮動小数点を使用したい KM は、浮動小数点の状態を慎重に保存して復元する必要があると推測するのは正しいですか? これを行うための標準のカーネル関数はありますか?

このためのコーディング規約はどこかに明記されていますか?
それらは SMP 非 SMP ドライバーとは異なりますか?
古い非プリエンプティブ カーネルと新しいプリエンプティブ カーネルで違いはありますか?

0 投票する
2 に答える
786 参照

c++ - Ubuntu Eee でカーネルをコンパイルするには何が必要ですか?

LinuxでカスタムUSBドライバーを作成するためのチュートリアルに従っています.g ++を使用して、Ubuntu Eeeを搭載したEee PCでこのことを開発したいと考えています。残念ながら、チュートリアルに従うには、linux/module.h ヘッダー ファイルが必要です。私が理解していることから、これを機能させるにはカーネルをコンパイルする必要があります。以前にカーネルをコンパイルしたことがなく、見つけたすべての指示はデスクトップ Ubuntu 用です。

これを実行してクラス プロジェクトで使用できれば、クラスで追加の単位を取得できるため、Eee でこれを実行しています。

私がフォローしているチュートリアルはここにあります: http://www.linuxjournal.com/article/7353 とここ: http://www.linuxjournal.com/article/4786

0 投票する
1 に答える
3234 参照

linux - i2c デバイス用の新しい Linux ドライバーを作成するにはどうすればよいですか?

いくつかの i2c 制御機能を備えた USB デバイスがあり、それらのビットを操作するためのユーザー空間 API を追加したいと考えています。デバイスの既存のドライバーに i2c サポートを追加するにはどうすればよいですか?

0 投票する
3 に答える
10962 参照

linux - カーネル モジュールのメモリ使用量

カーネル モジュール (通常はデバイス ドライバー) が消費するメモリ量を見積もる際に、.ko (.bss、.data、.text など) の静的メモリ領域のサイズを示すsizeユーティリティを使用してみました。したがって、これらの値の合計は、モジュールを挿入した直後にlsmodコマンドによって得られる出力と正確に等しいと予想していました。

init() 関数では動的メモリ割り当て (kmalloc または vmalloc) が実行されないため、違いが生じていないことが保証されます。では、なぜ不一致があるのでしょうか?

不思議なことに、ほとんどの場合、ミスマッチは固定量であることがわかりました!!

コマンド出力は次のとおりです。

サイズ chardev.ko

lsmod

0 投票する
2 に答える
7467 参照

linux - ioctl return -1 で errno を EPERM に設定

ioctl()を呼び出す C プログラムがありますが、-1 とEPERMに設定されたerrnoを返します。しかし、そのファイルのモードを「777」に変更しました。

ioctl()がerrnoをEPERMに設定して-1 を返す理由を教えてください。

0 投票する
4 に答える
17638 参照

c - open() は「そのようなデバイスはありません」というエラーを返しますが、そのようなデバイスはあります (Linux)

少し古いDAQを使用しようとしていますが、コンパイルするために古い(2004年頃)デバイスドライバーを取得するためにいくつかのフープをジャンプする必要がありました(DTI-DT340 Linux-DAQ-PCI)。

コンパイル、カーネル モジュールのロード、カードの検出、mknod を使用したキャラクター デバイスの作成ができるようになりました。

しかし、これらのデバイスを開くことができず、しようとするとerrno 19 (ENODEV) 'No such device'が表示され続けます。

しかし、mknod はそれを作成することに何の不満もありませんでした。

私が怠っていることはありますか?オープンが失敗する理由は何ですか?

ドライバーをロードしてデバイスを作成するために使用するスクリプトを次に示します。

いくつかの追加情報:

回答: printk は、-ENODEV が open() の内部からスローされたことを確認しました。オールドスタイルを踏襲

(これは非推奨です)、if(!pdev)最終的に true になり、-ENODEV を返します。

私は少しずつ近づいています-より現代的なメカニズムを使用するには、pciコードを修正して更新する必要があると思います...

0 投票する
5 に答える
6138 参照

linux - Linux ソケット プログラミング デバッグ?

私はこのような機能を持っています:

これは、netlink を使用してカーネル空間からメッセージを受信するために使用されます。しかし、実行すると、ソースコードから「カーネルからの応答を受信中にタイムアウトしました」というメッセージが常に表示されます。これは、「選択」メソッドが常に「0」を返すためです。理由がわかりません。どなたかアドバイスをいただければ幸いです。

0 投票する
2 に答える
1677 参照

c++ - 単体テスト用の「エコー」デバイス

現在、ハードウェア通信ポートをテストするプログラムの CPPunit テストをいくつか作成しています (はい、テスター アプリの単体テストを作成しています ;-) )。私がテストしているクラスの 1 つは、基本的にデバイスのファイル記述子のラッパーです。ファイル記述子を作成read()してwrite()呼び出します。 Linuxにデバイスファイル/ドライバーがあり、それをwrite()使用すると、そこread()から書き込んだものを読み戻すことができます(FIFOキューデバイスのように)? このデバイス ファイルがあれば、ラッパーの実際のデバイス ファイルの代わりにそれを配置するのは非常に簡単で、実際のハードウェアで発生する可能性のある「ループバック」シナリオを簡単にエミュレートできます。


基本的に私が探しているのは、一種の仮想"/dev/echo"デバイスです。

例: デバイスは次のように動作します。