1. ホーム
  2. オペレーティングシステム
  3. バイオス

BIOSエントリーアドレス0xFFFF0について

2022-01-07 06:54:10

昔から、パソコンの電源を入れるとCSが0xFFFF、IPが0x0000になるので、アドレスが0xFFFF0になり、これがBIOSのエントリアドレスで、その後CPUがこのアドレスのコードを読み込んで、ブラブラと実行が始まると言われています。

さて、この0xFFFF0というアドレスはマザーボード上にあるのか、それともメモリ上にあるのか、気になるところです。一様なアドレスであれば、マザーボード上のROMを読みに行くのかもしれないと思いつつ、本の図を見るとRAMにあるように見えるし、もしメモリにあるのなら、いつ、どのプログラムがROMからメモリに読み込むのだろう。推測すると、ROMの内容をすべてメモリ上のセグメントの最上位ビットにコピーし、その後0xFFFF0は必ずメモリ上のアドレスを参照する、という処理を固定的にハードウェア実装しているはずです。

Baiduに記事があります。

640KB〜1MBの上位メモリ(この領域のアドレスはROMに割り当てられ、対応する384KBのRAMはマスクアウトされています。(いわゆるシャドーメモリ技術で、ROMの内容を対応するアドレスのRAMに読み込んで、後でシステムが元のROMからではなく、RAMからデータを読み出すことで高速化する)

1MB~ 拡張メモリ

注意事項

シャドーRAM Shadow RAMは、システムのメインメモリアドレス空間の一部を占有しています。アドレス範囲はC0000~FFFFFFで、1MBのメインメモリの768KB~1024KBの領域となります。Shadow RAM は、各種 ROM BIOS の内容を保存するために使用されます。ROMシャドウとも呼ばれ、ROM BIOSの"shadow"を指し、Shadow RAMと同じ意味である。現在では、コンピュータシステムの電源を入れると同時に、Shadow RAMの指定された領域にBIOS情報が読み込まれる。Shadow RAMは対応するROMと物理的にアドレスしているので、BIOSをアクセスする必要があるとき、ROMの代わりにShadow RAMだけをアクセスすればよく、コンピュータシステムの計算時間を大幅に短縮することができる。ROMへのアクセス時間は200ns程度が一般的で、DRAMへのアクセス時間は100ns以下、60ns以下、あるいはそれ以上となります。

Shadow RAM技術では、コンピュータシステムの動作中に、BIOSからデータを読み出したり、BIOSのプログラムモジュールを呼び出したりすることがかなり頻繁に起こることは間違いありませんが、Shadow RAM技術では、これが大幅に改善されるのです。

386以前と386以降ではこのアドレスは異なるが、どちらもシステムメモリの最上位アドレスセグメントである。CSセグメントは16ビット、EIPは32ビットなので、32ビットアドレスを得るために、386ではCSセグメントに隠しフィールドであるいくつかのフィールドを追加し、システムはGDT,IDTでセグメント選択サブフィールドを変更できるため、アドレス変換はセグメントアドレス+オフセットアドレスの4ビット左シフトではなく、CSのベースフィールド+オフセットアドレスで行われることになる。オフセット・アドレスです。

以下はその一例です。

システムの電源が入ると、システムがリセットされます。このとき、386以前のシステムでは、CS = F000H、IP = FFFF0H、Biosアドレスはセグメント・アドレスの4ビット左シフト + オフセット・アドレス squeeze、すなわちF0000H + FFF0H = FFFF0H となります。

386以前のシステムでアドレス可能な範囲は1MB、すなわち00000H~FFFFFHです。

386の下ではCS=F000H、IP=FFFF0Hと一定ですが、その後CScsの中身は。

セレクタ=F000H(これは見えている部分です)

非表示の部分は、この時点では、実アドレスモードなので、Biosアドレスは、386以前の

しかし、386は4GBすなわち00000000HからFFFFFFFFHの範囲でアドレス指定が可能です。このアドレス(000FFFF0H)をBiosアドレスとして使用すると、システムメモリが連続しないため、386はハードウェアでA20からA31のアドレスラインを1にセットし、FFFFFF0Hとし、これをBiosアドレスとして使用する。

この1へのセットにより、HiddenセクションのフィールドBase=FFFFF0000Hとなり、まだプロテクトモードになっておらず、ディスクリプタテーブルも作成されていないため、この操作を変更しても実装されない。これはハードウェアで実装されており、セグメント間のジャンプが行われた場合、1から0にするようになっているため、1を設定した結果を保存することができず、FFFFFF0Hでjmp , Base = 000000Hという命令を実行すると、その時点でBiosは1M以下のメモリを使用することになるのです。

エントリーアドレスの形成について、CS 0xFFFFとIP 0x0000の組み合わせとする記事と、CS 0xF000とIP 0xFFF0の組み合わせとする記事があります。最終的に形成されるエントリーアドレスが0xFFFF0であれば、ハードウェアによって初期化が異なるということもあるのでしょうね。もし、私の推測と違うのであれば、また追加して来てください。