La arquitectura más simple posible que se puede virtualizar y ejecutar el kernel de Linux


Me he inspirado en la implementación de Fabrice Bellard de una máquina virtual x86 en Javascript, y me gustaría intentar escribir la máquina virtual más simple posible que sea capaz de ejecutar el núcleo Linux. Se trata de un esfuerzo puramente educativo, sin otro propósito que el de comprender y compartir el código que lo hace posible.

Habiendo echado un vistazo a la especificación x86 , sospecho que podría estar arrojándome al extremo profundo al tratar de escribir una máquina virtual capaz de emular el conjunto de instrucciones x86 completo. En cambio, estoy buscando una arquitectura más simple que pueda intentar emular.

He leído esta pregunta que pregunta cómo emular la arquitectura x86, y la respuesta sugiere comenzar con algo más simple, como la arquitectura ARM. Mi pregunta es más específica: ¿cuál es la arquitectura más simple posible que puedo intentar emular que será capaz de ejecutar el Linux kernel?

Estoy interesado en emular completamente toda la máquina, no simplemente pasar instrucciones a la máquina host (lo que, por ejemplo, sería posible si estuviera escribiendo un emulador x86). Tengo una cantidad decente de conocimientos de ensamblado de 16 bits, y algunos antecedentes de teoría de sistemas operativos, por lo que esto debería estar al alcance con suficiente trabajo.

Author: Community, 2013-02-26

4 answers

La arquitectura más simple posible será desde el punto de vista de la facilidad de implementación. Dado que está construyendo un emulador que emula completamente la máquina, lo que tenga el Diseño/Arquitectura de Conjunto de instrucciones más simple será adecuado. Las arquitecturas RISC sin duda son mejores. Pero elegir una arquitectura que no se usa ampliamente tampoco es bueno, si necesita apoyo pocos podrían ayudarlo. Escribir un simulador no es pan comido. Yo diría que vaya por ARM o MIPS, ambos son popular:

También debe saber que la máquina virtual javascript de Fabrice Bellard utiliza CPU compatible con x86 de 32 bits, algo que es compatible con Linux de forma nativa. Tendría que portar el kernel de Linux (usar toolchains) para ARM o MIPS usted mismo. Ver enlaces sobre cómo usar el kernel de linux

Para MIPS:

Para el BRAZO:

 6
Author: user568109,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:30

La lista de arquitecturas soportadas por el kernel de Linux:

Http://en.wikipedia.org/wiki/List_of_Linux_supported_architectures

El "más simple posible" es algo subjetivo, pero aquí están los que creo que son menos complicados de esa lista:

  • MIPS
  • H8 (µClinux)
  • 68k / Coldfire (µClinux)
 3
Author: Igor Skochinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-26 13:40:59

Como dije en los comentarios, equilibraría tres aspectos:

  • conjunto de instrucciones simple (pocos formatos de instrucción, pocos opcodes: cualquier cosa que NO sea como x86)
  • documentación: ampliamente disponible. Esto significa potencialmente descartar algunas arquitecturas simples para concentrarse en las ampliamente soportadas (por ejemplo, x86 gana aquí, pero también se encuentra una gran cantidad de material en RISC y especialmente MIPS de la academia). O ir por algo abierto, como OpenRISC
  • facilidad de uso en "modo kernel". En modo kernel privilegiado hay un mundo completamente nuevo de registros, instrucciones e internos a considerar. Y no olvide que un procesador viene con un autobús también, y los procesadores simples pueden tener autobuses muy complejos! Y usted tendrá que emular eso también. O bien, puede optar por Modo de usuario Linux , si está satisfecho con él.

Al final, sugeriría algo "viejo": razonablemente simple, especialmente en modo privilegiado, bien estudiado y documentado. Para ejemplo, el MIPS original, la familia Motorola 68k, o algo cercano al RISC original ( http://en.wikipedia.org/wiki/Berkeley_RISC ), si hay una variante de Linux para ello!

 2
Author: Lorenzo Dematté,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 14:26:53

Puede ver el microBlaze, un procesador diseñado para una implementación eficiente en FPGA. Tiene solo dos formatos de instrucción y 32 valores de opcode primario.

Está definido y soportado por Xilinx para su línea de FPGA el documento de referencia está en : http://www.xilinx.com/support/documentation/sw_manuals/mb_ref_guide.pdf

 0
Author: HBP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-26 18:53:19