Linux 堆大小和位置

Linux 堆大小和位置,linux,memory-management,Linux,Memory Management,我正在编写自己的内存分配器。如果我的想法是正确的,那么内核的addres空间从0到1-GB,用户空间从1到4,包含不同的部分,如:代码、堆栈、数据、堆和其他 在程序执行期间,堆段的大小和位置不能更改,对吗 我怎样才能知道尺寸和位置 在获得堆区域后,我需要做的就是自行分配内存,不是吗 你为什么担心这个 如果您正在编写分配器a-la libc,请使用sbrk和/或mmap从内核中保留内存。您不必担心这些系统调用都不在堆的位置 如果您想检测libc的malloc/calloc/realloc,事情就更

我正在编写自己的内存分配器。如果我的想法是正确的,那么内核的addres空间从0到1-GB,用户空间从1到4,包含不同的部分,如:代码、堆栈、数据、堆和其他

  • 在程序执行期间,堆段的大小和位置不能更改,对吗
  • 我怎样才能知道尺寸和位置
  • 在获得堆区域后,我需要做的就是自行分配内存,不是吗

  • 你为什么担心这个

    如果您正在编写分配器a-la libc,请使用
    sbrk
    和/或
    mmap
    从内核中保留内存。您不必担心这些系统调用都不在堆的位置

    如果您想检测libc的
    malloc
    /
    calloc
    /
    realloc
    ,事情就更简单了——只需将它们包装在分配器函数中即可

  • 是的,分配器通过从内核请求内存来有效地管理堆。通常,与
    brk
    的情况一样,它的位置位于数据段末尾之后,并且随着地址的增加而增加(或者使用mmap以页面大小的倍数分配,等等)

  • 分配器管理大小;堆的位置与分配器无关,但它处于知道堆的位置

  • 分配器有效地从内核请求内存。一旦有了内存,它就可以将其分配到它认为合适的程序中


  • 你为什么担心这个

    如果您正在编写分配器a-la libc,请使用
    sbrk
    和/或
    mmap
    从内核中保留内存。您不必担心这些系统调用都不在堆的位置

    如果您想检测libc的
    malloc
    /
    calloc
    /
    realloc
    ,事情就更简单了——只需将它们包装在分配器函数中即可

  • 是的,分配器通过从内核请求内存来有效地管理堆。通常,与
    brk
    的情况一样,它的位置位于数据段末尾之后,并且随着地址的增加而增加(或者使用mmap以页面大小的倍数分配,等等)

  • 分配器管理大小;堆的位置与分配器无关,但它处于知道堆的位置

  • 分配器有效地从内核请求内存。一旦有了内存,它就可以将其分配到它认为合适的程序中

  • 它是一个定义堆的分配器。如果您有一个自定义分配器,并且它确定所有内存客户机都返回了所有内存,那么它完全可以删除其堆或创建一个新堆来提供内存请求

  • 因为分配器本身定义了堆,所以它应该知道堆的大小和位置。如果您所说的是用您自己的分配器篡夺OS分配器的责任,那么您应该仅通过使用OS分配器获取一块内存,然后将其用作您自己分配器的堆来实现这一点

  • 同样,一旦您的分配器拥有内存块,您可以自行决定使用它。您不能简单地将另一个分配器管理的内存放在其空闲池中使用,而不会产生严重的潜在后果

  • 它是一个定义堆的分配器。如果您有一个自定义分配器,并且它确定所有内存客户机都返回了所有内存,那么它完全可以删除其堆或创建一个新堆来提供内存请求

  • 因为分配器本身定义了堆,所以它应该知道堆的大小和位置。如果您所说的是用您自己的分配器篡夺OS分配器的责任,那么您应该仅通过使用OS分配器获取一块内存,然后将其用作您自己分配器的堆来实现这一点

  • 同样,一旦您的分配器拥有内存块,您可以自行决定使用它。您不能简单地将另一个分配器管理的内存放在其空闲池中使用,而不会产生严重的潜在后果


  • 您在什么级别分配内存?如果您正在编写自己版本的
    malloc()
    作为练习,那么您可能需要调用“real”
    malloc()
    ,以便在程序启动时分配大量内存。这将是一个“堆”,您将通过分配一部分来管理它,并跟踪已使用或仍然可用的区域。您将在哪个级别分配内存?如果您正在编写自己版本的
    malloc()
    作为练习,那么您可能需要调用“real”
    malloc()
    ,以便在程序启动时分配大量内存。这将是一个“堆”,您将通过分配它的一部分并跟踪已使用或仍然可用的区域来管理它。