2

Linux の RTAI 拡張機能を使用して記述された古いリアルタイム制御システム コードを使用しています。プロセスの境界を越えてメモリを作成および共有するために、4 つの異なるメカニズムが使用されています。

1) RTAI 共有メモリ (rt_shm_alloc & rt_shm_free): これは、共有メモリにアクセスするためのキーとして unsigned long グローバルに一意の値を使用します。舞台裏で(少なくともユーザー空間から)、キャラクターデバイスでioctlを使用してメモリを生成し、次にmmapを使用して使用可能にします。

2) System V (ftok、shmget、shmat、shmctl など): ftok を使用して、インデックス値と共に使用されるキーを生成し、メモリ ブロックを検索してマップします。これが実際にどのように実装されているかを確認しようとはしていませんが、カーテンの後ろのどこかで mmap を使用していると想定しています。

3) Posix 共有メモリ (shm_open、mmap、shm_unlink など): これは文字列 (内容にいくつかの制限あり) を取り、リンクされたメモリ ブロックを mmap するために使用できるファイル ハンドルを提供します。これは、仮想ファイルシステムを使用してサポートされているようです。

4) mmap および文字ドライバ ioctl 呼び出しの直接使用 特定のカーネル モジュールは、mmap を使用してメモリ ブロックを作成および共有することを直接サポートするインターフェイスを提供します。

これらのメカニズムはすべて、mmap を明示的または暗黙的に使用して、仮想メモリ サブシステムを変更し、共有メモリをセットアップおよび管理しているようです。

問題は、メモリのブロックがこれらのシステムのいずれかを使用して共有されている場合、他のシステムで同じメモリにアクセスするエイリアスを設定する方法はありますかということです。

ユースケース:

2 つの I/O サブシステムがあります。1 つ目は、Linux カーネル ドライバーを使用して実装され、RTAI 共有メモリ メカニズムを使用して作成された共有メモリの 1 つのチャンクに現在の I/O 状態をエクスポートします。2 つ目は、カスタム カーネル モジュールを使用し、ioctl と mmap を直接使用して共有メモリ ブロックを作成する、etherlab のethercat マスターに基づいています。

特定の I/O フィールドへのアクセスを必要とする 40 ほどの他のシステムがありますが、データがどの I/O サブシステムから来たかを知る必要はありません。

私が必要としているのは、さまざまなタイプの共有メモリを開いてアクセスする方法です。一貫した単一の方法で、基礎となる実装の詳細をユーザーから分離します。 そのようなメカニズムは存在しますか?

この問題を解決するために RTAI 共有メモリ メカニズムを使用するように ethercat スタックを変更しましたが、これは一時的な解決策にすぎません (読む: ハック)。

4

0 に答える 0