デバイスノードを作成せずにキャラクタデバイスを開く

デバイスノードを作成せずにキャラクタデバイスを開く

サードパーティのアプリケーションが、開くべきではないデバイス ノードを開いてしまうという問題が発生しています。

私は、メッセージの処理を行う SPI スレーブ デバイス ドライバーを作成しました。ドライバーがロードされると、特定のメッセージにのみ応答する「初期化モード」になります。通信を再初期化するには、ドライバーをアンロードして再ロードする必要があります。問題は、システムに、すべてのキャラクタ デバイスを開く、ルートとして実行されるサード パーティ アプリケーションがあることです。これをすべて機能させる唯一の方法は、アプリを停止してアンロードすることですが、これはプロジェクト全体に大きな問題を引き起こします。

実際にデバイス ノードがなくても、キャラクター デバイスへの接続を開くことは可能ですか? 現在、fopen('/dev/spi') を使用していますが、リロードが必要になり、上記の問題が発生するまではすべて正常に動作します。実際の /dev/spi ファイルがなくても、特定のメジャー/マイナー ノード番号へのファイル記述子を生成するシステム コールは何かありますか?

答え1

問題のあるアプリケーションが/devツリー内のデバイスノードのみを開く場合独自のプログラムで機能する場合は、デバイス ノードを別の場所に配置できます。

devデバイス ノードが存在するファイル システムでは、デバイス ノード ファイルを特別に処理できるようにマウント オプションを設定する必要があります。

(免責事項: 私はこれをテストしていませんが、以前に同様のことを行ったことがあります...)

tmpfs一例としては、たとえば小さなファイルシステムをマウントし/my-dev/、そこにデバイスノードを作成することが挙げられます。

mkdir -p /my-dev

mount -t tmpfs -o dev,size=<size> tmpfs /my-dev

mknod /my-dev/spi <type> <maj> <min>

どこ<size>tmpfsのサイズです。<type>はデバイスノードタイプであり、<maj> <min>mountはメジャー:マイナーデバイス番号です。それぞれおよびのマニュアルページを参照してくださいmknod

...そしてfopen("/my-dev/spi")プログラム内で使用します。

(そしてもちろん、udevまたは同様のものがないデバイスのノードを作成します。

関連情報