問題タブ [vesa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 起動時に 1024x768x24bpp に切り替える (ベアメタル OS)
しばらくの間、ベア メタル OS について学ぶことに興味があり、QEMU で動作する基本的なテキスト シェルを提供する Eugene Obrezkov による素晴らしい GitHub を見つけました。ただし、VirtualBoxで実行することはできませんでした。
https://github.com/ghaiklor/ghaiklor-os-gcc
それを拡張して、たとえば 1024x768x24bpp で実行される単純な起動スプラッシュ スクリーンを追加したいと考えています。現代のコンピューターでこれを行う標準的な方法は何ですか?
ただし、この質問はいくつかの質問をするようなものです。:(
VBE3 について読む必要がありますか? ここで読んでいるドキュメントがあります:
https://pdos.csail.mit.edu/6.828/2011/readings/hardware/vbe3.pdf
また、UEFI のグラフィック モードについて少し説明している VBE3 を使用しないように指示しているこの SE も調べましたが、QEMU または VirtualBox でテストする Bare Metal OS に適用できますか?
アセンブリ - UEFI でグラフィックス モードを設定する方法 (VGA なし、BIOS なし、非推奨なし)
Eugene の最初のソースに基づく答えが VBE3 または UEFI のいずれかを使用することである場合、リアル、保護、またはロングのどのモードにする必要がありますか? これは、モードの切り替えについて私が見つけたものです。
https://www.codeproject.com/Articles/45788/The-Real-Protected-Long-mode-assembly-tutorial-for
nasm - VBE 情報の取得
最近、OS のグラフィックに vbe を使い始めました。リアル モードの場合、vbe 情報ブロック構造体はビデオ モード リストへのポインターを返します。このポインターの 16 進値を表示すると、次のようになります。
このアドレスにアクセスできないため、このアドレスのデータをリアル モードで取得する方法を知りたいです。これを行う方法を知っている人はいますか?
c - Retrieve list of VESA video modes from Int 10h/AX=4F00h
I am trying to develop a proof-of-concept os. Howsoever in the process one of the problems I encounter is the vesa video modes. It seems there is a lack of hardcoded video modes numbers after vesa told us to get them from vbe bios information and find the one that fits our needs. However I am unable to receive the video modes as I don't know how to use vbeFarPtr
from C kernel in 32 bit
Here is my kernel code:
I passed a VbeInfoBlock
as a parameter to the kernel from my second stage bootloader after receiving the information with int 0x10 ax=0x4f00
The VbeInfoBlock is defined a follows if you dont know
I couldn't understand the problem. Are there any other way of doing it? Or is my way correct but my code is incorrect?
I think the problem is that video_modes part in VbeInfoBlock
is defined as a segment:offset pair. I don't know how to use it in 32 bit C code.
(You can request my second stage bootloader or my original bootloader but for this problem I think it is unnecessary)
EDIT:
The code I tried after Brendan's answer
and my gdt
Edit 2:
Image
Edit 3:
Code I used:
and screenshot of my output without itoa
Edit4:
gcc -v
C:\Users\Asus>gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=D:/MinGW/mingw32/bin/../libexec/gcc/i686-w64-mingw32/8.1.0/lto-wrapper.exe Target: i686-w64-mingw32 Configured with: ../../../src/gcc-8.1.0/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/c/mingw810/i686-810-win32-dwarf-rt_v6-rev0/mingw32 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-sjlj-exceptions --with-dwarf2 --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/i686-w64-mingw32-static --with-pkgversion='i686-win32-dwarf-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/i686-810-win32-dwarf-rt_v6-rev0/mingw32/opt/include -I/c/mingw810/prerequisites/i686-zlib-static/include -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/i686-810-win32-dwarf-rt_v6-rev0/mingw32/opt/include -I/c/mingw810/prerequisites/i686-zlib-static/include -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/i686-810-win32-dwarf-rt_v6-rev0/mingw32/opt/include -I/c/mingw810/prerequisites/i686-zlib-static/include -I/c/mingw810/prerequisites/i686-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/i686-810-win32-dwarf-rt_v6-rev0/mingw32/opt/lib -L/c/mingw810/prerequisites/i686-zlib-static/lib -L/c/mingw810/prerequisites/i686-w64-mingw32-static/lib -Wl,--large-address-aware' Thread model: win32 gcc version 8.1.0 (i686-win32-dwarf-rev0, Built by MinGW-W64 project)
編集5:
assembly - VBEデータを正しく取得するには? int 10h/ax=4F で
ウェブからいくつかの情報とコードを使用してビルドするコードを取得しましたが、少なくとも 100 回試行し、mode_info
andvbe_info
構造を書き直しました。正しい値を取得できません。vbe3.pdf を見ましたが、dd ?
anddb ?
を使用しています。で作業しないでください。いくつかのサイトでとデータ構造NASM
の異なるバイト サイズを見つけたので、私が推測したものを書きましたが、システムは "set vieo mode" というメッセージを出力することさえせず、で停止します。システムがデータを使用して関数を呼び出そうとするとバグが発生します(構造が正しくない可能性があります)が、コードに何が問題なのですか?vbe_info
mode_info
get_mode_info
mode_info
(コードがブートローダーに収まらないので、2 番目のセクターをロードする必要がありました)
メイクファイル:
ブートローダー:
システム: