热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么内核不清除进程中第二个malloc分配的内存?

遵循以下两个问题:Kernelzeroesmem

遵循以下两个问题:


  1. Kernel zeroes memory?


  2. 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库)向内核发出请求以为其分配一些内存,因此内核知道内存不应泄露其先前的内容(将分配的内存清零是确保信息不会在进程之间泄漏的一种方法)。

“内核如何知道内存已重新分配...”的答案是“不是” —信息是进程专用的,内核不知道该做什么。过程确实会重用内存。


推荐阅读
author-avatar
微笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有