【问题标题】:Why doesn't kernel clear the memory allocated by second malloc in a process?为什么内核不清除进程中第二个malloc分配的内存?
【发布时间】:2020-04-20 06:22:27
【问题描述】:

请遵循以下两个问题:

  1. Kernel zeroes memory?

  2. If the heap is zero-initialized for security then why is the stack merely uninitialized?

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

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 < m; ++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 < m; ++j) {
            printf("%x", v[j]);
        }

        printf("\n");
        return 0;
}

输出:

0xaaaae7082260 0000000000000000
0xaaaae7082260 0090909099090909909090990909099090909909090990909099090909909090990909099090909909090990909099090909

我有一个问题:在一个进程中,malloc 分配的内存在第一次使用malloc 时设置为0。但是在free第一个分配的内存之后重用malloc分配一个新的内存,新的内存和第一个内存具有相同的虚拟地址和相同的内容。

我的问题:内核如何知道内存首先分配给进程并且需要设置为零?

以及内核如何知道内存被重新分配给同一个进程并且不需要被清除?

【问题讨论】:

    标签: c linux memory-management memory-leaks


    【解决方案1】:

    从操作系统中为内存池获取一块内存和重用内存池中已有的内存是两件不同的事情。

    操作系统可能会在您第一次获取内存时将其归零,但是否将内存归零(在空闲或 malloc 上)取决于“malloc”实现。

    【讨论】:

      【解决方案2】:

      “内核如何知道内存首先分配给进程”的答案是进程(通过 C 库)向内核发出请求以分配一些内存,所以内核知道内存不应该泄露它以前的内容(并且将分配的内存归零是确保信息不会在进程之间泄漏的一种方法)。

      “内核如何知道内存被重新分配......”的答案是“它不知道”——该信息是进程私有的,内核不知道内存被重新分配了什么。进程确实会重用内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2016-02-13
        • 2019-11-18
        • 2014-04-24
        • 2018-10-02
        相关资源
        最近更新 更多