从Linux进程分配的堆栈内存在哪里?

use*_*388 3 unix linux operating-system

我们知道,当创建一个进程时,会为此进程分配一个堆栈.在linux中,堆栈的大小通常为8 Mb.我的问题是,从这个堆栈分配的位置?从用户空间还是从系统空间?

Jey*_*ram 5

我希望您知道所有用户进程仅保留在用户空间中的概念.它使用系统调用来完成内核的一些工作.

堆栈内存将是内存中进程上下文区域的一部分.即用户空间.

假设您的进程正在运行,请获取PID ps -ax.说1234是你的PID.

cat /proc/1234/maps 将为您提供该特定过程的映射.

在那个map文件中,你可以检查stackfor stack mapping.


Cir*_*四事件 5

首先,您必须了解什么是分页和缺页错误:x86 分页如何工作的?

内核与进程内存

Linux 内核保留了两个虚拟内存区域:

  • 一个用于内核内存
  • 一个程序

确切的拆分由CONFIG_VMSPLIT_.... 默认情况下:

  • 在 32 位上:

    • 底部 3/4 是程序空间:00000000BFFFFFFF
    • 顶部的1/4内核内存:C0000000FFFFFFFF

    像这样:

    ------------------ FFFFFFFF
    Kernel
    ------------------ C0000000
    ------------------ BFFFFFFF
    
    
    Process
    
    
    ------------------ 00000000
    
    Run Code Online (Sandbox Code Playgroud)
  • 在 64 位上:目前仅实际使用 48 位,分为两个大小相同的不相交空间。Linux 内核只是分配:

    • 底部部分流程00000000 00000000008FFFFF FFFFFFFF
    • 内核的顶部:FFFF8000 00000000FFFFFFFF FFFFFFFF

    像这样:

    ------------------ FFFFFFFF FFFFFFFF
    Kernel
    ------------------ FFFF8000 00000000
    
    
    (not addressable)
    
    
    ------------------ 008FFFFF FFFFFFFF
    Process
    ------------------ 00000000 00000000
    
    Run Code Online (Sandbox Code Playgroud)

进程地址空间

进程的简化程序虚拟内存:

------------------ <--- Top of the process address space
Stack (grows down)
v v v v v v v v v
------------------

(unmapped)

------------------ <--- Maximum stack size.


(unmapped)


-------------------
mmap
-------------------


(unmapped)


-------------------
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
brk (grows up)
-------------------
BSS
-------------------
Data
-------------------
Text
-------------------

------------------- <--- Bottom or process address space.
Run Code Online (Sandbox Code Playgroud)

堆栈分配

内核维护一个属于每个进程的页面列表,并将其与分页同步。

如果程序访问不属于它的内存,内核会处理页面错误,并决定做什么:

  • 如果它超过最大堆栈大小,则将这些页面分配给进程
  • 否则,向进程发送一个 SIGSEGV,这通常会杀死它

更多信息请访问:https : //unix.stackexchange.com/questions/145557/how-does-stack-allocation-work-in-linux/239323#239323

brkmmap

这些系统调用允许进程向内核显式请求内存块,而不仅仅是向下堆栈和段错误。

下面是一个实际的例子brkbrk() 系统调用有什么作用?

这个答案解释了在可能的情况下使用堆栈的优势:x86 汇编中寄存器上使用的推送/弹出指令的功能是什么?

物理内存

内核和用户空间内存之间没有明确的划分:Linux x86-64 上的物理内存中的用户空间和内核之间是否存在显式划分?