問題タブ [chardev]

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 投票する
1 に答える
180 参照

c - chardev のメジャーモードとマイナーモードはどれくらい安定していますか?

私はシリアルポートライブラリに取り組んでおり、キャラクターデバイスのメジャー/マイナーモードを使用して、指定されたファイルがプラットフォームシリアルポート、pty、または USB シリアルポートであるかどうかを確認することを考えています。 Linux または OSX に存在するフレームワーク。

実際、ファイルが USB シリアル ポートなのかプラットフォーム シリアル ポートなのかを調べるには、libudevLinux やIOKit OSX など、利用可能なフレームワークを使用する方法があります。PTYしかし、ファイルをチェックするには、古き良きものを使用するしか方法はない と思いますstat():

これまでのところ、debian Linux でPTSchardev のメジャー モードがすべて 136であり、OSX ではすべての PTS のモードが16. ddg をクロールすると、Solaris がメジャー モードを使用している可能性があることがわかりました。24.

PTY/PTS とは何か、およびその歴史について話している多くのリソースをオンラインで見つけることができました。openptypty、またはptsのマンページは、メジャーとマイナーを示していますが、デバイス/dev/ptmxのメジャー/マイナーモードについては言及していません。PTSまた、ユニス全体の主要モードをリストするリソースはありません。

だからここに私の質問があります:

  • PTS特定の Unix フレーバーに対して (および拡張により他のシリアル chardev)のメジャー モードは安定していますか? (±2年で安定するものを探しています)
  • それらはどこで定義されていますか?それを処理するのはカーネルドライバーだと思いますね。
  • これがどのような種類のデバイスであるかを検出するために、chardev のメジャー モードに依存するのは良い考えですか?

注意: unix.SEに投稿することをためらっていますが、コードでそれを使用するコンテキストにいるので、これはここで、SO で尋ねる質問であると考えました。

編集: 関連する質問を unix.SEに投稿し、他の主要なモードを見つけて、それらがシステム間でどれほど安定しているかを調べてください。私の推測では、誰も答えを持っていない場合、少なくともシステムに問い合わせて情報源を調べることができます。

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

linux - Linux カーネル : create_device() で作成された /dev ファイルのパーミッションを設定する

char デバイスのドライバーである小さな Linux モジュールを作成しています。私のコードでは、デバイス自体よりもデバイスクラスを作成しているため、システムに /dev ファイルが作成されます。問題は、/dev ファイルにルート権限しかなく、ユーザーがそのファイルに対する読み取り、書き込み、実行のいずれの権限も持っていないことです。/dev ファイルの権限を変更したいと考えています。

Web で回答を検索したところ、udev ファイルを変更することがわかりましたが、モジュールがカーネルに読み込まれるときに動的に変更する権限が必要なため、この解決策は私の場合には機能しません。私が書いているモジュールは、常に自分のマシンで実行されるとは限らないため、「その場で」アクセス許可を変更する必要があります。

権限を変更する機能はありますか?

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

linux-device-driver - remap_pfn_range を使用して、ブート時のリザーバー メモリをユーザー空間にマップします

remap_pfn_range を使用して、ブート時に予約済みメモリ (2G のオフセットで 30M) (ブート カーネル パラメータ mem=2G memmap=30M$2G) をユーザー空間にマップしようとしています。 以下は私のドライバー コードです。

私のユーザー空間アプリは以下です

モジュールを挿入すると、戻ります

しかし、ユーザー空間アプリを実行するとエラーが返されます

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

c++ - OS X ドライバーの自動アンロード

ここで私の最初の質問です:)

私は現在、キャラクター デバイスを提供し、OSX 10.7+ をターゲットとする一般的な kext を作成しています。これは純粋な C であり、IOKit/C++ はゼロです。(これが問題になる場合は、10.11 でドライバーをテストしています。)

キャラクターデバイスを参照するすべてのファイル記述子が閉じられたら、ドライバーをアンロードしたいのですが、うまくいかないようです。

AppleのドキュメントによるとOSKextRetainKextWithLoadTag

autounload が有効な場合、kext の最後の参照がドロップされた直後に、kext への未解決の参照がなく、その Libkern C++ サブクラスのインスタンス (存在する場合) がない場合、kext はアンロードされます。

...

IOService のサブクラスを定義する Kext では、autounload が自動的に有効になります。他の kext は、参照カウントを使用して自動アンロードを管理でき、Libkern C++ オブジェクトを定義および作成する必要はありません。

前述のように、私の kext にはIOServiceサブクラス (さらに言えばクラス) がないため、OSKextRetainKextWithLoadTag.

ただし、すべてのファイル記述子が閉じられた後、kext は永久にロードされたままになります。

さらに、一般的な kext でアンロードがサポートされなくなった場合にIOService備えて、(プロバイダーとして) サブクラスを提供するシン C++ ラッパーで開始ルーチンと停止ルーチンをラップした kext の「ハイブリッド」バージョンを作成しました。同じ結果です。IOResources

OSKextRetainKextWithLoadTag( andを使用する一般的な kext の例をいくつか見つけましOSKextReleaseKextWithLoadTag たが、それらは非常に古く、最近のバージョンの OS X に対して機能するかどうかはわかりません。)

私が間違っていることは何か分かりますか?

ありがとうございました。

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

c - No such device or address が原因でデバイス ファイルを開くことができない

キャラクターデバイスドライバー(カーネルモジュール)を作成しようとしています。モードが読み込まれ、以下に示すようにキャラクター デバイスが作成されます。

しかし、テスト アプリケーションを使用してデバイスを開こうとすると (ドライバー内の open 関数は、デバッグ メッセージの出力以外に特別なことは何もしません)、次のエラーが発生します。

/proc/devices の内容は次のとおりです。

メジャー番号が 246 のデバイスが存在します。

これは、デバイスを開こうとする方法です。

これは、LKM のスニペットです。

誰でもエラーを見つけるのを手伝ってもらえますか? 必要に応じて、完全なコードを投稿します。

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

linux - Linux キャラクター デバイスは read() を改行で終了する必要があります

POSIX では、テキスト ファイルを次のように定義しています。

1 行以上に編成された文字を含むファイル。

POSIXは行を次のように定義します。

0 個以上の非改行文字と終了改行文字のシーケンス。

これを考えるread()と、Linux キャラクター デバイス ドライバーの関数は、'\n'EOF に達したとき/データがなくなったときにユーザー バッファーに追加する必要がありますか?

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

linux - Linux カーネル モジュールの ioctl で ENOTTY を取得する

次のchardevが定義されています:

.h

モジュール .c

私のユーザーコード

常に同じエラーで失敗します:ENOTTY

デバイスの不適切な ioctl

同様の質問を見たことがあります:つまり

Linux カーネル モジュール - IOCTL を使用すると ENOTTY が返される

Linux カーネル モジュール/IOCTL: デバイスの不適切な ioctl

しかし、彼らの解決策は私にはうまくいきませんでした