【发布时间】:2016-02-26 15:27:04
【问题描述】:
出于好奇,我正在学习 x86 汇编。我目前正在使用带有 NASM 汇编器的基于 Linux 的操作系统。我很难理解为什么
SECTION .text
global _start
_start:
nop
mov ebx, 25
mov [0xFFF], ebx
;Exit the program
mov eax, 1
mov ebx, 0
int 0x80
会导致分段错误(将 ebx 寄存器的内容移动到内存位置 0xFFF 时)。我在想用纯 asm 构建一个程序可以让我不受限制地访问我的进程的虚拟地址空间。不是这样吗?
您将如何在汇编中实现诸如堆之类的东西?
【问题讨论】:
-
即使地址可用,您也会通过将 32 位值写入奇数地址来破坏机器对齐。您可以将
ebx写入0xFFC或0x1000,但不能写入其间的任何地址。 -
0xFFF 分配是否正确意味着地址有效?
-
@WeatherVane 我怀疑是否强制执行对齐(在 x86 上强制执行对于常规内存访问是可选的,CPU 可以处理未对齐的读/写)。问题很可能是没有物理内存映射到访问位置的地址空间。页 0(偏移量 0 到 0xFFF)通常未映射以捕获 NULL 指针/零地址。然后,默认情况下,程序映像加载到地址零上方,例如 0x08048000。那么,为什么要在没有程序的地方映射内存呢?
-
@AlexeyFrunze 是的,我的评论很弱:在某些 other 处理器上强制执行,但在 8086 中只会导致另一个读取或写入周期。
-
如何访问程序可以使用的全部虚拟内存?你将如何在汇编中实现堆之类的东西?
标签: linux assembly x86 segmentation-fault nasm