如何在从 mmap 获取的地址上使用值?

How to use value on address acquired from mmap?

有这个nasm:

%define O_RDONLY 0
%define PROT_READ 0x1
%define MAP_PRIVATE 0x2

section .data
fname: db 'test.txt', 0

section .text
global _start
print:
 ; ---- THIS PART ADDED
    mov r15, [rdi]
    add r15, 1 ; have tried `inc byte[rdi]` - did not work either
    mov [rdi], r15
 ; ---- END OF ADDED PART
 ; else is according to book (so correct)
    push rdi


    call str_len
    pop rsi
    mov rdx, rax
    mov rax, 1
    mov rdi, 1
    syscall
    ret
str_len:
    xor rax, rax
.loop:
    cmp byte [rdi+rax], 0
    je .end
    inc rax
    jmp .loop
.end:
    ret

_start:
    ;call open
    mov rax, 2
    mov rdi, fname
    mov rsi, O_RDONLY 
    mov rdx, 0 
    syscall

    ;mmap
    mov r8, rax 
    mov rax, 9 
    mov rdi, 0 
    mov rsi, 4094 
    mov rdx, PROT_READ 
    mov r10, MAP_PRIVATE  
    mov r9, 0 
    syscall

    mov rdi, rax ;returned address 
    call print
    mov rax, 60
    xor rdi, rdi
    syscall

文件 test.txt 开头仅包含一个字符 - 5.

我从 mmaprax 中询问的区域获得了地址,然后我 move 到 rdi。 我只是想增加值(在那个地址 - 现在在 rdi):

    mov r15, [rdi]
    add r15, 1 ; have tried `inc byte[rdi]` - did not work either
    mov [rdi], r15
    push rdi

所以我临时 move r15 上的值,递增它(add 它 1),然后尝试 move 它回到地址该地区(地址仍在 rdi 中)。但是 segfault.

这是为什么?为什么我不能使用地址上的值(从 mmap 获取的区域),其中包含 5 - 一个字节(rdi 指向),并在算术中使用它?

如果是在data segment声明的地址就没有问题了(我试过了)。但地址来自 mmap,那么它有何不同,如何解决?

写入只读内存段错误mov [rdi], r15 qword 存储,或 inc byte [rdi] 字节 RMW)。

如果你想既能写又能读,你需要 PROT_READ | PROT_WRITE

(请注意,写入 MAP_PRIVATE 映射会触发写时复制,留下一个不再受文件支持的私有页面,就像您完成 read进入MAP_ANONYMOUS页。)