Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中,malloc向您提供了谁的数据?_Linux_Malloc_Glibc - Fatal编程技术网

在linux中,malloc向您提供了谁的数据?

在linux中,malloc向您提供了谁的数据?,linux,malloc,glibc,Linux,Malloc,Glibc,在linux中使用malloc内存时,不能保证按照规范将其归零。那么你得到的是谁的数据呢?你得到的是“随便什么”。如果进程以前分配并释放了内存,那么通常至少会部分地被旧的东西填满。有时,内存会被垃圾填满,以使bug更加明显。你不会得到的,是一些其他进程的旧数据;这将是一个潜在的安全漏洞。你会得到“随便什么”。如果进程以前分配并释放了内存,那么通常至少会部分地被旧的东西填满。有时,内存会被垃圾填满,以使bug更加明显。你不会得到的,是一些其他进程的旧数据;这将是一个潜在的安全漏洞。和free都与虚

在linux中使用malloc内存时,不能保证按照规范将其归零。那么你得到的是谁的数据呢?

你得到的是“随便什么”。如果进程以前分配并释放了内存,那么通常至少会部分地被旧的东西填满。有时,内存会被垃圾填满,以使bug更加明显。你不会得到的,是一些其他进程的旧数据;这将是一个潜在的安全漏洞。

你会得到“随便什么”。如果进程以前分配并释放了内存,那么通常至少会部分地被旧的东西填满。有时,内存会被垃圾填满,以使bug更加明显。你不会得到的,是一些其他进程的旧数据;这将是一个潜在的安全漏洞。

free
都与虚拟内存相关,它们使用和
munmap(2)
(可能还有
sbrk
)系统调用

但是使用这些系统调用不知何故是昂贵的

因此
malloc
尽量重用以前
空闲的
-d内存区域(以避免进行太多
mmap
&
munumap
系统调用),并且内存包含任意数据(称为垃圾)。同样地,
free
不向内核释放内存(使用
munmap
),但要记住,您拥有的
free
-d内存稍后可以重用(由
malloc
),它是您自己的应用程序以前使用(并填充)的数据

利用Linux是自由软件的优势,研究在或中实现
malloc
&
free
free
都与虚拟内存相关,它们使用and
munmap(2)
(可能还有
sbrk
)系统调用

但是使用这些系统调用不知何故是昂贵的

因此
malloc
尽量重用以前
空闲的
-d内存区域(以避免进行太多
mmap
&
munumap
系统调用),并且内存包含任意数据(称为垃圾)。同样地,
free
不向内核释放内存(使用
munmap
),但要记住,您拥有的
free
-d内存稍后可以重用(由
malloc
),它是您自己的应用程序以前使用(并填充)的数据


利用Linux是自由软件的优势,研究在或中实现
malloc
&
free
,可能发生的情况有多种选择

想象一个进程不断地
malloc()
s和
free()
s

第一个
malloc()
s开始从操作系统获取更多内存。此内存很可能已被0填充。您使用它(在其中放入一些数据),并最终再次释放它

现在可能发生以下情况:

  • 内存位于堆的末尾,可以使用
    sbrk()
    释放。只有在有足够的空闲空间时才会发生这种情况,因为从性能上讲,空闲是相当昂贵的。堆末尾必须空闲的数据量与
    mallopt()
    选项
    M_TRIM_阈值
    有关

  • 但是,如果内存没有立即释放,而是添加到可用内存块列表中,则稍后调用
    malloc()
    可能会返回内存(或部分内存)。在这种情况下,您以前在这里输入的数据可以从那里读出(如果这样做有任何意义的话)


可能发生的情况有几种选择

想象一个进程不断地
malloc()
s和
free()
s

第一个
malloc()
s开始从操作系统获取更多内存。此内存很可能已被0填充。您使用它(在其中放入一些数据),并最终再次释放它

现在可能发生以下情况:

  • 内存位于堆的末尾,可以使用
    sbrk()
    释放。只有在有足够的空闲空间时才会发生这种情况,因为从性能上讲,空闲是相当昂贵的。堆末尾必须空闲的数据量与
    mallopt()
    选项
    M_TRIM_阈值
    有关

  • 但是,如果内存没有立即释放,而是添加到可用内存块列表中,则稍后调用
    malloc()
    可能会返回内存(或部分内存)。在这种情况下,您以前在这里输入的数据可以从那里读出(如果这样做有任何意义的话)

    • 简单回答:这是你的数据。(从你看到它的那一刻起)这取决于你想用它做什么

      你问题的本质是:以前是谁的数据?谁写的?这不是一个容易回答的问题,因为跟踪数据已经丢失了。检查数据本身可能会给您一些提示,但这只是猜测

      现在,为什么?物理内存按页(逻辑)划分,MMU(内存管理单元-CPU的一部分)根据需要提供给虚拟内存中的进程。然后进程可以用数据填充页面。当进程死亡时,它的内存页被回收以不再使用,并且当其他进程需要在虚拟内存中存在内存页时,可以自由地提供给其他进程。但是这些页面以前并没有擦干净——它们是按原样提供的。因此,新进程将看到前所有者设置的所有位。但之前主人的所有痕迹都已经消失了

      注意,我根本没有提到
      malloc()
      。这是因为,所谓的内存分配器根本不参与这个过程
      malloc()
      只是您的私有进程内事务,与物理级内存页跟踪无关。请记住,所有进程都有全部可用的地址空间(全部4GB及以上)可供使用。即使机器中没有那么多的物理内存。这就是为什么它被称为虚拟的