作者:微笑 | 来源:互联网 | 2023-08-30 12:33
遵循以下两个问题:
-
Kernel zeroes memory?
-
If the heap is zero-initialized for security then why is the stack merely uninitialized?
#include
#include
#include
const size_t n = 4;
const size_t m = 0x10;
int main()
{
int *p = malloc(m*sizeof(int));
printf("%p ",p);
for (size_t i = 0; i printf("%d",p[i]);
}
printf("\n");
memset(p,9,m*sizeof(int));
free(p);
int *v = malloc(m*sizeof(int));
printf("%p ",v);
for (size_t j = 0; j printf("%x",v[j]);
}
printf("\n");
return 0;
}
输出:
0xaaaae7082260 0000000000000000
0xaaaae7082260 0090909099090909909090990909099090909909090990909099090909909090990909099090909909090990909099090909
我有一个问题:在一个过程中,第一次使用malloc
时,由malloc
分配的内存设置为0。但是在第一个分配的内存malloc
之后重新使用free
分配新的内存,新的内存与第一个内存具有相同的虚拟地址和相同的内容。
我的问题:内核如何知道内存是首先分配给进程的,并且需要将其设置为零?
内核如何知道该内存已重新分配给同一进程,并且不需要清除?
从操作系统中为您的内存池获取一块内存并重新使用内存池中已经存在的内存是两件事。
当您第一次获得内存时,操作系统可能会将内存清零,但是否将内存清零(在空闲内存还是malloc上)取决于“ malloc”实现。
,
“内核如何知道内存是首先分配给进程的” 的答案是,进程(通过C库)向内核发出请求以为其分配一些内存,因此内核知道内存不应泄露其先前的内容(将分配的内存清零是确保信息不会在进程之间泄漏的一种方法)。
“内核如何知道内存已重新分配...”的答案是“不是” —信息是进程专用的,内核不知道该做什么。过程确实会重用内存。