问题描述
|
此代码如何工作???
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *addr = (int*) 0x4888d0;
*addr = 30;
printf(\"%i %p\\n\",*addr,addr);
return 0;
}
解决方法
它的工作原理是假设a1ѭ是至少
sizeof(int)
字节的可写内存块的地址,并且不干扰printf
或C运行时系统的功能。
或者更确切地说,它不起作用,至少在我的系统上不起作用(Segmentation fault
)。
,它没有什么奇怪的,但是,这似乎很危险。该程序尝试执行的操作是在特定位置写入30。即地址位于0x4888d0中的位置。
为什么这样写代码,为什么要写这个特定地址,这是任何人的猜测。
,int *addr = (int*) 0x4888d0;
将给addr地址=0x4888d0
。该地址可能是有效地址。但是不能保证它会一直有效。
,如上所述,这往往会分割价值或破坏正常的应用程序。然而,
现代计算机趋向于保留做一些神奇的事情的内存地址,例如控制I / O,设置CPU模式,更新内存映射等。具有此类的内存页面是未映射到常规应用程序获得的虚拟内存中的“真实”地址。这就是内核与硬件控制器通信的地方。提供的片段会戳入一个内存位置,然后立即将其读回,这一事实通常是向控制器询问某种类型的状态,然后又将其取回(对魔术字的任何写操作都可以更新控制器可用于该状态的状态)。软件...该值可能并不重要)。
因此,如果此代码来自内核空间,或者位于某些微控制器或其他奇怪的系统中,则魔术内存地址可能可用。另一种可能性是,特权应用程序已从内核请求特殊的虚拟内存映射,该映射也可以向其公开魔术页面。当应用程序请求将某些内容映射到虚拟内存位置(包括0x4888d0)时,这可能会很奇怪,而实际内存页面可能会完全不同(并且对于应用程序不可用)。