Dea*_*Eli 5 c++ memory pointers
我正在买一台新电脑,所以我和朋友决定用我们电脑的内存来玩俄罗斯轮盘赌.一般的前提是我们在内存中随机取一个位置并将其分配给一个随机值,看看哪个计算机出现故障/崩溃最快或最差.我所做的一切都不是一个好主意,所以接受不安全的做法,甚至在这里鼓励.
这是我到目前为止:
#include <iostream>
#include <stdlib.h>
#include <time.h>
// use preprocessor to avoid losing this data during the running of the program
// 4GB RAM (4 * 2^32 bytes)
#define NUM_MEMORY_LOCATIONS 4294967296
int main()
{
// Intializes random number generator
time_t t;
srand((unsigned) time(&t));
while (true)
{
// 4GB RAM (2^32 bytes)
/** generate a 31-bit number between 0b0 (0) and 0b111 1111 1111 1111 1111 1111 1111 1111 (4294967295) **/
// generate a 15-bit number between 0b0 (0) and 0b111 1111 1111 1111 (32767)
unsigned long int hi = rand() % 32768;
// shift the bits
hi <<= 16;
// generate a 15-bit number between 0b0 (0) and 0b111 1111 1111 1111 (32767)
unsigned long int med = rand() % 32768;
// shift the bits
med <<= 1;
// generate a 1-bit number between 0b0 (0) and 0b1 (1)
unsigned long int lo = rand() % 2;
// combine to make final random number
unsigned long int randNum = hi + med + lo;
// select a random position in memory
void * randomPointer = 0;
randomPointer += randNum;
// Something like this here to break my computer:
//*randomPointer = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何设置这个值,即使只是0.另外,我不确定我应该使用什么指针类型.void指针似乎不起作用,但我可能还没有完全理解c ++中不安全内存管理的复杂性.
有谁知道我怎么做到这一点?任何帮助,将不胜感激.
您不能使用您的代码执行此操作:在x86-64系统上,您将获得与您的可执行地址空间无关的每个地址的访问冲突.
操作系统负责决定哪些地址属于给定进程(它们经历MMU转换过程,最终决定地址是否与进程有关),如果它没有通知处理器并且根据操作系统您可能会遇到访问冲突或分段错误.
在Linux系统上,您通常会编辑另一个进程的内存,例如ptrace来调试另一个进程.另一种可能性是编辑/ dev/mem.对于这两者,您将需要root访问权限.
在Windows系统上,您可以使用ReadProcessMemory和WriteProcessMemory,或者直接将代码注入您生成其地址的目标(CreateRemoteThread).
反正记住最主要的原因,你不能用你当前的代码完成它:现代操作系统在分页环境中运行你的应用程序,即它们提供一个虚拟地址空间并不必然(而且通常没有)地图物理地址.你想要做的是错误的,因为这些地址不会映射到物理位置.如果您真的想要这样,您将不得不禁用或绕过分段机制,ring3/0保护,分页,涉及MMU的翻译,并可能处理有关保留地址和MMIO注册间隔的大量其他问题.
所有现代桌面操作系统都使用虚拟进程地址空间。这意味着您的进程看到 4GB 内存(在 32 位操作系统上;在 64 位系统上更多),它完全属于自己,并且看不到其他进程或操作系统内核拥有的内存。虚拟地址空间如何映射到物理内存和交换空间取决于操作系统,并且随着内存换入和换出而随时间而变化。
因此,你的实验中最糟糕的情况就是使你编写的程序崩溃。要执行其他操作,您需要位于内核空间中。