【发布时间】:2016-09-19 02:35:25
【问题描述】:
当我找到真正的操作系统开发教程时,我正在浏览整个 Internet 上的内核开发教程。
我浏览了代码,但我无法理解。
代码如下:
int main(void){
char *str = "Hello, world", *ch;
unsigned short *vidmem = (unsigned short*) 0xb8000;
unsigned i;
for (ch = str, i = 0; *ch; ch++, i++)
vidmem[i] = (unsigned char) *ch | 0x0700;
for (;;);
}
当我使用 Dev C++ 编译上述代码并生成 Win32 控制台或 Windows 应用程序时,它在我运行时崩溃,它告诉我我的程序“已停止工作”并终止。它似乎在循环中的这一行失败:
vidmem[i] = (unsigned char) *ch | 0x0700;
代码有什么问题,我该如何解决?
【问题讨论】:
-
它在 for 语句中显示错误 不是问题描述。有 两个 for 语句 - 哪一个导致错误?它显示的是什么确切错误?您的屏幕上就在您面前;您绝对没有理由不在您的问题中包含它,所以我们也有它。
-
我直接在windows上运行程序。那么会不会出现访问0xB8000的非法内存(内存保护)之类的问题。 windows会允许访问吗?
-
不,Windows 程序不支持此功能。 Win32 应用程序不能直接访问视频内存。当它更新到
vidmem时,它可能会导致程序出现故障/崩溃。你真正的问题是 - 为什么我的 Win32 程序在运行时会崩溃?此代码旨在用于裸机环境或 MS-DOS 环境(如果使用以 DOS 为目标并在 DOS 环境或模拟器(如 DosBox)中运行的 TurboC 或 Microsoft-C 编译器编译,它将工作) -
所以,我必须编译代码并创建一个引导加载程序来加载文件才能看到输出。对吗?
-
除了找到一个 20 多年前的旧 16 位 C 编译器,并在 Dosbox 中运行可执行文件(如果您在 64 位 Windows 系统上)- 没有真正简单的大大地。在你的内核中测试它可能是最好的。
标签: winapi gcc x86 kernel osdev