我试图理解一些与linux相关的概念,任何人都可以帮助我回答以下问题。
问题I我知道编译器为程序的数据和代码段提供虚拟地址()。操作系统使用这些VA,并试图将它们安装到物理内存中。这就是ELF加载程序(源代码中的fs/binfmt_elf.c)在linux中所做的工作。堆栈和堆的VA何时分配给进程?我想这是动态的,但是VA是从哪里来的呢?如果可能的话,谁能告诉我源代码。
问题II虽然我知道,物理内存的大小是有限的。因此,操作系统不得不不时地交换页面,以保持多个进程运行。当需要交换页面时,它会从内存中提取页面并将其写入磁盘。我完全同意可以将数据和代码页写入磁盘(也许它们是在来自磁盘的同一区域被写回的)。但是操作系统也能交换堆和堆栈页面吗?如果是的话,它会存放在哪里?
发布于 2015-06-19 15:38:34
问题一:
您需要从一个简化的视图开始。对于问题1,请从逻辑内存而不是虚拟内存的角度来考虑。假设我们在32位模式下这样做,您的进程将有一个理论上最大的2^32逻辑内存的3/4。
当您的新进程加载可执行文件时,整个地址空间将为空。我的意思是根本没有记忆(概念上)。然后,程序加载程序将读取可执行文件中的指令,以便在执行开始时构建逻辑地址空间。
加载程序将创建一个用户堆栈。你必须有一个程序才能运行。我的意思是,加载程序将为堆栈分配逻辑页。
加载程序可能不会创建堆。堆将有一个地址范围,但是加载程序可能不会将页面映射到堆。可以使用系统调用显式映射页面,为自己的堆创建页。或者,您可以调用像malloc()这样的库函数来为您映射页面。
问题二:
可以交换所有用户页,包括堆和堆栈。它们转到页面文件,该文件在Linux上是一个交换分区。
发布于 2015-06-19 14:19:46
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.)在交换分区/文件中
https://stackoverflow.com/questions/30938630
复制相似问题