use*_*388 3 unix linux operating-system
我们知道,当创建一个进程时,会为此进程分配一个堆栈.在linux中,堆栈的大小通常为8 Mb.我的问题是,从这个堆栈分配的位置?从用户空间还是从系统空间?
我希望您知道所有用户进程仅保留在用户空间中的概念.它使用系统调用来完成内核的一些工作.
堆栈内存将是内存中进程上下文区域的一部分.即用户空间.
假设您的进程正在运行,请获取PID ps -ax.说1234是你的PID.
cat /proc/1234/maps 将为您提供该特定过程的映射.
在那个map文件中,你可以检查stackfor stack mapping.
首先,您必须了解什么是分页和缺页错误:x86 分页是如何工作的?
内核与进程内存
Linux 内核保留了两个虚拟内存区域:
确切的拆分由CONFIG_VMSPLIT_.... 默认情况下:
在 32 位上:
00000000到BFFFFFFFC0000000到FFFFFFFF像这样:
------------------ FFFFFFFF
Kernel
------------------ C0000000
------------------ BFFFFFFF
Process
------------------ 00000000
Run Code Online (Sandbox Code Playgroud)在 64 位上:目前仅实际使用 48 位,分为两个大小相同的不相交空间。Linux 内核只是分配:
00000000 00000000到008FFFFF FFFFFFFFFFFF8000 00000000到FFFFFFFF 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)
堆栈分配
内核维护一个属于每个进程的页面列表,并将其与分页同步。
如果程序访问不属于它的内存,内核会处理页面错误,并决定做什么:
更多信息请访问:https : //unix.stackexchange.com/questions/145557/how-does-stack-allocation-work-in-linux/239323#239323
brk 和 mmap
这些系统调用允许进程向内核显式请求内存块,而不仅仅是向下堆栈和段错误。
下面是一个实际的例子brk:brk() 系统调用有什么作用?
这个答案解释了在可能的情况下使用堆栈的优势:x86 汇编中寄存器上使用的推送/弹出指令的功能是什么?
物理内存
内核和用户空间内存之间没有明确的划分:Linux x86-64 上的物理内存中的用户空间和内核之间是否存在显式划分?
| 归档时间: |
|
| 查看次数: |
3908 次 |
| 最近记录: |