Me preguntaba si había cualquier recurso disponible en línea que explica lo que sucede con algo, como printf de C, que explica lo que está pasando en el nivel muy bajo (BIOS/llamadas al kernel)Comprender el hardware de printf
Respuesta
Linux:
printf() ---> printf() en la biblioteca de C ---> write() en la biblioteca de C ---> escritura () llamada al sistema en kernel.
Para comprender la interfaz entre el espacio de usuario y el espacio del núcleo, necesitará tener algún conocimiento de cómo funciona system calls.
Para comprender lo que está sucediendo en los niveles más bajos, deberá analizar el código fuente en el kernel.
El Linux system call quick reference (enlace en pdf) puede ser útil ya que identifica en qué parte de la fuente del núcleo puede comenzar a buscar.
Un buen ejercicio para hacer, aunque será algo difícil, sería rastrear la llamada a través del kernel de Linux. Puede dL en http://www.kernel.org/
Esto es muy específico de la plataforma. Desde la perspectiva del hardware, la implementación de servicios de fondo de printf() podría ser dirigido a un puerto serie, un LCD no de serie, etc. Realmente estás haciendo dos preguntas:
¿Cómo funciona printf() interpretar los argumentos y la cadena de formato para generar la salida correcta?
¿Cómo se obtiene la salida de printf() en su dispositivo de destino?
Debe recordar que no es necesario un SO, kernel y BIOS para que una aplicación funcione. Las aplicaciones incorporadas suelen tener printf() y otras rutinas IO para escribir en un búfer de anillo de caracteres. Una interrupción puede sondear ese búfer y manipular el hardware de salida (LCD, puerto serie, láser show, etc.) para enviar la salida almacenada en el buffer al destino correcto.
Por definición, las llamadas al BIOS y al kernel son específicas de la plataforma. ¿En qué plataforma estás interesado? Varios enlaces a información relacionada con Linux ya han sido publicados.
También tenga en cuenta que printf
puede que no tenga como resultado ninguna llamada al BIOS o kernel, ya que su plataforma puede no tener un kernel o BIOS (los sistemas integrados son un buen ejemplo de esto).
Algo como printf, o printf específicamente? Eso es algo vago.
imprime salidas en el flujo de archivos predefinidos FILE *; con lo que eso está asociado depende el sistema y además se puede redirigir a cualquier otro dispositivo de transmisión para el cual el sistema operativo proporciona un controlador de dispositivo adecuado. Trabajo en sistemas integrados, y la mayoría de las veces stdout se dirige de forma predeterminada a un UART para E/S en serie; a menudo es el único dispositivo de E/S de transmisión compatible y no se puede redireccionar. En un sistema operativo GUI para aplicaciones en modo consola, la salida se 'dibuja' gráficamente en la fuente del terminal definida por el sistema en una ventana; en Windows, por ejemplo, esto puede involucrar llamadas GDI o DirectDraw, que a su vez acceden al controlador de dispositivo del hardware de video.En un sistema operativo de escritorio moderno, la salida de caracteres de la consola no involucra al BIOS en absoluto más que tal vez el arranque inicial.
En resumen, normalmente hay una gran cantidad de software entre una llamada printf() y el hardware en el que se emite.
El printf() toma múltiples argumentos (función de argumentos de longitud variable). El usuario proporciona una cadena y argumentos de entrada.
La función printf() crea un búfer interno para construir cadena de salida. Ahora, printf() repite a través de cada carácter de cadena de usuario y copia el carácter a la cadena de salida. Printf() solo se detiene en "%".
"%" significa que hay un argumento para convertir (los argumentos tienen la forma de char, int, long, float, double o string). Lo convierte en una cadena y lo agrega al búfer de salida. Si el argumento es una cadena, entonces hace una copia de cadena.
Finalmente, printf() puede llegar al final del pinchazo del usuario y copia todo el búfer en el archivo stdout.
- 1. ¿Conocimiento de hardware en informática?
- 2. Comprender el MECHNISM búsqueda DNS
- 3. Comprender el método $ .validator.unobtrusive.adapters.addBool()
- 4. Comprender el archivo Gemfile.lock
- 5. Comprender el futuro/subprocesamiento
- 6. Comprender el Protocolo de Bittorrent
- 7. Comprender el operador de desplazamiento
- 8. Comprender el concepto de Inodes
- 9. Comprender el fibonacci de Haskell
- 10. Comprender el uso de llaves
- 11. QGL ¿Aceleración de hardware y hardware?
- 12. Comprender el contenido de la memoria de una unión
- 13. Comprender el comando UNIX xargs
- 14. Intentando comprender el preprocesador C
- 15. Algoritmo para comprender el significado
- 16. Comprender el operador coalescente nula (??)
- 17. Comprender el método join() ejemplo
- 18. Comprender el ejemplo de simultaneidad de Clojure
- 19. Establecer el reloj de hardware en Python?
- 20. Obtener información de hardware en el servidor
- 21. Evitar advertencias en el contenedor de printf
- 22. Hardware Simulation
- 23. Comprender el diseño de std :: :: istream leer
- 24. Comprender el atributo de servidor runat
- 25. Comprender el alcance de flash en JSF2
- 26. Comprender el código fuente de jquery
- 27. Comprender el consumo de memoria en iPhone
- 28. Intentando comprender completamente el izado de JavaScript
- 29. Comprender el rendimiento de numpy memmap
- 30. Comprender NSRunLoop
+1, Gran respuesta. –
Después de tropezar con [respuesta de Hostile Fork] (http://stackoverflow.com/questions/2442966/cc-function-definitions-without-assembly/2444508#2444508) a [C/C++ definiciones de funciones sin ensamblaje] (http://stackoverflow.com/questions/2442966/cc-function-definitions-without-assembly/2444508), creo que es mejor que el mío. – jschmier