Linux では、デバイス ファイルはデバイス ドライバーへのインターフェイスであり、アプリケーションが標準入出力システム コールを通じてデバイス ドライバーを使用してデバイスと対話できるようにします。 Linux システムで一般的に使用されるデバイス ファイルには、キャラクタ スペシャル ファイルとブロック スペシャル ファイルの 2 つがあり、これらの違いは、オペレーティング システムとハードウェアによって読み書きされるデータ量にあります。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
デバイス ファイルの概要
Unix 風の場合操作 システムでは、 デバイス ファイルまたは特殊ファイルはデバイス ドライバーへのインターフェイス であり、ファイル システム内では通常のファイルであるかのように表示されます。 MS-DOS、OS/2、および Microsoft Windows にも特殊なファイルがあります。 これらの特別なファイルにより、アプリケーションは、標準入出力システム コールを通じてデバイス ドライバーを使用してデバイスと対話できるようになります。 標準システム コールを使用すると、多くのプログラミング タスクが簡素化され、デバイスの機能に関係なく、一貫したユーザー空間 I/O メカニズムが有効になります。
デバイス ファイルは通常、標準デバイス (プリンターやシリアル ポートなど) への単純なインターフェイスを提供しますが、これらのデバイス上の特定の一意のリソース (ディスク パーティションなど) にアクセスするために使用することもできます。 。さらに、デバイス ファイルは、データ シンクや乱数ジェネレーターなど、実際のデバイスに関連付けられていないシステム リソースにアクセスするのに役立ちます。
図 1 アプリケーション、ブロック ファイル、ドライバー、ハードウェアの関係
Unix 系オペレーティング システムでは、一般的に使用される 2 つのデバイスがあります。ファイルは、キャラクタ スペシャル ファイルおよびブロック スペシャル ファイルと呼ばれます。 これらの違いは、オペレーティング システムとハードウェアによって読み書きされるデータの量です。デバイス特殊ファイルと呼ばれる名前付きパイプとは異なり、名前付きパイプはデバイスに接続されていませんが、通常のファイルでもありません。
一部の Unix 系システムでは、ほとんどのデバイス ファイルは、伝統的に /dev にマウントされている仮想ファイル システムの一部として管理されており、ハードウェアの追加と削除を監視する制御デーモンに関連付けられている可能性があります。ランタイムを実行し、デバイス ファイル システムに対応する変更を加えます。デバイス ファイル システムへの変更がカーネルによって自動的に完了しない場合、制御デーモンは、特別なデバイス要件を処理するためにシステムまたはユーザー空間内のスクリプトを呼び出すことがあります。
FreeBSD および DragonFly BSD 実装では、仮想デバイス ファイル システムに devfs という名前が付けられ、関連するデーモンには devd という名前が付けられています。 Linux では主に udev と呼ばれるユーザー空間実装が使用されますが、さまざまなバリエーションがあります。 Darwin やそれに基づく macOS などのオペレーティング システムは、純粋にカーネル ベースのデバイス ファイル システムを備えています。
chroot プロセス分離をサポートする Solaris コンテナなどの Unix システムでは、通常、各 chroot 環境に独自の /dev が必要です。これらのマウント ポイントはグローバル ファイル システム ツリーに個別に配置されます。ノード上のホスト オペレーティング システム上。ハードウェアの分離は、デバイス ノードの数を /dev の chroot インスタンスに制限することで、chroot 環境によって強制できます (プログラムはハードウェアに接続できず、名前を参照したりアクセスしたりすることもできません。これは Unix ファイルよりも強力なアクセス制御です)システム権限フォーム)。
デバイス ノードは、オペレーティング システム カーネルによって割り当てられたリソースに対応します。 Unix は、これらのリソースをメジャー番号とマイナー番号によって識別し、両方ともノード構造の一部として保存されます。これらの番号の割り当ては、オペレーティング システムやコンピュータ プラットフォームごとに独自に行われます。通常、メジャー番号はデバイス ドライバーを識別し、マイナー番号はドライバーが (おそらく多くのデバイスにわたって) 制御する特定のデバイスを識別します。この場合、システムはマイナー番号をドライバーに渡すことがあります。ただし、動的に割り当てられる番号の場合、これは当てはまらない場合があります (例: FreeBSD 5 以降)。
他の特殊なファイル タイプと同様、コンピュータ システムは標準システム コールを使用してデバイス ノードにアクセスし、それらを通常のコンピュータ ファイルとして扱います。デバイス ファイルには 2 つの標準タイプがありますが、残念ながら、歴史的な理由により、それらの名前は直観に反しているため、2 つの違いを説明するのは間違っていることがよくあります。
#ブロック ファイルの分類
キャラクター デバイス (キャラクター デバイス)
##キャラクター特殊ファイルまたはキャラクター デバイスは、ハードウェア デバイスへのバッファなしの直接アクセスを提供します。これらは、必ずしもプログラムが一度に 1 文字の読み取りまたは書き込みを許可するわけではありません。これは、対象のデバイスによって異なります。たとえば、ハードディスクのキャラクタ デバイスでは、通常、すべての読み取りおよび書き込み操作がブロック境界に合わせて調整される必要があり、個々のバイト読み取りは決して許可されません。 キャラクタ デバイスは、ブロックベースのハードウェア上のキャラクタ デバイスが通常、位置合わせされたブロックの読み取りおよび書き込みを行うプログラムを必要とするという事実に関連する混乱を避けるために、raw デバイスと呼ばれることもあります。 ブロック デバイス (ブロック デバイス) ブロック特殊ファイルまたはブロック デバイスは、ハードウェア デバイスへのバッファされたアクセスを提供します。いくつかの抽象的な詳細を提供します。キャラクタ デバイスとは異なり、ブロック デバイスでは、プログラマは常に、任意のサイズ (単一の文字/バイトを含む) および任意の配置のブロックの読み取りまたは書き込みを許可します。欠点は、ブロック デバイスはバッファリングされているため、書き込みデータがカーネルのバッファから実際のデバイスに渡されるまでにどれくらい時間がかかるか、あるいは実際に 2 つの別々の書き込みがどのような順序で物理デバイスに到着するかがプログラマには分からないことです。 ?さらに、同じハードウェアがキャラクタ デバイスとブロック デバイスを公開する場合、キャラクタ デバイスを使用するクライアントがブロック デバイスのバッファ内で行われた変更を認識しないため、データが破損するリスクがあります。 擬似デバイス擬似デバイス Unix 系システム上のデバイス ノードは、必ずしも物理デバイスと同様に対応。この対応関係を持たないノードは、一連の疑似デバイスを形成します。これらは、オペレーティング システムによって処理されるさまざまな機能を提供します。最も一般的に使用される (キャラクターベースの) 擬似デバイスには次のものがあります。 ノードが作成されました ノードが作成されましたmknod システムによって create を呼び出します。ノードの作成に使用されるコマンド ライン プログラムは、mknod とも呼ばれます。通常のファイル システム呼び出し (名前変更、リンク解除) とコマンド (mv、rm) により、ノードを移動または削除できます。デバイス ノードをコピーするときにオプション -R または -a を渡すと、cp -l コマンドは元のデバイス ノードと同じプロパティを持つ新しいデバイス ノードを作成します。 一部の Unix バージョンには、必要なすべてのデバイスをディレクトリ /dev に作成する makedev または MAKEDEV というスクリプトが含まれています。これは、デバイスにメジャー番号が静的に割り当てられているシステム (カーネル モジュールにハードコーディングするなど) でのみ意味を持ちます。 ブロック ファイルの命名規則 デバイスのタイプを識別するために、/dev 階層内の特定のデバイスの名前で次の接頭辞が使用されます。 : Linux で使用されるプレフィックスの正規リストは、Linux オペレーティング システムに割り当てられたデバイス番号と /dev ディレクトリ ノードの公式レジストリである Linux Device List にあります。 ほとんどのデバイスでは、このプレフィックスの後に、特定のデバイスを一意に識別する番号が続きます。ハードドライブの場合、文字はデバイスの識別に使用され、数字はパーティションの識別に使用されます。したがって、ファイル システムは /dev/sda3 を通じてディスク上の領域を見つけることができ、/dev/pts/14 をネットワーク化された端末セッションに関連付けます。 デバイス ファイルを操作するための関連コマンド mknod Everyone組み込みに興味がある場合は、このコマンドの使用方法を自分で確認してください。 関連する推奨事項: 「Linux ビデオ チュートリアル 」/ dev / null - 接受并放弃所有输入; 不产生输出(总是在读取时返回文件结束指示)
/ dev / zero - 接受并放弃所有输入; 产生连续的NUL(零值)字节流
/ dev / full - 读取时会产生连续的NUL(零值)字节流,并在写入时返回“磁盘已满”消息
/ dev / random和/ dev / urandom - 它们产生一个可变长度的伪随机数字流。
lp:行式打印机(比较lp)
pt:伪终端(虚拟终端)
tty:终端
一些额外的前缀已经在一些操作系统中普遍使用:
fb:帧缓冲区
fd :(平台)软盘,尽管这个缩写也常用来指文件描述符
高清:(“经典”)IDE驱动程序(以前用于ATA硬盘驱动器,ATAPI光盘驱动器等)
hda:第一个ATA通道上的主设备(通常由主编号3和次编号0标识)
hdb:第一个ATA通道上的从属设备
hdc:第二个ATA通道上的主设备
hdc1:此磁盘上的第一个主分区(示例)
hdc5:扩展分区中的第一个逻辑驱动器(示例)
hdd:第二个ATA通道上的从属设备
parport,pp:并行端口
SCSI驱动程序,也被libATA(现代PATA / SATA驱动程序),USB,IEEE 1394等使用。
sd:大容量存储驱动程序
sda:首次注册的设备
sda4:此磁盘上的最后一个分区(示例)
sda6:扩展分区中的第二个逻辑驱动器(示例)
sdb,sdc等:第二,第三等注册设备
ses:机箱驱动程序
sg:通用SCSI层
sr:“ROM”驱动程序(面向数据的光盘驱动器; scd只是一个辅助别名)
st:磁带驱动器
tty:终端
ttyS :(平台)串口驱动程序
ttyUSB:USB串口转换器,调制解调器等
以上がLinuxデバイスファイルとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。