Estoy escribiendo una máquina virtual en C solo por diversión. Lame, lo sé, pero afortunadamente estoy en SO así que espero que nadie se burle :)Escribir una máquina virtual - ¿código de bytes bien formado?
Escribí una VM realmente rápida que lee líneas de (mi) ASM y hace cosas. En este momento, sólo tengo 3 Instrucciones: add
, jmp
, end
. Todo está bien y es realmente muy bien ser capaz de alimentar a las líneas (hacer algo así como write_line(&prog[1], "jmp", regA, regB, 0);
y después de ejecutar el programa:
while (machine.code_pointer <= BOUNDS && DONE != true)
{
run_line(&prog[machine.cp]);
}
estoy usando una tabla de búsqueda de código de operación (que puede no ser eficiente pero es elegante) en C y todo parece estar funcionando bien
Mi pregunta es más una pregunta de "mejores prácticas" pero creo que hay una respuesta correcta. Estoy haciendo que la VM pueda leer archivos binarios (almacenamiento de bytes) en unsigned char[]
) y ejecutar bytecode. Mi pregunta es: ¿es el trabajo de la VM asegurarse de que el bytecode es bien formado o es solo el trabajo del compilador para asegurarse de que el archivo binario que escupe está bien formado?
Solo pregunto esto porque, ¿qué pasaría si alguien editara un archivo binario y atornillara cosas (borre partes arbitrarias de él, etc.)? Claramente, el programa sería defectuoso y probablemente no funcional. ¿Es esto incluso el problema de la máquina virtual? Estoy seguro de que personas mucho más inteligentes que yo han descubierto soluciones a estos problemas, ¡solo tengo curiosidad por saber qué son!
respuesta perfecta, gracias! –