x86 memory access segmentation fault

前端 未结 2 759
再見小時候
再見小時候 2020-12-18 06:53

I am learning x86 assembly out of curiosity. I\'m currently using a Linux based OS with the NASM assembler. I am having a difficult time understanding why

SE         


        
相关标签:
2条回答
  • 2020-12-18 07:22

    On Linux(x86) - although you have a virtual address range of 4gb in your process, not all of it is accessible. The upper 1gb is where the kernel resides, and there are areas of low memory that can't be used. Virtual memory address 0xfff can't be written to or read from (by default) so your program crashes with a segfault.

    In a followup comment you suggested you were intending to create a heap in assembler. That can be done, and one method is to use the sys_brk system call. It is accessed via int 0x80 and EAX=45 . It takes a pointer in EBX representing the new top of the heap. Generally the bottom of the heap area is initialized to the area just beyond your programs data segment(above your program in memory). To get the address of the initial heap location you can call sys_break with EBX set to 0. After the system call EAX will be the current base pointer of the heap. You can save that away when you need to access your heap memory or allocate more heap space.

    This code provides an example for purposes of clarity (not performance), but might be a starting point to understanding how you can manipulate the heap area:

    SECTION .data
    heap_base: dd 0          ; Memory address for base of our heap
    
    SECTION .text
    global _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
    
    0 讨论(0)
  • 2020-12-18 07:30

    You don't have unrestricted RAM. Furthermore, you don't have unrestricted access to the part of your address space which is backed by RAM. Code pages are mapped read-only. And as a ring-3 program, you can't change that yourself.

    0 讨论(0)
提交回复
热议问题