LinuxでBochsを使用しています。正常に動作しますが、対処できていない問題があります。vga-info (使用可能なモード、リニア フレームバッファ (LFB) のアドレス) を取得し、リアル モードで 1024*768*24 に切り替えます。vga-info モードによると、118h (1024*768*24) がサポートされ、LFB は E000:0000 からのものです (つまり、segment:offset のため E0000、またはフラット アドレッシングでは 0xE0000000 ですが、そのメモリはほぼ 3.5 であるため存在しません)。 Gb)。その後、プロテクト モード (PM) に切り替えて E0000 にデータを書き込みましたが、ピクセルが表示されません。0xE0000000 に書き込んでも同様です。ただし、A0000 に書き込んでも、A0000-C0000 メモリ (128Kb) のみがマップされている場合はそうです。32 ビットと LFB (ページングなし) のため、PM を使用したいと思います。低解像度 (例: 320*200*256) のビデオメモリが A0000 にマップされていることを知っています。Bochs-config では、vbe が有効になっています (vga: 拡張子=vbe) . bochsout.txt には、「VBE Bochs Display Extension Enabled」と表示されます。
質問: なぜビデオメモリは E0000 ではなく A0000 からのものなのですか? ビデオメモリが 128Kb しかないのはなぜですか? (次のようになります: 1024*768*3 バイト、つまり 2.25 Mb)
この方法では、ページングなしで PM でグラフィックスを実行できないか、何か間違ったことをしています。
前もってありがとう、ロブ
http://wiki.osdev.org/Bochs_Graphics_Adaptorで何かを見つけました:
"リニア フレーム バッファ (LFB) の使用
リニア フレーム バッファを使用する場合、BGA はすべてのグラフィックス メモリをリニアに公開します。古いバージョンの Bochs と QEMU では、場所は 0xE0000000 (VBE_DISPI_LFB_PHYSICAL_ADDRESS) に固定されています。ただし、Bochs が ISA ビデオ カードではなく PCI ビデオ カードをエミュレートするように構成されている場合、フレームバッファーのアドレスは固定されなくなりますが、デバイス 0x1234:0x1111 の最初の PCI BAR から読み取ることができます。LFB を有効にするには、VBE_DISPI_LFB_ENABLED を使用します。 VBE 拡張機能を有効にする場合は、フラグ (0x40) (したがって、VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED (0x41) の値を書き込みます)。
QEMU は VBE_DISPI_LFB_ENABLED フラグに注意を払いません。リニア フレーム バッファとメモリ バンクの両方が常に使用可能です。Bochs は旗に注意を払います。LFB モードでは、バンクを変更する要求を無視し、バンク メモリに書き込んでも何も起こりません。バンク モードでは、LFB メモリに書き込んでも何も起こりません。"
Bochs は最大 1Gb のメモリをサポートしており、これははるかに大きいため、この 0xE0000000 を理解できません。ところで、--enable-vbe を指定して Bochs をコンパイルして vbe を有効にすることは非推奨です。bochs-configfile では代わりに「vga: extension=vbe」を使用する必要があります。
解決策が見つかりました (vbe モードの設定中にビット「use LFB」を設定):
移動斧、4F02h ; vbe モードを設定する
mov bx, 118h ; モード 1024*768*24
または bx, 0100000000000000b ; ビット 14 を設定 (LFB を使用)
整数 10h
そして、vga-modeinfo-block が言ったように、LFB は 0xE0000000 からです。