assembly 如何从x86-64 linux汇编或链接器脚本访问特定的内存区域?

wixjitnu  于 2022-12-27  发布在  Linux
关注(0)|答案(1)|浏览(144)

我正在写一个实用程序,需要测试特定的内存区域.
我需要一些类似于linux的mmap例程但不链接任何库的东西。该实用程序运行在x86-64 linux上,有基本的C/汇编例程,没有任何库。我已经用链接器脚本设置了入口点。
当我试图访问原始的.text、.data、.bss或其他原始部分之外的内存时,我得到一个segfault。
我需要为该工具提供外部内存。
任何建议将不胜感激!
我已经用MEMORY和SECTIONS链接了链接器脚本配置,但仍然没有运气。

4dbbbstv

4dbbbstv1#

如果你想完全访问所有的内存,你需要 Boot 你的应用程序,我想你会发现这相当复杂。
Linux下的内存测试应用程序就是一个这样做的工具,它被称为memtest86+
这需要你从8086开始,如果你想访问所有的RAM,并且有超过32位CPU可以访问,你需要切换到amd 64(64位CPU)。然后你可以检查整个内存。
BIOS这样做是为了检测所有的内存条并通知您这些信息(当您的 Boot 代码开始允许您在可用且足够大的内存缓冲区中加载“OS”/代码时,您有方法获得这些信息)。
在现代操作系统下(Windows 2k及更新版本,OS/X及更新版本,Linux等现代Unice),内存是使用内核管理的,你看到的都是虚拟内存。这意味着你在这样的系统下从应用程序中获得的指针与你 Boot 时的真实的内存指针无关。要做到这一点,CPU使用一个叫做MMU(或内存管理单元)的单元。在过去,这是一个单独的处理器。现在它是一个整体。

相关问题