es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

lldb – Cómo leer los permisos de una región de memoria para un hilo?

Apple indica que en las Mac con ARM64, las regiones de memoria pueden tener permisos de escritura o de ejecución para un hilo. ¿Cómo se puede averiguar los permisos actuales de una región de memoria para un hilo en lldb? He intentado ‘memory region <dirección>’ pero eso devuelve rwx. Estoy trabajando en un compilador Just-In-Time que se ejecutará en mi Mac M1. Para las pruebas, hice una pequeña simulación de un compilador Just-In-Time.

#include
#include <sys/mman.h>
#include <pthread.h>
#include <libkern/OSCacheControl.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {

size_t size = 1024 * 1024 * 640;
int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_JIT;
int fd = -1;
int offset = 0;
unsigned *addr = 0;

// asignar una región de memoria mmap'ed
addr = (unsigned *)mmap(0, size, prot, flags, fd, offset);
if (addr == MAP_FAILED){
    printf("se ha detectado un error\n");
    exit(-1);
}

pthread_jit_write_protect_np(0);

// Escribir las instrucciones en la memoria
addr[0] = 0xd2800005;  // mov x5, #0x0
addr[1] = 0x910004a5;  // add x5, x5, #0x1
addr[2] = 0x17ffffff;  // b <direccion>

pthread_jit_write_protect_np(1);
sys_icache_invalidate(addr, size);

// Ejecutar el código
int(*f)() = (int (*)()) addr;
(*f)();

return 0;

}

Una vez que las instrucciones de ensamblador comienzan a ejecutarse a través de la llamada (*f)(), puedo pausar la ejecución en Xcode y escribir

memory region {dirección de las instrucciones}

en el depurador. Por alguna razón, sigue devolviendo ‘rwx’. ¿Estoy usando el comando correcto o podría ser un error de lldb?</dirección>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para averiguar los permisos actuales de una región de memoria para un hilo en lldb, puedes usar el comando memory region

    . Este comando debería devolver los permisos actuales de la región de memoria, como rwx. Si está devolviendo rwx para tu región de memoria, entonces podrías estar utilizando el comando incorrecto o podría haber un error con lldb.

Comments are closed.