首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆/堆栈和OS页面交换

问堆/堆栈和OS页面交换
EN

Stack Overflow用户
提问于 2015-06-19 12:51:18
回答 2查看 803关注 0票数 0

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

问题I我知道编译器为程序的数据和代码段提供虚拟地址()。操作系统使用这些VA,并试图将它们安装到物理内存中。这就是ELF加载程序(源代码中的fs/binfmt_elf.c)在linux中所做的工作。堆栈和堆的VA何时分配给进程?我想这是动态的,但是VA是从哪里来的呢?如果可能的话,谁能告诉我源代码。

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

EN

回答 2

Stack Overflow用户

发布于 2015-06-19 15:38:34

问题一:

您需要从一个简化的视图开始。对于问题1,请从逻辑内存而不是虚拟内存的角度来考虑。假设我们在32位模式下这样做,您的进程将有一个理论上最大的2^32逻辑内存的3/4。

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

加载程序将创建一个用户堆栈。你必须有一个程序才能运行。我的意思是,加载程序将为堆栈分配逻辑页。

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

问题二:

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-19 14:19:46

1.)在load_elf_binary中

代码语言:javascript
复制
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.)在交换分区/文件中

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30938630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档