我很想知道当进程在基于 Unix 的系统(GNU/Linux 或 Mac)和 Windows 等流行操作系统上终止时,RAM 中的进程数据会发生什么情况。
假设我们正在开发一个应用程序,将加密密钥或密码等敏感信息加载到 RAM 中,如果我们不覆盖这些数据,这些数据是否会保留在 RAM 中供其他进程访问?
我理解RAM是一种易失性存储器,从硬件角度来看,需要不断刷新(以非常短的间隔用相同的值重新覆盖)以保持存储数据。这个刷新过程是否与一个过程完成后数据发生的情况有关,例如单元格未刷新并丢失其值?
我还有另一个与此相关的问题,在类似 C 的编程语言中,如果你开始从 RAM 的未初始化字节读取,你将得到如下随机值:
#include <iostream>
#include <cstring>
using namespace std;
void print_bytes(void *ptr, int size)
{
cout<<"Address : "<<ptr<<endl<<"Size in bytes : "<<size<<endl;
unsigned char *p = (unsigned char *) ptr;
int i;
for (i=size-1; i>=0; i--) {
printf("%02hhX ", p[i]);
}
cout<<endl<<"==================================="<<endl;
}
int main()
{
int a;
float b;
double c;
char d;
string e;
bool f;
print_bytes( &a , sizeof(a) );
print_bytes( &b , sizeof(b) );
print_bytes( &c , sizeof(c) );
print_bytes( &d , sizeof(d) );
print_bytes( &e , sizeof(e) );
print_bytes( &f , sizeof(f) );
return 0;
}
┌──(user㉿dhcppc4)-[~]
└─$ g++ test.cpp && ./a.out 130 ⨯
Address : 0x7fffb762f35c
Size in bytes : 4
00 00 7F FF
===================================
Address : 0x7fffb762f358
Size in bytes : 4
B7 62 F4 88
===================================
Address : 0x7fffb762f350
Size in bytes : 8
2E 78 78 63 62 69 6C 67
===================================
Address : 0x7fffb762f34f
Size in bytes : 1
00
===================================
Address : 0x7fffb762f320
Size in bytes : 32
00 00 7F 1A 6F DF D5 B8 6C 6F 6F 70 5F 68 65 00 00 00 00 00 00 00 00 00 00 00 7F FF B7 62 F3 30
===================================
Address : 0x7fffb762f31f
Size in bytes : 1
00
===================================
这些值是什么? 这些是否有可能包含来自已终止进程的数据?
我也感谢任何介绍有关此特定主题的参考资料以供进一步阅读。
假设我们正在开发一个应用程序,将加密密钥或密码等敏感信息加载到 RAM 中,如果我们不覆盖这些数据,这些数据是否会保留在 RAM 中供其他进程访问?
它保留在 RAM 中,但没有其他进程可以访问它。
对 RAM 的访问由虚拟内存子系统介导。进程只能访问与其虚拟内存页面相对应的 RAM 页面。
当进程获得新的虚拟内存页面并为其分配 RAN 时,RAM 会被清零,以防止读取使用该 RAM 页面的上一个进程留下的任何数据。