Как использовать значение по адресу, полученному от mmap? - PullRequest
0 голосов
/ 10 февраля 2020

с этим носом:

%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.

Я получил адрес из области, заданной mmap в rax, который я потом mov е rdi. И я просто хочу увеличить значение (по тому адресу, который сейчас находится в rdi):

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

Так что я временно mov e значение r15, его приращение (* 1018) * it 1) и попробуйте mov e вернуть его по адресу этого региона (адрес еще в rdi). Но тогда segfault.

Почему это так? Почему я не могу использовать значение по адресу (в полученный регион из mmap), которое содержит 5 - один байт (на который указывает rdi), и использовать его в арифметическом c?

Если это будет адрес, объявленный в data segment, то проблем не будет (я пробовал). Но адрес от mmap, так чем он отличается и как это исправить?

1 Ответ

1 голос
/ 10 февраля 2020

Запись в сегменты памяти только для чтения (mov [rdi], r15 хранилище слов или inc byte [rdi] байт RMW).

Вам нужно PROT_READ | PROT_WRITE, если вы хотите иметь возможность записи а также read.

(Обратите внимание, что запись в отображение MAP_PRIVATE запускает копирование при записи, оставляя вас с закрытой страницей, которая больше не поддерживается файлом, как если бы вы сделали read на страницу MAP_ANONYMOUS.)

...