2017-02-15 6 views
0

私はioctlで遊んでいましたが、この質問は私に起こりました。なぜシステムコールの数が非常に限られていますか?

背景

  1. Iは、システムコールの主な動機は許さ割り込みハンドラの数は非常に限られているということであると言われました。多くのOSは1つの割り込み番号(Linuxの場合は0x80)を占有するシステムコール(a.k.a.トラップ)の抽象化を実装しますが、必要に応じて異なる機能を提供するために余分な引数を受け入れます。
  2. this threadは、システムコールの数が実際には非常に限られていることを示唆しているため、上記と同じ理由が再度適用されてioctlとなります。

私の質問です。なぜOSは単に十分なシステムコールを提供してioctlを取り除かないのですか? (または単にスケーラビリティを向上させるための階層構造を作成するだけですか?)

答えて

1

私の意見では、システムコールはオペレーティングシステムカーネルによってユーザーアプリケーションに提供される一連のサービスとみなされますが、ioctlは特定のデバイス(またはドライバ)にカスタムコマンドを送信できるこれらのサービスの1つだけです。

ドライバを開発するときは、ioctlリクエストを受け取るためのハンドラを記述することができます。独自のシステムコールを実装することによって、同じことを管理するいくつかの欠点があります。新しいシステムを追加する

  • 、あなたの実装があなたのドライバに固有の

    • 、他のコンポーネントは、おそらくそれを使用しないと、その容易ではありません呼び出します - Windowsの上WindowsではPatchguard(カーネルパッチプロテクション)、
    • のためにカーネルがI/Oバッファの "検証"を手伝ってくれるので実際には不可能です。自身のシステムコール。

    readwriteの一般化として、ioctlを表示できます。入力バッファと出力バッファの両方を、ターゲット(通常はカーネルドライバ)から要求された動作を定義する制御コードと共に提供することができる。

  • +0

    あなたの答えは前述の投稿よりも意味があると思います。システムコールは、OSがCPUと対話するためのカスタマイズ可能なハンドラのようなものですが、OS内の 'ioctl'は、ユーザスペースアプリケーションとカーネルとのやりとりのためのカスタマイズ可能なハンドラですか? – wlnirvana

    +0

    システムコールハンドラは、usermodeとkernelmodeの間の通信メカニズムとしてOSカーネルによって定義されています(CPUは、ユーザとカーネルモードの切り替えをより簡単で安価なものにする特別な命令を提供することで役に立ちます)。個々のシステムコールを実装するルーチンの固定配列として)。 'ioctl'やいくつかの他のシステムコールに代わって生成されたリクエストは、通常、ioctlターゲットを担当するドライバに送られるので、開発者は' ioctl'をある程度(カスタマイズして)カスタマイズすることができます。 –

    関連する問題