web-dev-qa-db-ja.com

オペレーティングシステムドライバーとBIOSドライバー

私はいくつかの基本的なオペレーティングシステムのクラス、ビデオシリーズなどを経験しましたが、OSドライバーとBIOSドライバーに関してこの質問があります。基本的なOSはどのようにして各ハードウェアのメモリアドレスを知るのですか? OSはどのコンピュータでもすぐに使用できます。誰もが知っている標準的なデバイスメモリレイアウトはありますか?または、OSはそのIVTをBIOSデバイスドライバーを指すようにリダイレクトしますか?このトピックの読み物を教えてください。

2
bwjohns4

基本的なOSはどのようにして各ハードウェアのメモリアドレスを知るのですか? OSはどのコンピュータでもすぐに使用できます。

CPUは、実行する最初のアドレスのみを認識しています。 BIOS /ファームウェアは、CPUがブートストラップするために、このアドレスに「応答」する必要があります。

また、メモリとI/O(x86にはメモリとI/Oの2つのスペースがあることをご存知だと思いますか?)には、多くの標準がありました。

最初のPC時代

BIOS DATAAREAと呼ばれるメモリ内の半公式エリアがありました。 COMポートとLPTポートの数、フロッピードライブコントローラー、それらのベースI/Oアドレスなどに関する情報が含まれていました。 OSは、BIOS呼び出し(文書化割り込み)も使用してハードウェアにアクセスしました。マザーボードベンダーハードコードされた BIOSに対応しています。一部のデバイスには、I/Oアドレスが公式に文書化されていました。

ISAのような拡張カードには、拡張カードBIOS以外に検出されるツールがありませんでした:システムBIOSは、拡張カードBIOSを見つけて実行するために、メモリをスキャンして特別なパターンを探しました。カードBIOSは割り込みとしてインストールされる場合があります。ネットワークブートなどを有効にするためにBIOS機能を「シャドウ」するverctor。

多くの場合、ジャンパーを使用してカードを構成し、ソフトウェアに情報を提供するのはユーザーの責任でした(サウンドブラスターパラメーターのBLASTER env変数など)。

PnP時代

PnPは、ハードウェア検出に関する仕様のパックです。 ISA PNP、COM PORT PNP、LPT PNPなどがありました。仕様では、接続されているデバイスとデバイスの動作を確認するためにソフトウェアが実行する必要があることを説明しています。PCIなどの一部のバスにはPNP機能が組み込まれています。 。ソフトウェアは、PCI上のすべてのカードを列挙し、必要なリソース、ベンダーとクラス(ドライバーを見つけるため)などについて尋ねてから、それらを構成する場合があります。列挙はUSBでも可能です。

この場合の「ソフトウェア」は、PNPBIOSまたはPNP対応OSの場合があります。そのため、BIOSはその仕様を使用してブートデバイスとPCIホストブリッジ(PCIバスの「ルート」)を検索し、この情報をメモリ内の特別なテーブルに保存し(PNPBIOS仕様に従って)、OSはそれらを読み取り、PCIおよびUSB機能を使用して列挙およびデバイスを有効にします(PCIおよびUSBプロトコルが文書化されています)。

ACPI時代

ACPIテーブルはマザーボードベンダーによって入力され、ファームウェアに保存されます(最新のファームウェアはnot " BIOSですが、エミュレートできます)。

DSDTと呼ばれる特別な表は、特別なラップトップボタン、ラップトップバッテリー、ファン、PCI-Expressルートコンプレックスなどを含むすべてのシステムデバイスを説明しています。

デバイスはAMLと呼ばれる言語で記述されており、OSにはそのインタープリターが必要です。 DSDTは、メモリ、IOおよび「メソッド」(これもAMLで記述)を記述して、「明るさの変更」などを実行する場合があります。

ACPIは巨大なスペックです。 OSはDSDTを使用して内部の「デバイスツリー」を埋め、「PCI-Expressルートコンプレックス」またはルートUSBへのアクセスを取得すると、PCI-ExpressおよびUSBプロトコルを使用してさらに列挙および構成を行います。カードはメモリをサポートしていると報告する場合があります範囲AとB、およびOSは「B」を使用するように構成します。

2
user996142

ほとんどのオペレーティングシステムは、メモリマネージャ、入出力、ファイルシステムマネージャなどのさまざまなコンポーネントで構成されています。数年前、モノリシックオペレーティングシステムでは、すべてが一緒に構築されていました。最新のオペレーティングシステムのほとんどには、さまざまなコンポーネントを動的に変更する方法があります。一部のオペレーティングシステム、マイクロカーネルには、オペレーティングシステムの基本的な管理機能があり、ファイルシステムなどの追加コンポーネントのほとんどがパーツに追加されています。

最新のオペレーティングシステムも、ネットワークスタックのOSIモデル( https://en.wikipedia.org/wiki/OSI_model を参照)のような一連のレイヤーで構築されており、それらが実行されている実際のハードウェア。

したがって、オペレーティングシステムは基本的に、具体的なハードウェア固有のモジュールが接続された抽象マシンです。ハードウェア固有のモジュールがオペレーティングシステムに提供する制御とデータおよびサービスを説明する、抽象マシンの説明になりがちなインターフェイス仕様があります。

したがって、特定のデバイスドライバースタックのインストーラーは、その特定の具体的なハードウェアのニーズとデバイスへのインターフェイスを認識していますが、オペレーティングシステムはこれらの特定の具体的なハードウェアのニーズを認識していません。オペレーティングシステムは、すべての危険なデバイス固有のものをデバイスドライバスタックに委任します。

実際のデバイス通信を実行する機能は通常、一連のレイヤーで構成されているため、「スタック」という言葉を使用します。これは、特定のデバイスで使用されているドライバーファイルのセットを表示するほとんどのデバイスのWindowsデバイスマネージャーで確認できます。 enter image description here

そのため、実際にはさまざまなベンダーから提供されている可能性のあるさまざまなソフトウェアコンポーネントがあります。

したがって、オペレーティングシステムがハードウェアの詳細を知りたい場合は、デバイスドライバーにそれらの詳細を要求します。

プラットフォームを構成する特定のハードウェアのベンダーが、オペレーティングシステムが具体的で特定のハードウェアで動作するために必要なドライバースタックを提供するため、OSはさまざまなハードウェアプラットフォームでそのまま動作します。

オペレーティングシステムが異なれば、オペレーティングシステムが使用するように設計されているデバイスドライバーのインターフェイス仕様も異なります。したがって、Linuxの場合、Linuxドライバーインターフェイスを提供するLinuxオペレーティングシステム互換のドライバーが必要です。 Windowsの場合、Windowsインターフェイスドライバーが必要です。

ドライバースタックがあるため、同じハードウェアが使用されている限り、スタック内のソフトウェアコンポーネントの一部が異なるオペレーティングシステム間で同じである可能性があります。ハードウェアデバイスと直接通信するレイヤーの部分は同じでもかまいませんが、スタックの上位レベル、つまり実際のオペレーティングシステムにインターフェイスする必要がある部分は、オペレーティングシステムごとにデバイスドライバーインターフェイスが異なるため、異なります。

オペレーティングシステムについてはたくさんの本があり、さまざまなオペレーティングシステム用のオープンソースプロジェクトがたくさんあります。

このディスカッションをご覧ください https://www.quora.com/What-is-the-best-book-on- Operating-systems

http://pages.cs.wisc.edu/~remzi/OSTEP/ のような無料のオンラインブックがたくさんあります。

そして、オープンソースオペレーティングシステムについてのこのgithubページを見てください https://github.com/showcases/open-source-operating-systems

0

最近のPCでは、ハードウェアの各部分は、要求されたときにそれ自体に関するいくつかの基本的な情報を報告します。たとえば、多くの周辺機器が PCIバス に接続されています。 OSがPCIバスに接続されている周辺機器を知りたい場合、OSはバス上で命令を送信し、すべての周辺機器に説明を送信するように要求します。これは、バス列挙(上のデバイス)と呼ばれます。この説明では、数値コードを使用して、 PCI ID と呼ばれる各デバイスモデルを識別します。 OSは、特定のPCI IDを持つデバイスが存在することを確認すると、そのPCIIDのドライバーをロードしようとします。 OSにドライバーがない場合は、ドライバーをダウンロードするか、不明なデバイスが存在することをユーザーに報告することができます。

たとえば、Linuxでは、コマンドlspciを実行してPCIデバイスを一覧表示できます。さまざまな種類の情報を表示するためのさまざまなオプションがあり、興味がある場合は少し遊んでください。 LinuxがPCIデバイスのドライバーをロードするために使用するメカニズムを この回答 で説明します。これはほんの一例です。他のPCオペレーティングシステムにも同じことを行うメカニズムがありますが、そのメカニズムは完全に異なる場合があります。

OSは、PCIバスがあることをどのように認識し、バスにアクセスする方法を教えてくれますか? PCアーキテクチャ用にビルドする場合、これはハードコーディングされていると思います。 「PCアーキテクチャ」は「x86CPU」よりも具体的であることに注意してください。x86CPUの周囲に異なるバスのセットを配置することはできますが、その場合、(最新の)PCとは呼ばれません。

異なるマシンアーキテクチャには、存在するドライバを列挙する方法がある場合とない場合があります。たとえば、1990年代半ばまでのPCにはそのような方法がありませんでした。 PCIバスの前には、 ISAバス がありました。 ISAバスで、デバイスが特定のアドレスに存在するかどうかを知りたい場合は、そのデバイスにコマンドを送信します。理解できる答えが得られた場合は、問題ありません。コマンドの場合1908年代のPCでは、OSは構成されたデバイスについてBIOSに問い合わせました(ただし、BIOSはすべてのデバイスを一覧表示せず、デバイスタイプのみを一覧表示しました)。 BIOSが知っていること)、および拡張カードをインストールしたユーザーは、BIOSまたはOS構成のいずれかで構成の詳細を提供する必要がありました。BIOSには、キーボードと画面用のいくつかの基本的なドライバー、およびDOSなどのオペレーティングシステムが含まれていました。これらのドライバー。他のOS(またはアプリケーション)がハードウェアに直接アクセスする可能性があります(特に、BIOSドライバーは低速で制限されているため、表示用)。

今日でも、ほとんどの組み込みシステムには、組み込みの周辺機器を列挙する方法がありません。多くのデバイス(特にARMベースですが、それらだけではありません)は、 デバイスツリー と呼ばれるデータ構造で周辺機器を記述します。このデータ構造はROMまたはフラッシュメモリに格納され、 ブートローダー (BIOSに相当))がデータをオペレーティングシステムに通信します。このようにして、OSは特定のデバイスセット用に構築する必要があります。起動時にこの情報を読み取ります。