小编nac*_*yde的帖子

写入视频内存(0xB8000)和易失性指针

我正在尝试用C编写自己的小内核,实际上我想写一个print函数来显示字符串.因此,我想写入视频内存(0xB8000).

所以,我试过这样的:

unsigned char *video = (unsigned char *)0xB8000;

*video = 'A';
Run Code Online (Sandbox Code Playgroud)

这实际上有效,但以下不是:

char x = 0;
unsigned char *video = (unsigned char *)(0xB8000 + x);

*video = 'A';
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我认为原因可能是编译器的优化,OSDev给我解决方案:使用volatile关键字.所以我对这个关键字做了一些研究.OSDev建议:

char x = 0;
volatile unsigned char *video = (volatile unsigned char *)(0xB8000 + x);

*video = 'A';
Run Code Online (Sandbox Code Playgroud)

这样,它应该工作.编译器假定video指针指向的值可以更改,然后不进行优化.但是,如果以后我想改变它,比如:

video = (volatile unsigned char *)(video + 2);
Run Code Online (Sandbox Code Playgroud)

我不应该将指针定义为volatile,像unsigned char * volatile video?那么编译器知道地址可以改变吗?

c memory pointers volatile

3
推荐指数
1
解决办法
787
查看次数

标签 统计

c ×1

memory ×1

pointers ×1

volatile ×1