2010-05-06 11 views
17

Sto cercando alcuni esempi di codice di allocazione dinamica della memoria utilizzando un linguaggio assembly sotto Linux e utilizzando le chiamate di sistema, non malloc e amici.Come allocare dinamicamente la memoria tramite assembly e chiamate di sistema su Linux

Quali sono alcuni dei modi più semplici ma efficaci per farlo?

Su computer Intel 386+.

+0

http://programmedlessons.org/AssemblyTutorial/Chapter-33/ass33_1.html un'occhiata qui si ha la tua domanda nell'intestazione, sembra che è fatto come una classe. potrebbe aiutare. –

risposta

4

brk(2). E dai uno sguardo allo ELF.

+0

Qual è il "segmento di dati" a cui si riferisce la pagina man? – mudge

+0

Vedere il collegamento ELF sopra. –

2

Un'alternativa a brk() consiste nell'utilizzare la chiamata di sistema mmap(), con MAP_ANONYMOUS | MAP_PRIVATE.

7

Su Linux mmap2 è una chiamata di sistema ragionevole da utilizzare per questo a un livello basso. Ci vogliono 6 argomenti, così in IA32 si può chiamare usando:

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 

(Vedere la relevant kernel source per i dettagli sul passaggio di parametri)

ho costruito questo con NASM e verificata ha funzionato usando strace, che ha prodotto :

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

Errore da correggere: '(0x02 | 0x20)' è 34, non 22. Inoltre, 'PROT_EXEC' non è necessario per allocare memoria. – Hibou57

+0

@ Hibou57 A meno che non mi manchi qualcosa $ 22 è esadecimale 22 che è corretto per '(0x02 | 0x20)'. Non ha bisogno di exec, ma il codice di esempio che stavo scrivendo aveva bisogno di esso così l'ho lasciato così com'era. – Flexo

+0

Sì, hai ragione, sta usando la sintassi NASM (l'ho erroneamente rosso come letterale 'gas'). Nota: circa il descrittore del file è -1, ho controllato amd64 (non lo stesso elenco di assembly, ovviamente) richiede 0 e restituisce '-EINVAL' con -1. Sui386, sia -1 che 0 funzionano, quindi almeno prendendo i386 e amd64, in considerazione, 0 è più portatile di -1, almeno dal kernel Linux 2.8. – Hibou57

Problemi correlati