
基本的なオペレーティング システム クラスやビデオ シリーズなどをいくつか受講しましたが、OS ドライバーと BIOS ドライバーに関して疑問があります。基本的な OS は、各ハードウェアのメモリ アドレスをどのようにして認識するのでしょうか。OS は、どのコンピューターでもすぐに使用できるようにどのように動作するのでしょうか。誰もが知っている標準のデバイス メモリ レイアウトはありますか。それとも、OS は IVT をリダイレクトして BIOS デバイス ドライバーを指すようにするのでしょうか。このトピックに関する参考資料を教えてください。
答え1
基本的な OS は、各ハードウェアのメモリ アドレスをどのようにして認識するのでしょうか。OS は、どのコンピューターでもすぐに使用できる状態でどのように動作するのでしょうか。
CPU は実行する最初のアドレスのみを認識します。CPU がブートストラップするには、BIOS/ファームウェアがこのアドレスに「応答」する必要があります。
そして、メモリと I/O については (x86 にはメモリと I/O の 2 つの領域があることはご存知だと思いますが)、多くの標準がありました。
最初のPC時代
メモリ内にはBIOSデータエリアと呼ばれる半公式の領域がありました。そこにはCOMポートとLPTポートの数、フロッピードライブコントローラ、それらのベースI/Oアドレスなどに関する情報が含まれていました。OSはBIOS呼び出しも使用しました(文書化されたハードウェアにアクセスするために割り込みを使用する。マザーボードベンダーハードコードされたBIOS にアドレス指定します。一部のデバイスでは I/O アドレスが公式に文書化されています。
ISA のような拡張カードには、拡張カード BIOS 以外に検出されるツールはありませんでした。システム BIOS は、拡張カード BIOS を見つけて実行するために、特別なパターンのメモリをスキャンしました。カード BIOS は、ネットワーク ブートなどを有効にするために、BIOS 機能を「シャドウ」する割り込みベクトルとしてインストールされる場合があります。
BLASTER
多くの場合、ジャンパーを使用してカードを構成し、ソフトウェアに情報 (サウンド ブラスター パラメータの環境変数など)を提供するのはユーザーの責任でした。
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テーブルはマザーボードベンダーによって入力され、ファームウェアに保存されます(最新のファームウェアはない"BIOS ですが、エミュレートできます。
DSDT と呼ばれる特別なテーブルは、特別なラップトップ ボタン、ラップトップ バッテリー、ファン、PCI-Express ルート コンプレックスなど、あらゆるシステム デバイスを記述します。
デバイスは AML と呼ばれる言語で記述され、OS にはそのインタープリターが必要です。DSDT は、メモリ、IO、および「明るさの変更」などの操作を実行する「メソッド」(AML で記述) を記述する場合があります。
ACPI は巨大な仕様です。OS は DSDT を使用して内部の「デバイス ツリー」を埋め、「PCI-Express ルート コンプレックス」またはルート USB へのアクセスを取得すると、PCI-Express および USB プロトコルを使用してさらに列挙と構成を行います。カードはメモリ範囲 A と B をサポートしていると報告し、OS は「B」を使用するように構成します。
答え2
ほとんどのオペレーティング システムは、メモリ マネージャー、入出力、ファイル システム マネージャーなどのさまざまなコンポーネントで構成されています。数年前のモノリシック オペレーティング システムでは、すべてが一緒に構築されていました。ほとんどの最新のオペレーティング システムには、さまざまなコンポーネントを動的に変更する方法があります。一部のオペレーティング システム (マイクロ カーネル) には、オペレーティング システムの基本管理機能のみがあり、ファイル システムなどの追加コンポーネントのほとんどはアドオン パーツです。
現代のオペレーティングシステムも、ネットワークスタックのOSIモデルに似た一連のレイヤーで構築されています(https://en.wikipedia.org/wiki/OSI_モデル) は、実行されている実際のハードウェアから可能な限り独立性を確保するために使用されています。
したがって、オペレーティング システムは基本的に、具体的なハードウェア固有のモジュールが差し込まれる抽象的なマシンです。インターフェイス仕様があり、これは抽象的なマシンの説明になる傾向があり、ハードウェア固有のモジュールがオペレーティング システムに提供する制御、データ、およびサービスについて説明します。
したがって、特定のデバイス ドライバー スタックのインストーラーは、その特定の具体的なハードウェア要件とデバイスへのインターフェイスを認識しますが、オペレーティング システムはこれらの特定の具体的なハードウェア要件を認識しません。オペレーティング システムは、厄介なデバイス固有のすべての処理をデバイス ドライバー スタックに委任します。
「スタック」という言葉を使用するのは、実際のデバイス通信を実行する機能が通常、一連のレイヤーで構成されているためです。ほとんどのデバイスでは、特定のデバイスで使用されているドライバー ファイルのセットが表示される Windows デバイス マネージャーでこれを確認できます。
したがって、実際にはさまざまなベンダーから提供されるさまざまなソフトウェア コンポーネントが存在します。
したがって、オペレーティング システムがハードウェアの詳細を知りたい場合は、デバイス ドライバーにその詳細を要求します。
OS は、プラットフォームを構成する特定のハードウェアのベンダーが、具体的な特定のハードウェア上でオペレーティング システムが動作するために必要なドライバー スタックを提供するため、さまざまなハードウェア プラットフォームですぐに使用できます。
オペレーティング システムによって、オペレーティング システムが使用するデバイス ドライバーのインターフェイス仕様が異なります。したがって、Linux の場合は、Linux ドライバー インターフェイスを提供する Linux オペレーティング システム互換のドライバーが必要です。Windows の場合は、Windows インターフェイス ドライバーが必要です。
ドライバー スタックが存在するため、同じハードウェアが使用されている限り、スタック内の一部のソフトウェア コンポーネントは、異なるオペレーティング システム間で同じである可能性があります。ハードウェア デバイスと直接通信するレイヤーの部分は同じかもしれませんが、オペレーティング システムによってデバイス ドライバー インターフェイスが異なるため、実際のオペレーティング システムとインターフェイスする必要があるスタックの上位レベルは異なります。
オペレーティング システムに関する書籍は数多く出版されており、さまざまなオペレーティング システム用のオープン ソース プロジェクトも数多く存在します。
この議論を見てくださいhttps://www.quora.com/オペレーティングシステムに関するベストブックは何ですか?
無料のオンライン書籍は数多くあります。http://pages.cs.wisc.edu/~remzi/OSTEP/
オープンソースのオペレーティングシステムに関するこのgithubページをご覧くださいhttps://github.com/showcases/open-source-operating-systems
答え3
現代のPCでは、各ハードウェアは、質問されると自分自身に関する基本的な情報を報告します。たとえば、多くの周辺機器がPCに接続されています。PCIバスOSがPCIバスに接続されている周辺機器を知りたい場合、OSはバス上で各周辺機器に説明を送信するよう命令を送ります。これは列挙するバス上のデバイス。この説明では、各デバイスモデルを識別するために、数値コードを使用します。PCI IDOS は、特定の PCI ID を持つデバイスが存在することを検出すると、その PCI ID のドライバーをロードしようとします。OS にドライバーがない場合、ドライバーのダウンロードを試みるか、不明なデバイスが存在することをユーザーに報告します。
たとえば、Linuxでは、コマンドを実行しlspci
てPCIデバイスを一覧表示できます。さまざまな情報を表示するためのさまざまなオプションがあるので、興味があれば試してみてください。LinuxがPCIデバイスのドライバーをロードするために使用するメカニズムについては、この答えこれは単なる一例です。他の PC オペレーティング システムでも同じことを実行するメカニズムがありますが、そのメカニズムはまったく異なる場合があります。
OS はどのようにして PCI バスが存在すること、またそのバスにアクセスする方法を知るのでしょうか。PC アーキテクチャ用に構築する場合、これはハードコードされていると思います。「PC アーキテクチャ」は「x86 CPU」よりも具体的であることに注意してください。x86 CPU の周りに別のバス セットを配置することもできますが、その場合は (最新の) PC とは呼ばれません。
マシンのアーキテクチャによって、存在するドライバを列挙する方法があるかどうかは異なります。たとえば、1990年代半ばまでのPCにはそのような方法はありませんでした。PCIバスが登場する前は、ISAバスISA バスでは、特定のアドレスにデバイスが存在するかどうかを知りたい場合は、デバイスにコマンドを送信します。理解できる応答が返ってきたら、それでいいのですが、コマンドによってコンピューターがロックしたり、まったく別の周辺機器があるために予期しない結果が生じたりした場合は、困ったものです。1908 年代の PC では、OS は BIOS に構成されているデバイスについて問い合わせていました (ただし、BIOS はすべてのデバイスをリストするのではなく、BIOS が認識しているデバイス タイプのみをリストしていました)。また、拡張カードをインストールしたユーザーは、BIOS または OS 構成で構成の詳細を提供する必要がありました。BIOS にはキーボードと画面用の基本ドライバーがいくつか含まれており、DOS などのオペレーティング システムはそれらのドライバーを呼び出していました。他の OS (またはアプリケーション) はハードウェアに直接アクセスすることがありました (特にディスプレイの場合。BIOS ドライバーは低速で制限されていたため)。
現在でも、ほとんどの組み込みシステムには、内蔵の周辺機器を列挙する方法がありません。多くのデバイス(特にARMベースですが、それだけではありません)は、周辺機器を「デバイスツリーこのデータ構造はROMまたはフラッシュメモリに保存され、ブートローダー(BIOS に相当) はデータをオペレーティング システムに伝達します。この方法では、OS を特定のデバイス セット用に構築する必要はなく、起動時にこの情報を読み取ります。