Tim*_*Tim 2 linux process virtual-memory
从 Linux 编程接口:
上图中的内核堆栈(在下面的引用中提到)在哪里?
它是上图中的顶部“内核(映射到进程虚拟内存,但没有访问程序)”吗?
术语 用户堆栈 用于区分我们在此描述的堆栈与内核堆栈。内核堆栈是在内核内存中维护的每个进程的内存区域,用作执行系统调用期间内部调用的函数的堆栈。(内核不能为此目的使用用户堆栈,因为它驻留在未受保护的用户内存中。)
上图中的“C 运行时启动函数的框架”和“main() 的框架”(从下图中提到)在哪里?
上图中的“argv、environ”是“C 运行时启动函数的框架”、“main() 的框架”还是其中之一?
0x00000000 和 0x08048000 之间的最低段用于什么?
谢谢。
没有一个内核堆栈。对于每个线程,都有一个内存区域用作进程进行系统调用时的堆栈空间。还有单独的“中断堆栈”,每个 CPU 一个,由中断处理程序使用。这些内存区域驻留在内核地址空间中(如上0xc0000000图所示)。
堆栈帧(C 运行时帧、主帧等)是堆栈的一部分。进程参数 ( argv) 和环境是单独的区域,不是堆栈的一部分。
0x0和之间的区域0x08048000(大约 128 MB)不用于任何东西。最初,i386 System V ABI 为堆栈保留了这个区域,但 Linux 的处理方式有所不同。保留该区域未使用不会浪费 RAM,只会浪费地址空间,因为该区域没有被映射。请注意,此信息现在几乎完全过时,因为它描述了如何在 32 位 x86 架构上完成工作。今天很难找到仅 32 位的 x86 机器,并且发行版正在逐步停止对它们的支持。