Как динамически распределять память, используя ассемблер и системные вызовы под Linux - PullRequest
22 голосов
/ 06 мая 2010

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

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

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

Ответы [ 4 ]

10 голосов
/ 13 декабря 2012

В 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
5 голосов
/ 06 мая 2010

brk(2). И взгляните на ELF .

2 голосов
/ 07 мая 2010

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

1 голос
/ 06 мая 2010

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

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

...