utilizado separar respuestas programación programacion preguntas para lenguaje instrucciones funciones examen cuál cuestionario con caracter basico c operating-system

separar - ¿Puedo ejecutar cualquier programa hecho sin ninguna plataforma OS?



examen de programacion en c (9)

Busqué en Google y en algún lugar leí ...

Sí tu puedes. Eso está sucediendo en el caso de los sistemas embebidos.

Creo que NO, no es posible. Cualquier plataforma debe tener un sistema operativo. O bien, su programa debe ser un sistema operativo. Ya sea blando o cableado. Sin un sistema operativo su componente no funcionaría.

¿Tengo razón o alguien me puede explicar la respuesta? (No tengo idea de sistemas embebidos ...)


Como un ejemplo: Construyendo sistemas de BRA de metal desnudo con GNU

Muchos sistemas embebidos no tienen recursos suficientes para un sistema operativo completo, algunos pueden usar un kernel de programador o RTOS, otros están codificados como "metal". El punto de entrada main () C se ingresa después del reinicio. Solo se requiere una pequeña cantidad de código de ensamblador para inicializar un microprocesador, para ejecutar el código C. Todo lo que necesita C para ejecutarse generalmente es una pila, por lo general simplemente se trata de inicializar el puntero de pila a una dirección específica. También puede ser necesaria alguna inicialización específica del procesador de vectores de interrupción / excepción, relojes del sistema, controladores de memoria, etc.

En una PC de escritorio, normalmente tiene un BIOS que maneja la inicialización básica del hardware, como la configuración y la sincronización del controlador SDRAM, y luego arranca desde un sector de arranque de disco, que luego a su vez arranca un sistema operativo. Cualquier parte de ese código podría escribirse en C (y probablemente parte de él), y podría hacer algo más que arrancar un sistema operativo, podría hacer cualquier cosa, es solo código.

Los sistemas operativos son útiles para dispositivos informáticos no dedicados donde el usuario final muchos seleccionan uno de los muchos programas para ejecutar y posiblemente varios simultáneamente. La mayoría de los sistemas integrados hacen una sola cosa, el software a menudo se carga desde la ROM o se ejecuta directamente desde la ROM, y nunca se cambia y se ejecuta indefinidamente (generalmente se detiene solo con el apagado).

Por supuesto, aún puede implementar controladores de dispositivos y similares, pero a menudo estos son una parte integral de la aplicación en lugar de una entidad separada. Incluso cuando utiliza un RTOS en un sistema integrado, en general sigue siendo integral para su aplicación en lugar de un sistema operativo en el sentido que pueda comprender. En estos casos, el RTOS es simplemente una biblioteca como cualquier otra, y a menudo se inicializa y se inicia desde main () en lugar de al revés, como podría esperarse.


Creo que te divertirías escribiendo kernels ''de juguete'' diseñados para funcionar bajo simuladores como QEMU (o plataformas de virtualización, Xen + MiniOS es uno de mis favoritos). Sin mucha (mucha) dificultad, podría tener una consola básica en funcionamiento y comenzar a imprimir cosas en ella. Es realmente divertido, educativo y satisfactorio a la vez.

Si está trabajando en x86 ... y consigue que su kernel spiffy funcione bajo QEMU ... hay muchas posibilidades de que también funcione en hardware real. Podrías disfrutarlo.

De todos modos, la respuesta a tu pregunta es decididamente sí. Es especialmente fácil si está usando un cargador de arranque ... por ejemplo, google memtest86 y tome el código.


Definitivamente no necesitas un sistema operativo para ejecutar tu código C en ningún sistema. Lo que necesitará son dos piezas de código de inicialización: una para inicializar el hardware necesario (procesador, reloj, memoria) y otra para configurar la pila y el tiempo de ejecución de C (es decir, la inicialización de datos y las secciones BSS). Esto, por supuesto, significa que no puede aprovechar los servicios de subprocesos múltiples, mensajería y sincronización que proporcionaría un sistema operativo. Intentaré dividirlo en algunos pasos para darle una idea:

  1. Escriba una "reset_routine" que se ejecute cuando se inicie el tablero. Esto inicializará el reloj y cualquier memoria externa necesaria. (Esta rutina deberá ejecutarse desde una memoria que sea interna o que se pueda inicializar y programar externamente).
  2. La raíz de reinicio, después de las inicializaciones de hardware, transfiere el control a una rutina "sw_runtime_init" que configurará la pila y los globales definidos por su aplicación. (Haga un salto desde reset_routine a sw_runtime_init en lugar de una llamada para evitar el uso de la pila).
  3. Compile y vincule esto a su aplicación, mientras se asegura de que "reset_routine" esté vinculado a la ubicación a la que apunta el vector de reinicio.
  4. Carga esto en tu objetivo y reza.

Los sistemas integrados son sistemas operativos legítimos por derecho propio, simplemente no son sistemas operativos de propósito general . Cualquier programa de usuario (es decir, un programa que no sea en sí mismo un sistema operativo) necesita un sistema operativo para ejecutarse.


Obviamente, no puede ejecutar ningún programa C arbitrario sin algún tipo de sistema operativo o equivalente de sistema operativo. Del mismo modo, puedo escribir un programa en C en Linux que no se ejecutará en Microsoft Windows.

Sin embargo, puedes escribir programas en C en casi cualquier cosa. Es un lenguaje popular para escribir software para sistemas embebidos, y muy a menudo no tienen un sistema operativo.

Muchos sistemas integrados tienen solo una CPU conectada a una ROM, con pines que salen del chip que están directamente conectados a las entradas y salidas. No hay E / S de usuario, ni sistema de archivos, ni programación de procesos, nada que normalmente se desea para un sistema operativo. En esos casos, un programador en C podría escribir un programa que se grabe en una ROM, que se encargará de todo.

(Algunos sistemas integrados son más complicados y pueden usar un sistema operativo. Linux se usa con frecuencia, ya que es gratuito para el uso, se puede hacer muy compacto y se puede cambiar en cualquier nivel. Sin embargo, no todos lo hacen).


Por lo general, cualquier programa C tendrá una variedad de llamadas al sistema que dependen del sistema operativo. Por ejemplo, printf realiza una llamada al sistema para escribir en el búfer de pantalla. Abrir archivos y cosas por el estilo también son llamadas al sistema.

Básicamente, puede ejecutar el código C que se compila y ensambla en un código de máquina en un procesador, pero si el código realiza alguna llamada al sistema, simplemente congelará el procesador cuando intente saltar a una ubicación de memoria que Piensa que es el sistema operativo. Por supuesto, esto dependería de que usted sea capaz de ejecutar el programa en primer lugar, lo que no es fácil sin el sistema operativo también.


Por supuesto que puede. Todo lo que necesita una CPU (típica) es poder y acceso a una memoria, luego ejecutará su secuencia de arranque codificada.

Por lo general, esto implicará leer una dirección predefinida, interpretar los contenidos allí como instrucciones y comenzar a ejecutarlos.

Estas instrucciones, por supuesto, podrían provenir de un programa en C, aunque a este nivel es más común escribir las primeras etapas (llamadas bootstrapping) en ensamblaje.

Por supuesto, esto no significa que, si leyera el título de su pregunta literalmente, cualquier programa de C se ejecute de esta manera. Si el programa asume que hay un sistema operativo, pero no lo hay, no funcionará. Esto debería ser bastante obvio.


Puede ejecutar un programa en un sistema sin un sistema operativo ... y ese programa no necesita ser un sistema operativo en sí mismo.

Piense en todas las computadoras (o procesadores, si lo prefiere) dentro de un automóvil: administración del motor, aire acondicionado, ABS, ..., ...
Todos esos sistemas tienen un programa (posiblemente escrito en C) en ejecución. Ninguno de los procesadores tiene un sistema operativo.

El estándar diferencia específicamente entre hosted implementations e freestanding implementations :

5.1.2.1 Freestanding environment 1 In a freestanding environment (in which C program execution may take place without any benefit of an operating system), the name and type of the function called at program startup are implementation-defined. Any library facilities available to a freestanding program, other than the minimal set required by clause 4, are implementation-defined. 2 The effect of program termination in a freestanding environment is implementation-defined. 5.1.2.2 Hosted environment 1 A hosted environment need not be provided, but shall conform to the following specifications if present. ...


cada pieza de hardware debe tener una pieza de software que lo opere, ya sea un firmware integrado (más pequeño y relativamente fijo, como vxworks) o un software de sistema operativo que pueda ejecutar un código arbitrario complejo encima de él (como Windows, Linux o Mac).

Piense en ello como una pila. En la parte inferior, tienes el hardware. Además de eso, una pieza de software que puede controlar ese hardware. Además de eso, puedes tener todo tipo de cosas. en el caso de un teléfono VoIP, tendrá vxworks que controla el hardware, y una capa encima de eso que maneja todas las aplicaciones del teléfono.

así que volviendo a tu pregunta, sí, PUEDES ejecutar cualquier programa en cualquier cosa, PERO depende de qué tipo de programa es. Si se trata de un programa C de bajo nivel que puede comunicarse con el hardware, entonces no necesita nada más que su programa y el hardware. Si se trata de un programa de nivel C (como un programa de chat), necesitas un montón de cosas entre tu programa y el hardware.

¿tener sentido?