Una sobrecarga de ejecutar el programa en Linux frente a bare-metal incrustado

Digamos que tengo un ARM Cortex-A multinúcleo.

Ahora tengo un Linux, con el parche RT_PREEMPT (llamado Linux en tiempo real ). Ejecuto procesos con afinidad establecida en un núcleo y alta prioridad (por encima de 50).

Gracias al parche en tiempo real, incluso el programador del kernel no puede adelantarse a mi proceso y, gracias a la afinidad, puede ejecutarse todo el tiempo en un solo núcleo (y el sistema operativo en otros).

En tales condiciones, ¿hay alguna diferencia (es decir, gastos generales) de ejecutar dicho código en Linux frente a bare-metal?
¿Será el rendimiento el mismo? Si no, ¿por qué?

Bueno, ¿no sería la sobrecarga el sistema operativo completo con todos sus controladores de alto nivel y todo eso?
@Rev1.0 no, a menos que pueda demostrar que estos controladores a) se usan yb) son significativamente menos eficientes que un controlador que realmente existe y se usa en una implementación básica.

Respuestas (1)

Los gastos generales no se relacionan con la preferencia. La preferencia detiene su proceso y ejecuta otro proceso. Si deshabilita eso, por ejemplo, para un núcleo de CPU, tiene el núcleo de CPU solo para su proceso.

Aún así, hay una sobrecarga si realiza E/S a través de las funciones de E/S de Linux, por ejemplo, controlando las líneas de E/S directamente a través de su proceso. Pero, para cualquier E/S razonablemente complicada, usted mismo tuvo que implementar una función con una sobrecarga similar y puede suponer que la gente de Linux es mejor que usted en eso: más experiencia y más casos de prueba.

Por lo tanto, la única forma en que podría ganar la carrera de gastos generales es con funciones de E/S muy básicas (por ejemplo, bitbanging en un protocolo exótico y rápido) que implementa usted mismo en "su kernel" en lugar de ejecutarlo a través de las diversas capas de abstracción del subsistema Linux GPIO y haga lo mismo en "su proceso de espacio de usuario".

Muchas gracias. Recibo esto con demasiada frecuencia: "¡pero la abstracción del núcleo hace que las cosas sean más lentas!" y la pura verdad es que probablemente querrá hacer más o menos lo mismo que el kernel si el uso que hace de un dispositivo es lo suficientemente complejo. Y en ese caso, escribir su propio código de espacio de kernel suele ser la forma más fácil de lograr el éxito. Así que tu respuesta es muy buena para mi alma torturada.
Las personas a veces se sienten inseguras acerca de afirmar que usar el subsistema GPIO tomará aproximadamente 20 veces más que una sola instrucción . Eso es cierto, pero entonces, ¿quién hace eso para cosas en las que el tiempo es crítico? Si tiene que sacar las cosas tan rápido, piense en DMA y hágalo mucho más rápido.
Exactamente. Prácticamente en todos los procesadores ARM, todas las E/S están asignadas a la memoria, por lo que literalmente no hay sobrecarga del kernel si solo asigna esa memoria en su espacio de proceso.
Sí, olvidé mencionar que me refiero a ejecutar exactamente el mismo código C bare-metal vs Linux. Entonces, incluso si usa Linux, no me refiero a usar nada que venga de Linux (controladores, llamadas al sistema, etc.). Solo C puro. Entonces, entiendo que entonces no hay ningún gasto adicional por usar Linux. Me preguntaba, por ejemplo, el hecho de que Linux usa memoria virtual (mientras que bare-metal usa direcciones directas). Si declaro algunas variables, tendrán una dirección de memoria virtual en Linux. ¿No hay gastos generales de traducir una dirección virtual a una física? ¿Alguna paginación, etc.?
La MMU es una pieza de hardware y es la velocidad de la RAM. Siempre tiene direcciones virtuales en su programa, no usar la MMU simplemente significa tener solo una tabla de mapeo fija cargada en el inicio del sistema. Si desea deshabilitar la paginación para una página o proceso, puede recomendarle al kernel que marque las asignaciones para su proceso como no paginables con mlock() y mlockall().
Gracias @Janka, eso es interesante. Entonces puedo deshabilitar la paginación. Pero, ¿la paginación tiene alguna sobrecarga? Quiero decir, si desactivo la paginación, ¿lo hará, aunque sea un poco, más rápido? ¿O MMU es completamente hardware y no importa?
La paginación tiene una sobrecarga tan pronto como la suma de la memoria utilizada por todos los programas en el sistema es mayor que la memoria RAM física que tiene el sistema. Porque entonces, el núcleo almacenaría las páginas que rara vez se usan en el disco duro o en la memoria flash, lo que sea que esté instalado como espacio de intercambio. Si se necesitan de nuevo, tenían que volver a leerse en la RAM. mlock() y mlockall() le dicen al núcleo que no haga esto en algunas/cualquier página que necesite su proceso. Por lo tanto, estas páginas siempre están en la RAM y nunca necesitan restaurarse desde el espacio de intercambio.