当前位置: 首页 > 面试题库 >

为什么Linux二进制文件的虚拟内存地址从0x8048000开始?

桓智敏
2023-03-14
问题内容

在Ubuntu x86系统上反汇编ELF二进制文件我不禁注意到code(.text)部分从虚拟地址0x8048000开始,所有较低的内存地址似乎都未使用。

这似乎是相当浪费的,并且Google出现的所有信息要么是涉及STACK_TOP的民间传说,要么是针对空指针取消引用的保护。后一种情况看起来可以通过使用单个页面而不留128MB的间隙来解决。

所以我的问题是-对于为什么将布局固定为这些值,还是有明确的答案吗?


问题答案:

从链接器和装载器书中:

在386系统上,文本基址为0x08048000,它允许在文本下方有相当大的堆栈,而仍保持在地址0x08000000上方,从而允许大多数程序使用单个二级页表。(回想一下,在386上,每个第二级表都映射0x00400000地址。)



 类似资料:
  • 从虚拟内存到物理内存 虚拟地址和物理地址 到目前为止,我们简易的操作系统还只是一个内核在执行,还没有多任务的概念。在现代的操作系统中,为了让其他的程序能方便的运行在操作系统上,需要完成的一个很重要的抽象是「每个程序有自己的地址空间,且地址空间范围是一样的」,这将会减少了上层程序的大量麻烦,否则程序本身要维护自己需要的物理内存,这也会导致极大程度的不安全。 这个执行上看到的地址空间,就是虚拟内存。而

  • 问题内容: 在了解需要highmem来解决超过1GB RAM的问题时,我缺少一些东西。有人可以指出我哪里出问题了吗?谢谢! 我知道的: 保留1 GB的进程虚拟内存(高内存区域)用于内核操作。用户空间可以使用剩余的3 GB。这是3/1分割。 VM的虚拟内存功能将(连续)虚拟内存页面映射到物理页面(RAM)。 我不知道的是: 哪些操作使用内核虚拟内存?我想内核空间中的kmalloc(…)之类的东西会使

  • 问题内容: 我正在一个小型嵌入式系统上工作。当我的linux启动到用户空间时,我知道物理内存中的设备在哪里。我想将它们映射到用户空间虚拟地址。目前,我正在通过内核模块进行操作。我使用vmalloc / kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range映射我的物理地址。我不认为这是正确的方法。首先,我分配内存,然后要求内核将虚拟地址空间重新映射到一些不同的

  • 我们都知道,直接从内存读写数据要比从硬盘读写数据快得多,因此更希望所有数据的读取和写入都在内存中完成,然而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为 交换空间(又称  

  • 问题内容: 我正在为并行程序开发一个运行时系统,该程序可以利用跨多个进程的公共地址空间布局,并有可能分布在多个(千个)节点上。很多时候,为此环境构建的软件在默认情况下启用了地址空间随机化的Linux系统上运行,用户可能不希望或无法在系统范围内(通过等)禁用它。这对并行程序施加了一些限制,并可能损害性能。因此,我们想弄清楚如何针对我们构建的二进制文件禁用它。安全性不是问题,因为此软件始终在受控环境中

  • 主要内容:虚拟内存如何工作?,按需分页,虚拟内存管理系统的快照虚拟内存是一种存储方案,为用户提供了一个拥有非常大的主内存的幻觉。 这是通过将辅助存储器的一部分作为主存储器来完成的。 在这种方案中,用户可以加载比可用主存更大的进程,因为存在内存可用于加载进程的错觉。 操作系统不是在主内存中加载一个大进程,而是在主内存中加载多个进程的不同部分。 通过这样做,多程序的程度将会增加,因此CPU利用率也会增加。 虚拟内存如何工作? 在现代语言中,虚拟内存近来变得非常普