J'essaie d'émuler ce tutoriel (http://blog.reverberate.org/2012/12/hello-jit-world-joy-of-simple-jits.html) pour écrire un simple jit. Je ne suis pas sûr si l'interface python pour mmap supporte le cas d'utilisation suivant. Le code C (en cas de disparition du lien) ressemble à ceci.python mmap pour jit code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
int main(int argc, char *argv[]) {
// Machine code for:
// mov eax, 0
// ret
unsigned char code[] = {0xb8, 0x00, 0x00, 0x00, 0x00, 0xc3};
if (argc < 2) {
fprintf(stderr, "Usage: jit1 <integer>\n");
return 1;
}
// Overwrite immediate value "0" in the instruction
// with the user's value. This will make our code:
// mov eax, <user's value>
// ret
int num = atoi(argv[1]);
memcpy(&code[1], &num, 4);
// Allocate writable/executable memory.
// Note: real programs should not map memory both writable
// and executable because it is a security risk.
void *mem = mmap(NULL, sizeof(code), PROT_WRITE | PROT_EXEC,
MAP_ANON | MAP_PRIVATE, -1, 0);
memcpy(mem, code, sizeof(code));
// The function will return the user's value.
int (*func)() = mem;
return func();
}
Mon code python pour le même ressemble à ceci.
code = [0xb8, 0x00, 0x00, 0x00, 0x00, 0xc3]
import mmap
import ctypes
size_in_bytes = len(code) * 4
mem = mmap.mmap(-1, size_in_bytes, prot=mmap.PROT_WRITE | mmap.PROT_EXEC, flags= mmap.MAP_ANON | mmap.MAP_PRIVATE)
# mmap.mmap.move(mem, ctypes.addressof(code), size_in_bytes)
mem.write(ctypes.addressof(code), size_in_bytes)
ftype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p)
f = ftype(mem)
f()
Cependant, l'exécution de cette erreur me donne l'erreur.
Traceback (most recent call last):
File "main.py", line 10, in <module>
mem.write(ctypes.addressof(code), size_in_bytes)
TypeError: invalid type
Alors ma question est de savoir comment obtenir des pages inscriptibles mmap et comment copier les données afin qu'il puisse être jitted. Si ce n'est pas directement accessible depuis python, puis-je utiliser l'interface python c pour utiliser l'implémentation C sous-jacente?
La plupart des interfaces jit que j'ai examinées utilisent llvm ou un autre jit sous-jacent. Mais je ne pouvais pas vraiment comprendre comment PyPy le fait. Des idées ?
Merci rofls. J'ai essayé avec ce code après avoir ajouté le vôtre. mmap.mmap.move (mem, ctypes.addressof (arr), size_in_bytes) Je reçois l'erreur -> Traceback (dernier appel en dernier): Fichier "main.py", ligne 9, en mmap.mmap .move (mem, ctypes.addressof (arr), size_in_bytes) TypeError: move() prend exactement 3 arguments (2 donnés) –
ssarangi
@ssarangi, je l'ai trouvé aussi. Cela fonctionne: 'mem.write (arr)' mais je ne suis pas sûr si c'est ce que vous voulez à ce point ... – rofls
mem.write (arr) fonctionne et mon prochain problème est l'objet mem assigné au pointeur de fonction (ftype) étant assigné comme dans le code C.L'autre chose est de savoir comment Mem.Write comprendre combien d'octets à écrire? – ssarangi