我正在尝试用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?那么编译器知道地址可以改变吗?