在堆/堆栈和OS页面交换

时间:2015-06-19 12:51:19

标签: linux-kernel operating-system kernel paging elf

我试图了解一些与linux相关的概念 任何人都可以帮我回答以下问题。

[问题I] 我知道编译器为程序的数据和代码段提供虚拟地址(VA)。操作系统使用这些VA并尝试将它们装入物理内存。这就是ELF加载器(源代码中的fs / binfmt_elf.c)在linux中的作用。堆栈和堆的VA何时为进程分配?我猜它的动态,但VA来自哪里?如果可能,任何人都可以向我指出源代码。

[问题II] 虽然我知道,物理内存的大小有限。因此,操作系统有时必须换出页面以保持多个进程运行。当需要换出页面时,它会从内存中拉出页面并将其写入磁盘。我完全同意数据和代码页可以写入磁盘(也许它们会被写回到它们来自磁盘的同一区域)。但是OS可以换出堆和堆栈页面吗?如果是,它将存储在磁盘中的哪个位置?

2 个答案:

答案 0 :(得分:2)

问题I:

您需要从简化视图开始。对于问题1,请考虑逻辑内存而不是虚拟内存。假设我们在32位模式下执行此操作,您的过程可以获得理论上最多为3/4的2 ^ 32逻辑内存。

当您的新进程加载可执行文件时,整个地址空间将为空。我的意思是根本没有记忆(从概念上讲)。然后,程序加载器将读取可执行文件中的指令,以便在执行开始时构建逻辑地址空间。

加载器将创建用户堆栈。您必须有一个程序才能运行。通过这种方式,我的意思是加载器将为堆栈分配逻辑页面。

加载器可能不会创建堆。堆将有一个地址范围,但加载器可能不会将页面映射到它。您可以使用系统调用显式映射页面,以便为您自己的堆创建页面。或者,您可以调用像malloc()这样的库函数来为您映射页面。

问题II:

可以换出所有用户页面,包括堆和堆栈。它们转到页面文件,在Linux上是交换分区。

答案 1 :(得分:1)

1。)在load_elf_binary

850         /* Do this so that we can load the interpreter, if need be.  We will
851            change some of these later */
852         retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
853                                  executable_stack);

2.)在交换分区/文件中