c - qemu 的奇怪 C 数组行为

标签 c operating-system kernel qemu

我正在为一个简单的系统操作系统制作一个内核,但我陷入了一个奇怪的行为 char C 中的数组。我使用 qemu 作为模拟器,操作系统编译为 x86_64。 给出以下代码:

char msg[] = "Hello World!";
int i = 0;
while (msg[i] != 0)
    i++;
byte *mem = (byte*)VIDEO_ADDRESS; //VGA text mode
*mem = '0' + i; //print '<'

屏幕上打印的数字是 0,尽管它应该打印 '<' ('0' + 12) 。 作为测试,我尝试打印数组中的第一个字符,如果我使用硬编码索引,它会起作用:

*mem = msg[0]; //'H' is printed

奇怪的是,以下内容不起作用:

int i = 0;
*mem = msg[i]; //no output (or null character)

以下内容也适用:

*mem = 'H';

最佳答案

您可能需要将 mem 声明为 volatile 字节 *

您编写的代码片段在编译器看来就像您写入 *mem 后没有任何反应。如果没有人使用 *mem,那么编译器可以优化写入其中的指令,但这不是必需的。

volatile 是为这种情况而创建的,其中其他东西(视频显示系统)正在读取或写入编译器不知道的内存。

您可以在此处阅读有关 volatile 的更多信息:http://en.cppreference.com/w/c/language/volatile

关于c - qemu 的奇怪 C 数组行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142496/

相关文章:

c++ - 如何防止 C++ 或 native 编译代码中的 I/O 访问

windows - DLL是在内核态还是用户态加载的?

c - request_irq 和 __interrupt 的区别

c++ - 在 C 或 C++ 中使用分布生成数字

arrays - 如何从 C 语言的输入中读取字符数?

c - SDL_SetRenderTarget (SDL2)

c - 编写符合 POSIX 标准的内核

c - C 结构点运算符到底做了什么(较低级别的视角)?

c - unlocked_ioctl 与普通 ioctl

Linux内核数据结构