程序内存布局中的“内核堆栈”、“C 运行时启动函数的框架”和“main() 的框架”在哪里?

Tim*_*Tim 2 linux process virtual-memory

从 Linux 编程接口:

在此处输入图片说明

  1. 上图中的内核堆栈(在下面的引用中提到)在哪里?

    它是上图中的顶部“内核(映射到进程虚拟内存,但没有访问程序)”吗?

    术语 用户堆栈 用于区分我们在此描述的堆栈与内核堆栈。内核堆栈是在内核内存中维护的每个进程的内存区域,用作执行系统调用期间内部调用的函数的堆栈。(内核不能为此目的使用用户堆栈,因为它驻留在未受保护的用户内存中。)

  2. 上图中的“C 运行时启动函数的框架”和“main() 的框架”(从下图中提到)在哪里?

    上图中的“argv、environ”是“C 运行时启动函数的框架”、“main() 的框架”还是其中之一?

    在此处输入图片说明

  3. 0x00000000 和 0x08048000 之间的最低段用于什么?

谢谢。

Joh*_*éen 5

  1. 没有一个内核堆栈。对于每个线程,都有一个内存区域用作进程进行系统调用时的堆栈空间。还有单独的“中断堆栈”,每个 CPU 一个,由中断处理程序使用。这些内存区域驻留在内核地址空间中(如上0xc0000000图所示)。

  2. 堆栈帧(C 运行时帧、主帧等)是堆栈的一部分。进程参数 ( argv) 和环境是单独的区域,不是堆栈的一部分。

  3. 0x0和之间的区域0x08048000(大约 128 MB)不用于任何东西。最初,i386 System V ABI 为堆栈保留了这个区域,但 Linux 的处理方式有所不同。保留该区域未使用不会浪费 RAM,只会浪费地址空间,因为该区域没有被映射。请注意,此信息现在几乎完全过时,因为它描述了如何在 32 位 x86 架构上完成工作。今天很难找到仅 32 位的 x86 机器,并且发行版正在逐步停止对它们的支持。