目前,我需要创建自定义操作系统来测试一些想法。我的问题是:如何在不中断的情况下设置视频卡的分辨率?我的系统支持多重引导标准,内核以保护模式启动,所以我可能无法使用 BIOS 服务。
我找不到端口号等来初始化视频购物车并设置解决方案。我尝试在 VGA 图形地址空间中写入 dword 值,但没有任何显示。
编辑1: 我发现这个代码片段:http: //bos.asmhackers.net/docs/vga_without_bios/snippet_5/vga.php
我不知道它是在哪种许可证上发布的,所以我不能使用它。另外,我更喜欢用 C 编写自定义代码。
我会用 C 重写它并告诉你它有效,但有人可以告诉我它很好(有什么禁忌症)。我问,因为你问我是否可以将虚拟机内置到我的内核中。
编辑2
__asm__ (
"cli\n \
mov %%cr0,%%eax\n\
mov $1,%%cl \n\
xor %%cl,%%cl \n\
and %%cl, %%al \n\
mov %%eax,%%cr0\n \
sti \n\
xor %%ax,%%ax\n \
mov $0x12,%%ah\n \
int $0x10\n \
cli\n \
mov %%cr0,%%eax\n \
or $1,%%al\n \
mov %%eax,%%cr0\n \
sti \
" : : : "eax", "ecx")
); 我不知道将我的源代码放在那里并寻求帮助。我写了上面的代码,应该切换到实模式,设置视频模式并返回保护模式。我不知道我做错了什么。这里的描述表寄存器是干净的还是什么?我是操作系统编程的新手。我的操作系统在此代码段中重置。三重后果?我发现了第一个错误 - 而 xor cl,cl 应该是 neg/not cl。在这两种情况下,操作系统都会重置。