How to Dynamically Allocate Memory Using Assembly and System Calls Under Linux
On Linux mmap2
is a sensible system call to use for this at a low level. It takes 6 arguments, so in IA32 you can call it using:
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
(See the relevant kernel source for details on the parameter passing)
I built this with NASM and verified it worked using strace
, which produced:
mmap2(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf77ae000
An alternative to brk()
is to use the mmap()
system call, with MAP_ANONYMOUS | MAP_PRIVATE
.