Подтвердить что ты не робот

Как динамически распределять память с помощью сборок и системных вызовов под Linux

Я ищу хорошие примеры кода для распределения динамической памяти с использованием языка ассемблера под Linux и использования системных вызовов, а не malloc и друзей.

Каковы некоторые из простейших, но эффективных способов сделать это?

На компьютерах Intel 386+.

4b9b3361

Ответ 1

brk(2). Посмотрите ELF.

Ответ 2

В Linux mmap2 есть разумный системный вызов для использования на этом уровне на низком уровне. Он принимает 6 аргументов, поэтому в IA32 вы можете вызвать его, используя:

    mov eax, 192    ; mmap2
    xor ebx, ebx    ; addr = NULL
    mov ecx, 4096   ; len = 4096
    mov edx, $7     ; prot = PROT_READ|PROT_WRITE|PROT_EXEC
    mov esi, $22    ; flags = MAP_PRIVATE|MAP_ANONYMOUS
    mov edi, -1     ; fd = -1
    xor ebp, ebp    ; offset = 0 (4096*0)
    int $80         ; make call

(см. соответствующий источник ядра для получения подробной информации о передаче параметров)

Я построил это с помощью NASM и проверил его, используя strace, который произвел:

mmap2(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf77ae000

Ответ 3

Альтернативой brk() является использование системного вызова mmap() с MAP_ANONYMOUS | MAP_PRIVATE.

Ответ 4

Используйте системный вызов brk для изменения конца сегмента данных.

Посмотрите здесь: http://www.linuxjournal.com/article/6390, чтобы понять, что вы делаете.