问题标签 [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 - 以 1024 线模式画线
我正在尝试在视频模式 105h 中使用int 10h
.
当我尝试:
屏幕上不显示任何内容。
我尝试的模式是 1024x768。
我知道我需要创建一个字体文件才能在屏幕上显示文本。
但是当我让线条或像素工作时,这不会成为问题。
c - VESA 模式,OSDEV
我目前正在从头开始编写操作系统(制作我自己的引导加载程序等),并且我正在尝试适应 VESA 模式。我已经阅读了文档,这一切都很有意义..除了几件事之外。
这直接来自文档(我的实现方式不同):
我感到困惑的是,为什么它将段分配给视频模式指针加2?我知道视频模式指针有一个偏移量:段,但我只是对为什么我们将视频模式指针 + 2 分配给段,以及为什么我们si
在将偏移量和段分配给dx
寄存器后加 2 感到困惑。
osdev - 选择输出模式
我是 OSDev 的新手,我目前正在尝试在 x86 架构上从裸机编写我的操作系统,即使用 GRUP 作为我的引导加载程序。我希望我的操作系统同时支持 BIOS 和 UEFI 引导。
我目前正在尝试编写自己的图形界面。我对如何做到这一点有点困惑,所以它可以在所有平台上运行。
我观察到在 UEFI 2.x 上我必须使用 GOP,而在 UEFI 1.x 上我应该使用 UGA,而在 BIOS 上我必须使用 VESA 或 VGA。
这是否意味着为了实现跨固件操作系统,我必须支持所有这些操作系统?并且只从支持的接口中选择一个?如果我是由 UEFI 引导的,我什至如何从我的操作系统中判断出来?什么版本的 UEFI?
我是否应该放弃兼容性目标并简单地选择一个设置并为该设置实现我的操作系统?
assembly - VBE:为什么我的代码不提供线性帧缓冲区?
我是一个尝试在 VBE 中实现简单图形的初学者。我已经编写了以下汇编代码来启动,进入 32 位保护模式,并进入 VBE 模式 0x4117。(有人告诉我,[mode] OR 0x4000 的输出会产生一个带有线性帧缓冲区的模式版本,所以我假设 0x0117 OR 0x4000 = 0x4117 应该有一个线性帧缓冲区。
上面调用了“kernel_entry.asm”,如下图:
“kernel_entry.asm”又调用我的 main.c 文件:
如果我正确加载了线性帧缓冲区,我希望看到渐变。相反,我看到了这个:
一系列盒子,每个盒子里都有一个渐变,它突然切断了。这似乎表明我正在使用存储帧缓冲区而不是线性缓冲区的模式进行编写;梯度走出一个缓冲区,持续数百次迭代,最终到达下一个缓冲区的开始,导致突然移位和“盒子”效应。
我的解释正确吗?我是否正确加载了线性帧缓冲区,如果没有,我该怎么做?
编辑:我已尝试更改unsigned long offset = i * gVbe->y_resolution_ + j;
为unsigned long offset = i * gVbe->bytes_per_scan_line_ + j
,如下面的小丑建议。这产生了以下图像。它同样是四四方方的。
c - 独立C:为什么这个函数不能根据数组的结构返回数据?
我目前正在观看有关基本图形操作系统开发的 Udemy 教程,该教程刚刚开始解释如何使用位图字体在 VBE 图形模式下呈现文本。演示者创建一个函数(由 python 脚本自动生成)通过在一组数组中查找来返回给定字符的给定行。
这里的关键点是代码使用了一组二进制数据数组,每个数组包含 13 个字符的位图,就像这样。
我认为这似乎很奇怪且不必要,所以我尝试将其重构为使用单个数组(尽管使用不同的字体),如下所示:
但是,当我尝试使用它时,根本没有文本打印到屏幕上。我能想到 3 种解释,但没有一个能完全让我满意:
-
- 由于我们的链接器只链接文本部分而不链接数据部分(链接命令为
ld -m elf_i386 -o boot/bin/kernel.img -Ttext 0x1000 boot/bin/kernel_entry.bin boot/bin/kernel.o
),因此不会链接大数组。这种解释似乎很弱,因为教程版本中的各个较小的数组链接得很好。
- 由于我们的链接器只链接文本部分而不链接数据部分(链接命令为
-
- 由于尚未实现 memcpy,因此声明启用了优化的大型数据结构会导致对 memcpy 的调用不正确。这种解释似乎也很薄弱,因为我希望得到编译器警告。
-
- 我在实施的其他地方犯了一些错误。这似乎不太可能,因为我唯一改变的是传递给打印函数的函数指针。(为了记录,我已经尝试过考虑签名和未签名的字符。没有运气。)
这个问题的根源似乎是什么?谢谢您的帮助。
如果有帮助,该项目的 makefile 如下所示:
编辑 2:可在此处找到最小可重现示例:https ://drive.google.com/drive/folders/1Z5wlXrtRbXQ1wNhBU2_YsSMovaGe7DvB?usp=sharing