栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

x86内存访问分段错误

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

x86内存访问分段错误

在Linux(x86)上-尽管您的进程中的虚拟地址范围为4gb,但并非所有虚拟地址都可以访问。较高的1gb是内核所在的位置,并且有一些内存不足的区域无法使用。虚拟内存地址0xfff不能被写入或读取(默认情况下),因此您的程序会因段错误而崩溃。

在后续评论中,您建议您打算在汇编程序中创建堆。可以做到,一种方法是使用 sys_brk 系统调用。通过

int 0x80
EAX = 45
访问。它在 EBX中使用
一个指针来表示堆的新顶部。通常,堆区域的底部被初始化为刚好位于程序数据段之外(内存中程序上方)的区域。要获取初始堆位置的地址,可以在 EBX
设置为0的情况下调用 sys_break 。在系统调用之后, EAX 将成为堆的当前基本指针。当您需要访问堆内存或分配更多堆空间时,可以节省下来。



这段代码提供了一个示例,目的是为了清楚(而不是性能),但可能是理解如何操作堆区域的起点:

SECTION .dataheap_base: dd 0          ; Memory address for base of our heapSECTION .textglobal _start_start:    ; Use `brk` syscall to get current memory address    ; For the bottom of our heap This can be achieved    ; by calling brk with an address (EBX) of 0    mov eax, 45          ; brk system call    xor ebx, ebx         ; don't request additional space, we just want to    ; get the memory address for the base of our processes heap area.    int 0x80    mov [heap_base], eax ; Save the heap base    ;Now allocate some space (8192 bytes)    mov eax, 45          ; brk system call    mov ebx, [heap_base] ; ebx = address for base of heap    add ebx, 0x2000      ; increase heap by 8192 bytes    int 0x80    ; Example usage    mov eax, [heap_base]      ; Get pointer to the heap's base    mov dword [eax+0xFFF], 25 ; mov value 25 to DWORD at heapbase+0xFFF    ;Exit the program    mov eax, 1    xor ebx, ebx    int 0x80


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/409050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号