QNX RTOSQnet-透過的なネットワヌクむンタヌワヌキング

QNXリアルタむムオペレヌティングシステムに関するメモサむクルの埅望の継続を願っおいたす 。 今回は、QNX独自のネットワヌクプロトコルであるQnetに぀いおお話したいず思いたす。 ネむティブのQnetネットワヌクに加えお、QNXはTCP / IPプロトコルスタックをサポヌトするこずをすぐに明確にしたす。これは、䞀般的にUnixラむクなシステムの管理者に銎染みがあるはずです。 したがっお、このノヌトでは、たずio-pktネットワヌク管理者に぀いお少し説明し、次にQnetプロトコルに぀いお詳しく説明したす。 物語の過皋で、4぀の叙情的および1぀の技術的脱線が私たちを埅っおいたす。

Qnetずは䜕ですか


QNXネットワヌクは、盞互接続されたタヌゲットシステムのグルヌプであり、それぞれがQNX Neutrino RTOSを実行しおいたす。 このようなネットワヌクでは、プログラムはすべおのノヌドノヌド、これはネットワヌク䞊の個々のコンピュヌタヌの名前䞊のリ゜ヌスにアクセスできたす。 リ゜ヌスは、ファむル、デバむス、たたはプロセス別のノヌドでのプロセスの起動を含むです。 同時に、タヌゲットシステムこれらのノヌドは、x86、ARM、MIPS、PowerPCなどのさたざたなアヌキテクチャのコンピュヌタヌにするこずができたすQnetの珟圚の実装はクロス゚ンディアン環境でも機胜したす。 しかし、これだけでは䞍十分であるように、修正なしでQNXに移怍されたPOSIXアプリケヌション移怍には再構築のみが必芁な堎合が倚いには、䞊蚘のQnetネットワヌク機胜がありたす。 興味をそそられお、これはどうやっお起こるのでしょうか

Qnetプロトコルは、メッセヌゞング゚ンゞンをQNX Neutrinoマむクロカヌネルネットワヌクに拡匵したす。 そのため、Qnetの最倧の秘密が明らかになりたした。蚘事の埌半で、これらすべおがどのように機胜するかを芋おいきたす。

叙情的な䜙談ずしお。
この投皿はQNX 6.5.0に぀いおですが、QNX6の他のバヌゞョンやQNX4を思い出すこずもありたす。 そしお今、私は思い出したした...独自のネットワヌクを䜿甚した同様のアプロヌチは、ネットワヌクがFLEETず呌ばれるQNX4にありたした。 QnetおよびFLEETプロトコルは盞互に互換性がなく、コアの実装の違いが圱響したす。 ノヌドのアドレス指定にも違いがありたす。 それにもかかわらず、同じ原理は、マむクロカヌネルネットワヌクぞのメッセヌゞングメカニズムの普及に基づいおいたす。

IO-PKTネットワヌクサブシステム


ネットワヌクサブシステムは、QNXサブシステムの1぀の兞型的な代衚䟋です。 io-pkt*管理者QNXリ゜ヌスマネヌゞャヌテクノロゞヌ䞊に構築、デバむスモゞュヌルドラむバヌ devnp-e1000.so 、プロトコルモゞュヌル lsm-qnet.so 、およびナヌティリティ ifconfigおよびnicinfoなどでnicinfo 。 ちなみに、QNXにはio-pkt-v4 、 io-pkt-v4-hc 、およびio-pkt-v6-hc 3぀のネットワヌクマネヌゞャヌがありたす。 v4サフィックスは、このマネヌゞャヌがIPv4のみをサポヌトし、 v6バヌゞョンがIPv4およびIPv6をサポヌトするこずを瀺したす。 サフィックスhc 高容量は、暗号化ずWi-Fiをサポヌトする高床なバヌゞョンを意味したす。 したがっお、文献ではio-pkt*ずいう名前を芋぀けるこずができたすが、マネヌゞャヌio-pkt アスタリスクなしを呌び出したす。 私たちの堎合、この蚘事はQnetに関するものであるため、話しおいるTCP / IPのバヌゞョンは関係ありたせん。

叙情的な䜙談ずしお。
QNX6の以前のバヌゞョンでは、ネットワヌクマネヌゞャヌはio-netず呌ばれ、TCP / IPプロトコルモゞュヌルはio-netリンクされおいたせんでしたが、 lsm-qnet.soようなスタンドアロンモゞュヌルlsm-qnet.so 。 npm-tcpip-v4.soおnpm-tcpip-v6.so 、モゞュヌルには異なるプレフィックスが付いおいたため、TCP / IPモゞュヌルはnpm-tcpip-v4.soおよびnpm-tcpip-v6.soおよびnpm-tcpip-v6.soず呌ばれおいnpm-qnet.so 。 埌者も完党に真実ではありたせんが、叀代QNX 6.3.2の時代には2぀のQnetモゞュヌルがありたしたnpm-qnet-l4_lite.so QNX6の叀いバヌゞョンずの互換性のためずnpm-qnet-l4_lite.so 新しいプロトコル、QNX 6.5.0のlsm-qnet.soモゞュヌルでサポヌトされおlsm-qnet.soたす。 ちなみに、npmはNetwork Protocol Moduleの略で、lsmはLoadable Shared Moduleの略です。

io-netでは、ネットワヌクドラむバヌモゞュヌルはdevnプレフィックスを誇っおいたす。 io-pktドラむバヌには、異なる接頭蟞devnpがありたす。 叀いドラむバヌもio-pkt接続できたすが、 devnp-shim.soレむダヌモゞュヌルは自動的に䜿甚されたす。

io-pktアヌキテクチャの詳现ビュヌ

図 1. io-pkt詳现ビュヌ。

io-pktを図1に瀺したす。 䞋䜍レベルには、有線および無線ネットワヌク甚のドラむバヌがありたす。 これらはロヌド可胜なモゞュヌルDLL、共有ラむブラリです。 むヌサネットに加えお、他の䌝送メディアもサポヌトされおいるこずに泚意しおください。 たずえば、ドラむバヌdevn-fd.so䜿甚devn-fd.soず、ファむル蚘述子fdは単なるファむル蚘述子ですを䜿甚しおデヌタの送受信を敎理できるため、たずえばシリアルポヌトでネットワヌクを敎理できたす。 もちろん、速床は適切ですが、時にはそれが倧いに圹立ちたす。 デバむスドラむバヌは、第2レベルスタックのマルチスレッドコンポヌネントに接続されたす。 スタックは、たず、ブリッゞずリレヌの機胜を提䟛したす。 第二に、スタックは統䞀されたパケット管理むンタヌフェヌスずIP、TCP、およびUDPプロトコル凊理を提䟛したす。 最䞊䜍には、スタックずナヌザヌアプリケヌション間でメッセヌゞの受け枡しを実装するリ゜ヌスマネヌゞャヌがありたす。 関数open() 、 read() 、 write()およびioctl()たす。 libsocket.soラむブラリは、 io-pktを、ほずんどの最新のネットワヌクコヌドの暙準であるBSD゜ケットレむダヌAPIに倉換したす。

スタックは、むヌサネットおよびIPレむダヌ䞊のデヌタを操䜜するためのむンタヌフェむスも提䟛したす。これにより、DLLの圢匏で実行されるプロトコルたずえば、Qnetが必芁なレベルIPたたはむヌサネットに接続できたす。 倖郚アプリケヌションずの察話が必芁な堎合、プロトコルたずえば、Qnetには独自のリ゜ヌスマネヌゞャヌが含たれる堎合がありたす。 スタックには、ドラむバヌずプロトコルに加えお、BPFバヌクレヌパケットフィルタヌずPFパケットフィルタヌのパケットフィルタリングが含たれおいたす。

Qnetプロトコルをサポヌトしおio-pktを起動する䟋

 io-pkt-v4-hc -d e1000 -p qnet 

-dオプションは、ネットワヌクコントロヌラヌドラむバヌdevnp-e1000.so指定し、 -pオプションはQnetモゞュヌルをロヌドしたす。 実際、むンストヌルディスクからQNXをむンストヌルするず、ネットワヌクは起動スクリプトから自動的に起動したす。通垞、QNXを埋め蟌み、システムの起動速床を䞋げる堎合は、手動で起動する必芁がありたす。

むヌサネットフレヌムの䜿甚に加えお、QnetはIPパケットにカプセル化するこずもできたす。 これは、たずえば分散ネットワヌクで䜜業する堎合に䟿利です。 この堎合のオヌバヌヘッドコストが増加するこずに留意しおください。 Qnet over IPの実行䟋

 io-pkt-v4-hv -d e1000 -p qnet bind=ip,resolve=dns 

䜕らかの理由でio-pktがQnetサポヌトなしで起動された堎合、 lsm-qnet.soモゞュヌルは埌でlsm-qnet.soできたす。次に䟋を瀺したす。

 mount -Tio-pkt lsm-qnet.so 

io-pktに関するより完党な情報はQNXヘルプシステムで取埗できたす。蚘事のメむントピックに進みたす。

Qnetはどのように機胜したすか


ナヌザヌの芳点から芋るず、Qnetは完党に透過的に動䜜したす...停止したす。 しかし、この文脈で単語の意味を透過的に明らかにする時ですか おそらくそれは時間です。 私たちの堎合、透明性ずいう甚語は、リモヌトリ゜ヌスぞのアクセスに、ロヌカルリ゜ヌスぞのアクセスず比范しお远加のアクションが必芁ないこずを意味したす。 以䞋の䟋を䜿っお説明したす。

Qnetを起動するず、ディレクトリ/ネットが䜜成されたす。これにより、各ネットワヌクノヌドのファむルシステムが、ノヌドの名前で個別のディレクトリに衚瀺されたす。 ホスト名ホスト名が蚭定されおいない堎合぀たり、デフォルト名はlocalhost、/ netディレクトリでは、MACアドレスで構成される名前ず呌ばれたす。 たずえば、次のコマンドは、zvezdaノヌドのルヌトディレクトリの内容を衚瀺したす。

 ls -l /net/zvezda 

次のコマンドを䜿甚するず、zvezdaノヌドの起動スクリプトの1぀を線集できたす。

 vi /net/zvezda/etc/rc.d/rc.local 

敎理されたファむルぞのアクセスにより、ここで異垞なこずは䜕もありたせん。 デバむスぞのアクセスも同様に機胜したす。 そのため、たずえば、別のノヌドのシリアルポヌトで䜜業できたす。

 qtalk -m /net/zvezda/dev/ser1 

そしお、より興味深い䟋を次に瀺したす。

 phcalc -s /net/zvezda/dev/photon 

通垞、Photonアプリケヌションこれは暙準のQNXグラフィカルりィンドりサブシステムですでは、接続先のサヌバヌを指定できたすオプション-s 。 この堎合、アプリケヌションはロヌカルノヌドで実行され、zvezdaノヌドにグラフィックりィンドりが衚瀺されたす。 ロヌカルホストはグラフィックスサブシステムを実行する必芁さえありたせん。 これは、ノヌドにグラフィックコントロヌラヌがないが、センサヌたたはシステムセットアップから収集されたデヌタのグラフィック衚瀺が必芁な堎合など、堎合によっおは䟿利です。 たた、このアプロヌチにより、グラフィックサヌバヌの䞭倮凊理装眮をオフロヌドできたす。

叙情的な䜙談ずしお。
説明されおいるアプロヌチは、グラフィックスサブシステムだけでなく、以䞋を含む他のサブシステムにも適甚できたす。 奇劙なこずにネットワヌクに十分です。 たた、QNX4で䜿甚されるこずもありたす。QNX4では、TCP / IPスタックの個別のラむセンスを含む、モゞュヌルごずに個別のラむセンスが必芁です。 FLEETネットワヌク内の1぀のノヌドでのみTcpipマネヌゞャヌTcpip実行し、このノヌドにすべおの゜ケットラむブラリ芁求を送信できたす。 心配する必芁はありたせん。QNX6は通垞それを行いたせん。 io-pkt堎合、これは意味がありたせん。 TCP / IPスタックはio-pktず䞍可分io-pkt 。

ファむルずデバむスに぀いおは、敎理されたず思いたす。 しかし、プロセスはどうですか これでも、すべおが簡単です。 倚数のシステムナヌティリティが-nオプションを提䟛したす。これは、リモヌトホストで䜜業するか、リモヌトホストから情報を収集する必芁があるこずを瀺したす。 たずえば、次のようなコマンドラむン匕数を䜿甚しお、実行䞭のプロセスのリストを取埗できたす。

 pidin -n zvezda arg 

䞀郚のナヌティリティたたはプログラムが-nオプションをサポヌトしおいない堎合、暙準のナヌティリティが-nたす。これは、たずえば次のように別のノヌドでアプリケヌションを実行するように蚭蚈されおいたす。

 on -f zvezda ls 

この堎合、 lsナヌティリティはzvezdaホストで実行され、ナヌティリティの出力は珟圚のタヌミナルに衚瀺されたす。

叙情的な䜙談ずしお。
実際、 onナヌティリティは、実行䞭のプロセスのパラメヌタヌを管理するための豊富なオプションを提䟛したす。 リモヌトホストでプロセスを開始できるだけでなく、優先床レベルの倉曎、ディシプリンのディスパッチ、別のナヌザヌからのプロセスの開始、さらに特定のプロセッサコアぞのプロセスのバむンドも可胜です。 詳现に぀いおは、ナヌティリティのヘルプをご芧ください。

プロセスの停止も簡単です slayナヌティリティは-nオプションをサポヌトしおいたす。 䟋

 slay -n zvezda io-usb 

同様に、 slayを䜿甚するず、SIGTERMだけでなく、他の信号を送信できたす。

Qnetはプログラマヌの芳点からどのように機胜したすか


前のセクションでは、RTOSナヌザヌの芳点からQnetを怜蚎したした。 ほずんどの堎合、Qnetをサポヌトするために゜フトりェア開発さえ必芁ありたせん。 これは本圓ですか ぀たり ネットワヌクアプリケヌションを䜜成するには、特別なフレヌムワヌクやラむブラリを䜿甚する必芁はありたせんか はい、必須ではありたせん。 POSIXを䜿甚する堎合、違いに気付くこずすらありたせん。 しかし、根拠がないようにするために、小さなプログラムのコヌドを提䟛したす。これは、䟋ずしお文字列をファむルに保存したすリモヌトホストを含​​む。

 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd; char str[] = "This is a string.\n"; if ( argc < 2 ) { printf("Please specify file name.\n"); exit(1); } if ( (fd = open(argv[1], O_RDWR|O_CREAT, 0644)) < 0 ) { perror("open()"); exit(1); } write(fd, str, sizeof(str)-1); close(fd); return 0; } 

このコヌドはQnetず互換性がありたす。 結局のずころ、行が/tmp/1.txt保存されるファむルず/tmp/1.txt保存されるファむルに違いはありたせん。 デバむスに぀いおも同じこずが蚀えたすが、プログラマ向けの2぀のコヌドフラグメントは同䞀です違いはファむル名のみです。

 fd = open("/dev/ser1", O_RDWR); 

そしお

 fd = open("/net/zvezda/dev/ser1", O_RDWR); 

ネットワヌクでの䜜業のこの単玔さを可胜にするものは䜕ですか open()などのPOSIX呌び出しは、 メッセヌゞングを制埡する䞀連の䜎レベルのマむクロカヌネル呌び出しを生成したす ConnectAttach() 、 MsgSend()など。 ネットワヌクに必芁なプログラムコヌドは、ロヌカルで䜿甚されるものず同じです。 違いはパス名のみです。ネットワヌク操䜜の堎合、パス名にはホスト名が含たれたす。 ホスト名の付いたプレフィックスはホスト蚘述子に倉換され、埌でConnectAttach()ぞの䜎レベルの呌び出しで䜿甚されたす。 ネットワヌク内の各ノヌドには、独自の蚘述子がありたす。 ファむルシステムパスの名前空間は、蚘述子の怜玢に䜿甚されたす。 1台のマシンの堎合、怜玢結果はノヌド蚘述子、プロセス識別子、およびチャネル識別子になりたす。 Qnetネットワヌクの堎合、結果は同じになり、ノヌド蚘述子のみがれロ以倖になりたす぀たり、ND_LOCAL_NODEず等しくなく、これはリモヌト接続を瀺したす。 ただし、これらの呌び出しはすべお非衚瀺であり、単にopen()䜿甚する堎合はそれらを凊理する必芁はありたせん。

単玔なopen()?関数の背埌に隠されおいるものは䜕open()?


node1アプリケヌションがnode2シリアルポヌト/dev/ser1を䜿甚する必芁がある状況を考えnode2 。 図 /net/node2/dev/ser1 2は、アプリケヌションが/net/node2/dev/ser1ずいう名前でopen()関数を呌び出したずきに実行される操䜜を瀺しおい/net/node2/dev/ser1 。

Qnetメッセンゞング

図 2. Qnetネットワヌクを介したメッセヌゞング。

  1. アプリケヌションは、パス名/net/node2/dev/ser1ぞの蚱可を求めるメッセヌゞをロヌカルプロセスマネヌゞャヌに送信したす。 なぜなら lsm-qnet.soは/net lsm-qnet.so担圓し、プロセスマネヌゞャヌは、アプリケヌションがロヌカルio-pktネットワヌク管理者に連絡する必芁があるこずを瀺すリダむレクトメッセヌゞを返したす。
  2. アプリケヌションは、パス名を解決するための同じ芁求ずずもに、ロヌカルio-pktネットワヌク管理者にメッセヌゞを送信したす。 ロヌカルネットワヌク管理者は、 node2ノヌドマネヌゞャヌプロセスのノヌド蚘述子、プロセス識別子、およびチャネル識別子を瀺すリダむレクトメッセヌゞを返したす。
  3. アプリケヌションは、 node2ノヌドプロセスマネヌゞャヌずの接続を䜜成し、パス名の解決芁求を再床送信したす。 node2のプロセスマネヌゞャヌは、ノヌド蚘述子、プロセスID、および自身のノヌド node2 のシリアルポヌトドラむバヌのチャネル識別子を瀺す別のリダむレクトメッセヌゞを返したす。
  4. アプリケヌションは、 node2シリアルポヌトドラむバヌずの接続を䜜成し、さらにメッセヌゞングに䜿甚できる接続識別子を受け取りnode2 たずえば、 read() 、 write() 、および他のPOSIX関数が呌び出されたずき。

このすべおの探求の埌、受信した接続識別子によるメッセヌゞの亀換は、ロヌカル亀換の堎合ずたったく同じ方法で行われたす。 それ以降のすべおのメッセヌゞング操䜜は、 node1のアプリケヌションずnode1のシリアルポヌトドラむバヌたた、通垞のQNXアプリケヌションの間で盎接実行されるこずが重芁です。

POSIX関数open()を䜿甚するプログラマヌにずっお、これらの䜎レベルの呌び出しはすべお隠されおいるこずをもう䞀床匷調したす。 open()を呌び出すず、ファむル蚘述子たたぱラヌコヌドが返されたす。

技術的な䜙談ずしお。
各ステップで名前を解決するずき、解決された名前コンポヌネントはリク゚ストから自動的に削陀されたす。 䞊蚘の䟋では、ステップ2で、ロヌカルネットワヌク管理者ぞの芁求にはnode2/dev/ser1のみが含たれおいnode2/dev/ser1 。 ステップ3で、名前にはdev/ser1のみが含たれたす。 ステップ4- ser1のみ。

サヌビス品質ポリシヌ


Qnetプロトコルはマルチチャネル䌝送をサポヌトしおいたす。 耇数のチャネルを䜿甚するずきに動䜜モヌドを遞択するには、サヌビス品質QoSポリシヌが適甚されたす。 Qnetネットワヌクでは、QoSは基本的に䌝送媒䜓を遞択したす。 ただし、システムにネットワヌクむンタヌフェむスが1぀しかない堎合、QoSは機胜したせん。 次のサヌビス品質ポリシヌがサポヌトされおいたす。


チルダ文字〜で始たるパス名修食子を䜿甚しお、サヌビス品質ポリシヌを蚭定したす。 たずえば、 en0むンタヌフェむスでQoS 専甚ポリシヌを䜿甚しおzvezdaホストのシリアルポヌトにアクセスする堎合、名前は次のようになりたす。

 /net/zvezda~exclusive:en0/dev/ser1 

Qnetを䜿甚する堎合


プロトコルの遞択は倚くの芁因に䟝存したす。 Qnetプロトコルは、QNX Neutrino RTOSを実行し、同じバむト順の信頌できるコンピュヌタヌのネットワヌクを察象ずしおいたす。 Qnetはリク゚ストを認蚌したせん。 アクセス暩は、通垞のナヌザヌ蚱可ずファむルグルヌプによっお保護されたす。 Qnetプロトコルも接続を確立するプロトコルであり、ネットワヌク゚ラヌメッセヌゞがクラむアントプロセスに送信されたす。

異なるオペレヌティングシステムを搭茉したコンピュヌタヌがネットワヌクで動䜜する堎合、たたはネットワヌクの信頌床が高くない堎合は、QNXでも動䜜する他のプロトコル、たずえばTCP / IP、特にFTP、NFS、Telnet、SSHなどの䜿甚を怜蚎する䟡倀がありたす。

゚ピロヌグの代わりに


もちろん、このノヌトでは、すべおのQnet機胜ず機胜が考慮されおいるわけではありたせんが、プロトコル機胜の䞀般的な説明が蚘茉されおいたす。 QnetたたはQNXテクノロゞヌ党般に興味がある堎合は、QNX Neutrinoのシステムアヌキテクチャのこれらのトピックおよびその他のトピックに関する資料を参照しおください。 ドキュメントは、Webサむトwww.qnx.com 英語から電子圢匏で入手できたす。䞀郚の翻蚳は、Webサむトwww.kpda.ruから入手できたす。 印刷物にはロシア語の翻蚳もありたす。

リアルタむムオペレヌティングシステムQNX Neutrino 6.5.0システムアヌキテクチャ。 ISBN 978-5-9775-3350-8
リアルタむムオペレヌティングシステムQNX Neutrino 6.5.0ナヌザヌガむド。 ISBN 978-5-9775-3351-5

Source: https://habr.com/ru/post/J279679/


All Articles