¿Cómo puedo crear un ejecutable para ejecutar en una determinada arquitectura del procesador (en lugar de cierto OS)?

StackOverflow https://stackoverflow.com/questions/1344631

Pregunta

Así que me tome mi programa de C++ en Visual studio, compilar, y va a escupir un poco agradable archivo EXE.Pero EXEs sólo se ejecutará en windows, y he oído mucho acerca de cómo C/C++ compila en lenguaje ensamblador, que se ejecuta directamente en un procesador.El EXE se ejecuta con la ayuda de windows, o podría haber un programa que hace que un archivo ejecutable que se ejecuta en un mac.Pero no puedo compilar C++ de código en lenguaje ensamblador, que es específica del procesador?

Mi Punto De Vista:

  1. Supongo que soy probablemente no.Sé que hay un Intel C++ compiler, por lo que tendría que hacer procesador específicos de código de ensamblaje?Los archivos exe se ejecutan en windows, por lo que la ventaja de toneladas de cosas ya establecidas, a partir de los paquetes de gráficos a la masiva .NET framework.Un procesador específico ejecutable sería, literalmente, empezar desde cero, solo con el conjunto de instrucciones del procesador.

  2. Sería este ejecutable ser un tipo de archivo?Podríamos estar ejecutando windows y abrir, pero luego interruptor de control del procesador solo?Supongo que esto ejecutable sería algo así como un sistema operativo, en el que tendría que ejecutarse antes que cualquier otra cosa fue arrancado, y sólo el procesador conjunto de instrucciones "utilizar".

¿Fue útil?

Solución

Vamos a pensar acerca de lo que "ejecutar" significa...

Algo tiene que cargar los códigos binarios en la memoria.Que es un sistema operativo característica.El .EXE o el archivo ejecutable binario o paquete o lo que sea, tiene el formato de una muy específica del sistema operativo, de manera que el sistema operativo puede cargar en la memoria.

Algo tiene que girar el control a los códigos binarios.Hay OS, de nuevo.

Las rutinas de e/S (en C++, pero esto es cierto en la mayoría de los lugares) son sólo una biblioteca que encapsulan OS de la API.Drat que OS, está en todas partes.

Recordando los viejos tiempos.

En los días de antaño (sí, soy viejo) he trabajado en equipos que no tienen un sistema operativo.Tampoco teníamos C.

Escribimos la máquina de códigos de uso de herramientas como el "ensambladores" y "conectores" para crear grandes imágenes binarias que podemos cargar en la máquina.Tuvimos que cargar estas imágenes binarias a través de un doloroso proceso de arranque.

Tendríamos que usar teclas del panel frontal para la carga de código suficiente en la memoria para leer un práctico dispositivo como un puñetazo de papel-cinta lector.Esto cargará una pequeña pieza de bastante estándar de inicio de la vinculación del gestor de software.(Hemos utilizado cinta de mylar por lo que no se desgastan.)

Entonces, cuando teníamos esta vinculación cargador en la memoria, se podría alimentar a la cinta que habíamos preparado anteriormente con el ensamblador.

Escribimos nuestros propios controladores de dispositivo.O hemos utilizado rutinas de la biblioteca que estaban en forma de código fuente, un puñetazo en cintas de papel.

Un "parche" en realidad fue parcheado trozos de cinta de papel.Además, ya que también hubo pequeños errores, tendríamos que ajustar la imagen de la memoria basada en mano de instrucciones escritas: parches que no había sido puesto en la cinta.

Más tarde, tuvimos simple OS que tenían simple API simple controladores de dispositivo, y un par de utilidades como un "sistema de archivos", un "editor" y un "compilador".Fue para un lenguaje denominado Jovial, pero que también se utiliza Fortran a veces.

Tuvimos la soldadura de tarjetas de interfaz serial así que podría conectar un dispositivo.Tuvimos que escribir los controladores de dispositivo.

Línea De Fondo.

Usted puede escribir los programas de C++ que no requieren de un sistema operativo.

  1. Aprender acerca del hardware de la BIOS (o similar) establecimientos que son parte de su procesador, el chipset.La mayoría de hardware moderno tiene una simple OS cable en la ROM que hace power-on self-test (POST), carga un par de conductores simples, y localiza los bloques de arranque.

  2. Aprender a escribir su propio bloque de arranque.Que es el primer "software" cosa que se carga después de la POST.Esto no es tan difícil.Se pueden utilizar varias herramientas de partición a la fuerza de su bloque de arranque de programa en un disco y vas a tener un completo control sobre el hardware.No OS.

  3. Aprender cómo GRUB, LILO o BootCamp lanzamiento de un sistema operativo.No es complicado.Una vez que hayamos arrancado, puede cargar su programa y usted está fuera de funcionamiento.Esto es un poco más simple porque crear el tipo de partición que un gestor de arranque quiere cargar.La Base de la suya en el kernel de Linux y vas a ser más feliz.No trate de averiguar cómo Windows botas-es demasiado complicado.

  4. Leer en ELF. http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

  5. Aprender cómo los controladores de dispositivo están escritas.Si usted no utiliza un sistema operativo, tendrás que escribir los controladores de dispositivo.

Otros consejos

El problema es que el sistema operativo realmente hace mucho para iniciar sus programas. El archivo EXE se ha información de cabecera en ella que Windows reconoce, identificándose como un archivo EXE. Su aplicación hace todo, desde el acceso al sistema de archivos asignaciones de memoria, a través del sistema operativo.

Pero sí, se puede ejecutar aplicaciones compiladas para Windows / Intel en otras plataformas sin emulación. Si desea ejecutar el archivo EXE en un Mac o UNIX, tendrá que instalar el software un poco más para hacer el trabajo que Windows haría para ejecutar su programa -. Echar un vistazo al proyecto "Vino"

Lo que estamos hablando es de lo que se conoce en el mundo incrustado como una aplicación "bare-metal". Son muy comunes para cosas como un ARM Cortex-M3 que va en (por ejemplo) una caja validador de tarjeta de débito o un juguete interactivo, y no tiene suficiente memoria o capacidad de ejecutar un sistema operativo completo. Así, en vez de conseguir un compilador de "ARM / Linux" que compilar una aplicación para ejecutarse en Linux en un procesador ARM, se obtiene un compilador de "brazo desnudo de metal" que compila las cosas para su ejecución en un procesador ARM sin un sistema operativo. (Estoy usando el brazo en lugar de 86 como un ejemplo, ya que las aplicaciones de metal desnudo x86 son realmente muy raro en estos días.)

Como se indica en su pregunta y las otras respuestas, su aplicación tendrá que hacer algunas cosas que de otro modo serían atendidos por el sistema operativo.

En primer lugar, tiene que inicializar el sistema de memoria, los vectores de interrupción, y varios otros bits de tablero sustancia pegajosa. Normalmente esto es algo que un compilador de metal desnudo hará por ti, aunque si tiene una placa raro, es posible que tenga que decirle cómo hacerlo. Esto hace que las cosas desde el punto en el tablero se enciende hasta el punto donde comienza su función main ().

A continuación, tiene que interactuar con las cosas fuera de la CPU y la RAM. Un sistema operativo incluye todo tipo de funciones para hacer esto - disco I / O, la salida de pantalla, el teclado y el ratón de entrada, redes, etc., etc., y así sucesivamente. Sin un sistema operativo, usted tiene que conseguir que de otro lugar. Usted puede obtener algunos de que a partir de las bibliotecas de su fabricante de hardware; por ejemplo, una tabla que estaba jugando con recientemente tiene una pantalla LED de 40x200 píxeles, y que venía con una biblioteca con el código a su vez que en y establecer valores de píxeles individuales en él. Y hay varias compañías que venden las bibliotecas para implementar una pila TCP / IP y cosas por el estilo, para hacer una red o lo que sea.

Considere, por ejemplo, que esto hace que sea difícil de hacer incluso un printf básica. Cuando usted tiene un sistema operativo, printf simplemente envía un mensaje al sistema operativo que dice "poner esta cadena en la consola", y el sistema operativo se encuentra la posición actual del cursor en la consola, y lo hace todas las cosas para averiguar qué píxeles cambiar en la pantalla, y qué instrucciones de CPU a usar para cambiar los píxeles, con el fin de hacer eso.

Ah, y ¿le hemos dicho que primero tiene que encontrar la manera de obtener el programa en la CPU? Un equipo típico tiene un poco de ROM programable que se va a cargar instrucciones desde el momento en que se inicia. En un sistema x86, este es el BIOS, y por lo general ya contiene un programa práctico que se inició la CPU, inicia la pantalla, se ve para los discos, y carga un programa fuera del disco que encuentra. En un sistema integrado, que es típicamente cuando el programa va - lo que significa que necesita alguna manera de poner su programa de allí. A menudo, esto significa que tiene un dispositivo llamado "depurador" que se une físicamente a la junta incorporada que carga el programa - y también puede hacer cosas que le permiten pausar el procesador y determinar lo que su estado es, para que pueda entrar a través de su programa como si se estuviera ejecutando en un depurador de software en su ordenador. Pero estoy divagando.

De todos modos, para responder a su segunda pregunta, este ejecutable que crearía es algo que se almacena en la ROM que en su tablero incrustado - o quizás usted acaba de almacenar un bit de la misma en la memoria ROM (que es, después de general, bastante pequeño) y almacenar el resto en una unidad flash, y el bit en la ROM incluiría las instrucciones para obtener el resto de la unidad flash. Probablemente se almacena como un archivo en el ordenador principal (es decir, el Linux o Windows donde se está creando), pero eso es sólo para el almacenamiento, sería no se ejecutan allí.

Se dará cuenta de que cuando se tiene una gran cantidad de estas bibliotecas juntas, que están haciendo un poco de lo que hace un sistema operativo, y hay una especie of este espacio entre la pila de bibliotecas y un sistema operativo real. En ese espacio se va lo que se llama un RTOS - "sistema operativo en tiempo real". Los más pequeños de éstos son en realidad colecciones de bibliotecas que trabajan juntos para hacer todas las cosas operativo SYSTEMY, ya veces también incluir cosas para que pueda ejecutar múltiples hilos a la vez (y entonces usted puede tener diferentes hilos actúan como diferentes programas) - - a pesar de todo esto es todo lo compilado en el mismo "programa", compilado, y el RTOS es realmente nada más que una biblioteca que ha incluido. Los más grandes comienzan a almacenar partes del código en lugares separados, y creo que algunos de ellos incluso pueden cargar piezas de código fuera de los discos - al igual que Windows y Linux hacen cuando se ejecuta un programa. Es una especie de un continuo, en lugar de una o / o.

El sistema FreeRTOS es un RTOS de código abierto que es hacia el extremo más pequeño del espacio RTOS; que podría ser un buen lugar para ver algunas de esto si usted está más interesado. Tienen algunos ejemplos de aplicaciones x86, lo que le daría una idea de qué tipo de sistemas x86 correría un programa basado en RTOS completo o en y cómo se había compilar algo para ejecutarse en uno; enlazar aquí: http://www.freertos.org/a00090.html#186 .

El equipo no es la CPU. Para hacer nada útil, la CPU tiene que estar conectado a la memoria y controladores IO y otros dispositivos. Un sistema operativo se encarga de abstraer de todo eso de los programas en ejecución. Por lo tanto, si desea escribir un programa que se ejecuta sin un sistema operativo, el programa tendrá que repetir al menos algunas de las características de un sistema operativo: Tomando el relevo de la BIOS durante el proceso de arranque, dispositivos de inicialización, la comunicación con el controlador de disco para cargar código y datos, la comunicación con el controlador de pantalla para mostrar información al usuario, la comunicación con el controlador del teclado y el controlador del ratón para leer la entrada del usuario, etc, etc etc.

A menos que usted está construyendo un sistema embebido con hardware especializado, no hay ninguna razón para hacer esto. Además, el funcionamiento de su programa significaría el usuario tendría que dejar de correr otros programas. Si bien esto puede ser aceptable para un cajero automático hoy o WordStar en 1984, hoy en día la gente con buenos ojos no ser capaz de consultar el correo electrónico mientras se escucha música.

Por supuesto, existen. Se les llama compiladores cruzados . Por ejemplo, así es como me puedo programar para la plataforma iPhone usando Xcode.

Un tipo relacionado de compilador es uno que compila una plataforma virtual. Así es como funciona Java .

Cualquier compilador / conjunto de herramientas dado produce código para una combinación particular procesador / OS. Por lo que su Visual Studio compila ejemplo produce código para x86 / Windows. .EXE que sólo se ejecutará en x86 / Windows y no en (por ejemplo) ARM / Windows (como el usado por algunos teléfonos móviles).

Para producir código para una combinación de procesador / OS distinto de lo que se está ejecutando en el compilador requiere lo que se conoce generalmente como un compilador cruzado. Si usted tiene una suscripción profesional completa de Visual Studio, se puede obtener el compilador cruzado brazo, que le permitirá producir archivos ARM / Windows .EXE que no se pueden ejecutar en su máquina de escritorio, pero se ejecutará en un / teléfono móvil basado en Windows ARM o palmtop.

Sí, se puede hacer un archivo ejecutable que se ejecuta en el 'metal desnudo' de un procesador. Obviamente que es como sistema operativo núcleos trabajo. Lo principal que hay que hacer es crear un archivo ejecutable que no utiliza bibliotecas en absoluto. Sin embargo, la restricción "sin bibliotecas" incluye la biblioteca estándar de C! Eso quiere decir que hay malloc, sin printf, etc. Hay que ser, básicamente, su propio sistema operativo y gestionar la memoria y E / S a sí mismo. Esto requerirá inevitablemente una buena cantidad de trabajo directamente en el montaje en algún momento.

También pierde varios otros lujos, como main (), que no puede ser el punto de partida de su programa desde main () es algo que es invocado por el sistema operativo y el entorno de tiempo de ejecución C.

Por supuesto! Eso es lo que es la programación incrustado. Como probablemente muchos han dicho ya que el sistema operativo lo hace un poco para usted. E incluso en el mundo embebido sin un sistema operativo una serie de herramientas de desarrollo proporcionará el código de inicio para obtener el procesador funcionando lo suficiente para saltar a su programa. Algunos / C / muchos proporcionan bibliotecas golpe completo de C ++ para que pueda llamar a funciones como memcpy () y, a veces incluso malloc () y printf ().

Usted es bienvenido a proporcionar a cada línea de código y todas las instrucciones y no utilizar un paquete de herramientas de desarrollo, pero todavía utilizar un compilador gcc como por ejemplo. Algunos de los formatos binarios son comunes a los que se ejecutan en sistemas operativos como Elf por ejemplo. Puede ejecutar archivos ELF en Linux, pero también tienen el resultado de su programa incorporado en un binario ELF. El procesador no puede ejecutar duende en ese formato, pero cualquiera que sea programas de la PROM de arranque o de carnero, en algunos casos extraerá el programa binario del archivo elf, no a diferencia de un sistema operativo extraer el programa se ejecute desde un archivo ELF. EXE no es uno de los formatos de archivo. Su compilador uso de las ventanas favorito no es probablemente un compilador integrado o bien aunque a veces se puede utilizar uno para hacer las cosas de lenguaje de alto nivel y luego usar un ensamblador y enlazador alternativo. Más trabajo de lo que vale por lo general. Por ejemplo se escribe una función en C (que no hace ninguna biblioteca o sistema de llamadas), compilar que a un objeto. Escribe tu propia o encontrar una utilidad para extraer el archivo binario compilado a partir de ese objeto, convertirlo a otro formato de objeto o al ensamblador (desmontar). Añadir su código de inicio y otra de montaje a la misma. Montar y conectar todo juntos como un programa incorporado. Lo hice una vez con Microsoft de Visual C incrustadas sólo para ver cómo se mide la altura de otros compiladores, que no era horrible, pero sin duda no valía la pena el esfuerzo de la piratería para llegar a la salida.

Cada procesador de aquel en el equipo para el que está en su teléfono celular o en el microondas también ha tener algún código de arranque. Ese código no se ejecuta en un sistema operativo. Ese código utiliza las mismas o similares compiladores que opera uso aplicaciones del sistema. Para algunos dispositivos que pone el código de procesador y memoria y periféricos dentro y fuera de chip en un estado donde se puede iniciar el sistema operativo. Desde allí, el sistema operativo se hace cargo. En el ordenador Esta sería la BIOS seguido por el gestor de arranque y, a continuación, finalmente, el sistema operativo, DOS, Windows, Linux, etc.

El problema principal es el formato de archivo. PE es muy diferente a ELF (Se utiliza en sistemas tipo Unix). Un programa de educación física válida no puede ser un ELF válida. Por lo tanto, ya sea cargar el binario de forma dinámica con entradas diferentes o tiene que darse por vencido.

Aparte de eso, con el conocimiento de los servicios del sistema operativo, el valor de los registros en el arranque, etc., probablemente, su código puede detectar fácil y fiable qué sistema operativo se está ejecutando bajo y actuar en consecuencia (Algunos malware se hace precisamente eso). Otro reto es entonces la reutilización de código en lugar de tener dos o más programas diferentes en el mismo binario. Básicamente, usted tendría que escribir un emulador, al menos para los servicios que necesita.

También no se olvide de las bibliotecas de Windows. Mira en QT y GTK +

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top