Dynamiczna alokacja pamięci pod Linuksem

Już w średnio zaawansowanych programach pojawia się potrzeba dynamicznego rezerwowania pamięci, w czasie działania programu, nie wiedząc z góry, ile pamięci będzie potrzeba. Na przykład, użytkownik podaje nam rozmiar tablicy a my musimy taką tablicę utworzyć i na niej operować (nie znając wcześniej nawet maksymalnego jej rozmiaru). Rozwiązaniem takich problemów jest właśnie dynamiczna alokacja pamięci. Pod Linuksem pamięć alokuje się funkcją sys_brk (ustalającą najwyższy dostępny adres w sekcji danych). Przyjmuje ona jeden argument:

Jeśli coś się nie udało, sys_brk zwróci -1 (i ustawi odpowiednio zmienną errno) lub też zwróci ujemny kod błędu.

Oczywiście, argument funkcji może być większy (alokacja) lub mniejszy (zwalnianie pamięci) od wartości zwróconej przez sys_brk przy EBX=0.

Jak widać, teoria nie jest skomplikowana. Przejdźmy więc może do przykładu. Ten krótki programik ma za zadanie zaalokować 16kB pamięci (specjalnie tak dużo, żeby przekroczyć 4kB - rozmiar jednej strony pamięci - i udowodnić, że pamięć rzeczywiście została przydzielona) i wyzerować ją (normalnie zapisywanie po nieprzydzielonej pamięci skończy się zamknięciem programu przez system).


(przeskocz program)
; Dynamiczna alokacja pamięci pod Linuksem
;
; Autor: Bogdan D., bogdandr (at) op.pl
;
; kompilacja:
;
; nasm -f elf -o alok_linux.o alok_linux.asm
; ld  -o alok_linux alok_linux.o


section	.text
global	_start

_start:

	mov	eax, 45		; sys_brk
	xor	ebx, ebx
	int	80h

	add	eax, 16384	; tyle chcemy zarezerwować
	mov	ebx, eax
	mov	eax, 45		; sys_brk
	int	80h

	cmp	eax, 0
	jl	.problem	; jeśli błąd, to wychodzimy i nic się
				; nie wyświetli

	mov	edi, eax	; EDI = najwyższy dostępny adres

	sub	edi, 4		; EDI wskazuje na ostatni dostępny DWORD
	mov	ecx, 4096	; tyle DWORDów zaalokowaliśmy
	xor	eax, eax	; będziemy zapisywać zera
	std			; idziemy wspak
	rep	stosd		; zapisujemy cały zarezerwowany obszar
	cld			; przywracamy flagę DF do normalnego stanu

	mov	eax, 4
	mov	ebx, 1
	mov	ecx, info
	mov	edx, info_dl
	int	80h		; wyświetlenie napisu

.problem:

	mov	eax, 1
	xor	ebx, ebx
	int	80h



section	.data

info		db	"Udana alokacja pamieci.", 10
info_dl		equ	$ - info


Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)