免责声明:我是C/C++的新手.
如果我将manually assign a memory address变为C中的变量,然后尝试回显该值…我是否可以无限制地访问内存中的任何内容或者是否存在限制?
例如:
char * p = (char *)0x28ff44; printf("Memory value: %c",*p);
我猜测如果该地址的内容不符合char类型的大小,那将会崩溃,但它仅仅是一个例子.我真正感到好奇的是,如果这样的事情是可能的,或者操作系统是否施加限制并且只允许您访问给定内存空间中的内存?
解决方法
哦,我的,好吧.
从技术上讲,是的,你可以.在不使用MMU或任何形式保护的嵌入式设备中(或者,您知道,x86在实模式下),您可以完全按照您在那里发布的内容进行操作.您也可以在任何操作系统上以用户模式执行此操作,但实际命中有效内存的可能性非常小.
实际上,不,你不能这样做.鉴于虚拟内存和内存保护,您尝试访问的区域很可能不会被映射,因此会失败.此外,如果您点击受保护的内存(例如属于操作系统的任何内容),您的访问权限将失败.这两种情况都是导致分段错误的原因.
您的陈述有效(对于有效的不同定义),程序将尝试访问您请求的内存.只是它可能实际上没有映射到任何东西.
值得注意的是,这是内存映射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
当然,现实世界的设备有点复杂;).