Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> Linuxシステムにioctl関数を実装する方法

Linuxシステムにioctl関数を実装する方法

  
                

ioctl関数は主にI /Oデバイスの制御に使用されますが、カーネルとデータを交換するための一般的なユーザー空間の方法を実装することができます。以下の小シリーズでは、Linuxでのioctl関数の具体的な使用法を紹介します。

Linuxカーネルのコンセプト

Linuxは、最も人気のある無料のコンピュータのオペレーティングシステムのカーネルです。 POSIX標準に準拠した、C言語で書かれたUnixライクなオペレーティングシステムです。 Linuxはフィンランドのハッカー、Linus Torvaldsによって最初に開発され、Intel x86アーキテクチャ上で無料および無料のUnixライクオペレーティングシステムを提供しようとしています。このプログラムは、プログラムの初期の段階でMinixハッカーの支援を受けて1991年に始まりました。そして今日、世界中の無数のプログラマーがこのプログラムを無料で手伝っています。厳密に言えば、Linuxはカーネルです。 「コア」とは、ハードウェア抽象化層、ディスクおよびファイルシステムの制御、マルチタスキングなどを提供するシステムソフトウェアを指す。カーネルは完全なオペレーティングシステムではありません。 Linuxカーネルに基づく完全なオペレーティングシステムは、Linuxオペレーティングシステム、またはGNU /Linuxと呼ばれます。

ioctl関数がドライバに含まれているのは、ioctlが使用されるケースが他にあるかどうかわからないため、説明の範囲を指定します。なぜあなたは記事を書きたいのですか?私はしばらく前に私がioctlに混乱していたからです。

まず、ioctlとは何ですか。

ioctlは、デバイスのI /Oチャネルを管理するデバイスドライバ内の機能です。いわゆるI /Oチャネル管理は、シリアルポートの伝送ボーレート、モータの速度など、デバイスの特性の一部を制御することです。呼び出し回数は次のとおりです。

int ioctl(int fd、ind cmd、…);

ここで、fdは、ユーザープログラムがデバイスを開いたときにopen関数によって返されるファイル識別子です。これはデバイスへのユーザプログラムの制御コマンドで、次の省略記号はcmdの有無にかかわらず、通常は多くても1つの補足パラメータです。

ioctl関数はファイル構造内のプロパティコンポーネントです。つまり、ドライバがioctlをサポートしている場合、ユーザーはioctl関数を使用してユーザープログラムでデバイスのI /Oチャネルを制御できます。

2番目に、ioctlの必要性

ioctlが必要ない場合は、デバイスのI /Oチャネルの制御も可能ですが、それは非常に困難です。たとえば、ドライバにwriteを実装するときに特別な契約データフローがあるかどうかを確認できます。その場合は、制御コマンドに従います(通常はソケットプログラミングで行われます)。しかし、これを行うと、コードが分からなくなったり、プログラムが混乱したりするため、プログラマーはめまいがすることになります。

そのため、ioctlを使用して制御機能を実装します。ユーザープログラムが実行するのは、コマンドコードによってドライバに必要なことを伝えることであることに注意してくださいこれらのコマンドの解釈方法と実装方法については、これがドライバの動作です。

3番目に、ioctlを実現する方法

これは非常に面倒な問題です。私は州を救うことができます。明確にするために、4、5000語はできないので、ここではあまり明確にすることはできませんが、読者がユーザープログラムとドライバーの関係に興味がある場合は、私の以前のものを見ることができます。聴衆によって書かれた「書き込みの謎」。読者は単にwriteをioctlに置き換えて、ユーザープログラムのioctlがドライバ内のioctl実装とどのように関連しているかを知っているだけです。

「Linux Device Drivers」という本は非常に明確になっていると思いますので、ここで私は一般的な考えを述べるためにここにいます、しかしそれを見るのにはしばらく時間がかかります。

ドライバに実装されているioctl関数の本体には、実際にはswitch {case}構造体があります。各caseはコマンドコードに対応し、対応する操作を実行します。これらの操作を実装する方法は、これはプログラマ自身の事業です、機器は特定のものであるため、言うことはできません。 ioctlのコマンドコードがユーザープログラムコマンドとドライバサポートに連絡する唯一の方法であるので、キーはコマンドコードを組織する方法です。

コマンドとデバイスを1対1で対応させる必要があるため、コマンドコードの構成は多少正確です。正しいコマンドが間違ったデバイスに送信されないようにするか、エラーが発生します。コマンドが正しいデバイスに送信されたか、間違ったコマンドが間違ったデバイスに送信されました。これらのエラーは予測不可能なことにつながる可能性があり、プログラマーがこれらの奇妙なことを発見したときにエラーを見つけるためにプログラムをデバッグすることは非常に困難です。

そのため、Linuxカーネルでは、次のようにコマンドコードを定義します。

____________________________________

Copyright © Windowsの知識 All Rights Reserved