⚙️GESTION DE LA MEMORIA

El nucleo proporciona la llamada al sistema sys_brk() para asignar memoria sin necesidad de moverla mas tarde. Esta llamada asigna memoria justo detras de la imagen de la aplicacion en la memoria. Esta funcion del sistema le permite establecer la direccion mas alta disponible en la seccion de datos.

Esta llamada al sistema toma un parametro, que es la direccion de memoria mas alta que se necesita establecer. Este valor se almacena en el registro EBX.

En caso de cualquier error, sys_brk() devuelve -1 o devuelve el propio codigo de error negativo. El siguiente ejemplo demuestra la asignacion de memoria dinamica.

EJEMPLO:

El siguiente programa asigna 16kb de memoria usando el sistema sys_brk():

section .data
    msg db '16kb asignados', 10
    len equ $ - msg

section .text
    global _start
    
_start:
    mov eax, 45        ; Cargamos 45 a eax
    mov ebx, ebx       ; Se hace solo para eetar seguro que ebx este limpio
    int 0x80
    
    add eax, 16384     ; Agregamos 16384 a eax, que es igual a 16kb
    mov ebx, eax       ; Lo movemos a ebx
    mov eax, 45        ; Volvemos a cargar 45 para llamada al sistema
    int 0x80
    
    cmp eax, 0         ; Compara eax con 0
    jl exit            ; Salta a exit si el resultado es menor que 
    mov edi, eax       ; Movemos eax, a edi
    sub edi, 4         ; Restamos 4 a edi
    mov ecx, 4096      ; Agregamos 4069  a ecx, este funcionara como contador
    xor eax, eax       ; Establece eax en 0
    std                ; Establece la direccion de flujo desendente (decre edi)
    rep stosd          ; Repite stosd. Almacena ceros de 32 bits y apunta a edi
    cld                ; Restablece el flujo en modo desendente
    
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, len
    int 0x80

exit:    
    mov eax, 1
    xor ebx, ebx
    int 0x80

Última actualización