免责声明:我是 C/C++ 新手。
如果我要manually assign a memory address到 C 中的一个变量,然后尝试回显该值...我是否可以不受限制地访问内存中的任何内容,或者是否存在限制?
例如:
char * p = (char *)0x28ff44;
printf("Memory value: %c", *p);
我猜想如果那个地址的内容不适合 char 类型的大小,那将会严重崩溃,但这只是一个例子。我真正好奇的是,这样的事情是否可行,或者操作系统是否施加了限制,只允许您访问给定内存空间中的内存?
最佳答案
天哪,好吧。
从技术上讲,是的,您可以。在不使用 MMU 或任何形式的保护(或者,你知道,实模式下的 x86)的嵌入式设备中,你可以完全按照你在那里发布的方式进行操作。您也可以在任何操作系统上以用户模式执行此操作,但实际达到有效内存的机会非常小。
实际上,不,您不能只那样做。鉴于虚拟内存和内存保护,您尝试访问的区域很可能不会被映射,因此会失败。此外,如果您访问 protected 内存(例如属于操作系统的任何内容),您的访问将失败。这两种情况都是导致段错误的原因。
您的陈述是有效的(对于不同的有效定义),程序将尝试访问您请求的内存。只是它实际上可能没有映射到任何东西。
还值得注意的是,这就是内存映射 I/O 的工作方式。假设我有一个硬件控制寄存器,写入时会在附加的 UART/串行线上写入一个字节(并且,为简单起见,它就像魔术一样工作,不需要设置任何其他寄存器)。在 C 中,对于我过度简化的设备,这将写成如下:
#define UART1_OUT 0xFC56
volatile char* uart = UART1_OUT; // Definition of pointer to variable.
// volatile is required here. Look it up, but
// it basically stops your compiler optimising
// anything to do with this variable
*uart = 'A'; // Write an A character to the serial line
当然,真实世界的设备要复杂一些;)。
关于我可以访问内存中的任何内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805447/