4

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 からです。

4

1 に答える 1

0

ビデオ メモリの異なるアドレスを持つ異なるビデオ モードがあります。リアル モードでビデオ モードを変更するには、int 0x10 を使用してみてください。

于 2016-07-22T18:36:35.477 に答える