the programming modules make guide compile c kernel

c - programming - make modules kernel



¿En qué tipo de C está escrito un sistema operativo? (9)

¿Pero cuánto de eso, y qué tipo de C?

Algunas partes deben estar escritas en conjunto

Quiero decir, en C, si necesitaras algo de memoria, llamarías malloc. Pero, ¿tiene un sistema operativo un montón? Por lo que sé, malloc le pide memoria al sistema operativo y luego la agrega a una lista vinculada, un árbol binario o algo así.

Algunos sistemas operativos tienen un montón. En un nivel más bajo, son bloques de memoria que están diseñados como páginas. Su biblioteca de C luego particiona con su propio esquema de forma variable con malloc. Debe aprender sobre la memoria virtual, que es un esquema de memoria común en los sistemas operativos modernos.

Cuando desea abrir o crear un archivo en C, las funciones apropiadas le piden al sistema operativo ese archivo. así que ... ¿Qué tipo de C está al otro lado de esa llamada?

Llama a las rutinas de ensamblaje que consultan el hardware con instrucciones como IN y OUT. Con el acceso a la memoria sin formato, a veces tiene regiones de memoria dedicadas a la comunicación hacia y desde el hardware. Esto se llama DMA.

No estoy seguro de si voy a poder seguir el código, o de estar atrapado en una red de cosas ineludiblemente complejas que nunca había visto.

Sí lo harás. Deberías recoger un libro sobre hardware y sistemas operativos primero.

Tiene sentido que algo como un sistema operativo se escriba en C. Pero, ¿cuánto y qué tipo de C? Quiero decir, en C, si necesitaras algo de memoria, llamarías malloc. Pero, ¿tiene un sistema operativo un montón? Por lo que sé, malloc le pide memoria al sistema operativo y luego la agrega a una lista vinculada, un árbol binario o algo así. ¿Qué pasa con una pila de llamadas? El sistema operativo es responsable de configurar todas estas cosas que usan otras aplicaciones, pero ¿cómo hace eso? Cuando desea abrir o crear un archivo en C, las funciones apropiadas le piden al sistema operativo ese archivo. así que ... ¿Qué tipo de C está al otro lado de esa llamada? ¿O en el otro extremo de una asignación de memoria?

Además, ¿cuánto de un sistema operativo se escribiría realmente en C? ¿Todo ello? ¿Qué pasa con el código dependiente de la arquitectura? ¿Qué pasa con los niveles más altos de abstracción? ¿Alguna vez se escribe en lenguajes de nivel superior, como C ++?

Quiero decir, sólo estoy preguntando esto por pura curiosidad. Estoy descargando el último kernel de Linux ahora, pero está tardando una eternidad. No estoy seguro de si voy a poder seguir el código, o de estar atrapado en una red de cosas ineludiblemente complejas que nunca había visto.


¿Qué tipo de C?

Principalmente ANSI C, con mucho tiempo mirando el código de máquina que genera.

Pero, ¿tiene un sistema operativo un montón?

Malloc le pide al sistema operativo un puntero a alguna memoria que se le permita usar. Si un programa que se ejecuta en un sistema operativo (modo de usuario) intenta acceder a la memoria que no posee, se producirá un error de segmentación. Se permite que un sistema operativo acceda directamente a toda la memoria física del sistema, no se necesita malloc, no hay fallas de seguridad en ninguna dirección existente.

¿Qué pasa con una pila de llamadas?

La pila de llamadas a menudo funciona a nivel de hardware, con un registro de enlace.

Para acceder a los archivos, el sistema operativo necesita acceso a un controlador de disco, que debe saber cómo leer el sistema de archivos que está en el disco (hay muchos tipos diferentes). A veces el sistema operativo tiene uno incorporado, pero creo que es más común para empezar, el cargador de arranque le da uno y carga otro (más grande). El controlador de disco tiene acceso al hardware IO del disco físico, y se construye a partir de eso.


Quiero decir, en C, si necesitaras algo de memoria, llamarías malloc. Pero, ¿tiene un sistema operativo un montón? Por lo que sé, malloc le pide memoria al sistema operativo y luego la agrega a una lista vinculada, un árbol binario o algo así. ¿Qué pasa con una pila de llamadas?

Mucho de lo que dice en su pregunta en realidad lo hace la biblioteca de tiempo de ejecución en el espacio de usuario.

Todo lo que el sistema operativo debe hacer es cargar el programa en la memoria y saltar a su punto de entrada, la mayoría de los detalles pueden ser realizados por el programa espacial del usuario. Montón y pila son solo áreas de la memoria virtual de procesos. La pila es sólo un registro de puntero en la CPU.

La asignación de memoria física es algo que se hace en el nivel del sistema operativo. El sistema operativo generalmente asigna páginas de tamaño fijo, que luego se asignan a un proceso de espacio de usuario.


C es un lenguaje de muy bajo nivel, y puedes hacer muchas cosas directamente. Cualquiera de los métodos de la biblioteca de C (como malloc, printf, crlscr, etc.) debe implementarse primero, para invocarlos desde C (por ejemplo, echar un vistazo a los conceptos de libc). Voy a dar un ejemplo a continuación.

Veamos cómo se implementan los métodos de la biblioteca C bajo el capó. Vamos a ir con un ejemplo clrscr. Cuando implemente dichos métodos, accederá directamente a los dispositivos del sistema. Por ejemplo, para clrscr (borrar la pantalla) sabemos que la memoria de video reside en 0xB8000. Por lo tanto, para escribir en la pantalla o para borrarla, comenzamos asignando un puntero a esa ubicación.

En video.c

void clrscr() { unsigned char *vidmem = (unsigned char *)0xB8000; const long size = 80*25; long loop; for (loop=0; loop<size; loop++) { *vidmem++ = 0; *vidmem++ = 0xF; } }

Vamos a escribir nuestro mini kernel ahora. Esto borrará la pantalla cuando el control se transfiera a nuestro ''kernel'' desde el cargador de arranque. En main.c

void main() { clrscr(); for(;;); }

Para compilar nuestro ''kernel'', puede usar gcc para compilarlo en un formato de bin puro.

gcc -ffreestanding -c main.c -o main.o gcc -c video.c -o video.o ld -e _main -Ttext 0x1000 -o kernel.o main.o video.o ld -i -e _main -Ttext 0x1000 -o kernel.o main.o video.o objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin

Si notó los parámetros de ld anteriores, verá que estamos especificando la ubicación de carga predeterminada de su Kernel como 0x1000. Ahora, necesitas crear un cargador de arranque. Desde la lógica de su cargador de arranque, es posible que desee pasar el control a su Kernel, como

jump 08h:01000h

Normalmente escribes la lógica de tu cargador de arranque en Asm. Incluso antes de eso, es posible que deba echar un vistazo a cómo arranca una PC: haga clic aquí .

Mejor empezar con un sistema operativo más pequeño para explorar. Mira este tutorial de Roll Your Own OS

http://www.acm.uiuc.edu/sigops/roll_your_own/



Excelentes preguntas, todas. La respuesta es: poco o nada de la biblioteca estándar de C está disponible en el "dialecto" de C utilizado para escribir un sistema operativo. En el kernel de Linux, por ejemplo, las funciones de asignación de memoria estándar malloc, nmalloc, free, etc. se reemplazan con las funciones de asignación de memoria especial de kernel-internel kmalloc y kfree, con restricciones especiales en su uso. El sistema operativo debe proporcionar su propio "montón": en el kernel de Linux, las páginas de memoria física que se han asignado para el uso del kernel deben ser no paginables y, a menudo, físicamente contingentes. Vea este artículo de Linux en kmalloc y kfree . Del mismo modo, el kernel del sistema operativo mantiene su propia pila de llamadas especiales, cuyo uso requiere, desde la memoria, soporte especial del compilador GCC.

Además, ¿cuánto de un sistema operativo se escribiría realmente en C? ¿Todo ello?

Por lo que yo sé, los sistemas operativos están escritos de manera abrumadora en C. Algunas características específicas de la arquitectura están codificadas en ensamblador, pero generalmente muy poco para mejorar la portabilidad y el mantenimiento: el kernel de Linux tiene algún ensamblador, pero intenta minimizarlo tanto como posible.

¿Qué pasa con el código dependiente de la arquitectura? ¿Qué pasa con los niveles más altos de abstracción? ¿Alguna vez se escribe en lenguajes de nivel superior, como C ++?

Normalmente, el núcleo se escribirá en C pura, pero a veces los marcos de nivel superior y las API se escriben en un lenguaje de nivel superior. Por ejemplo, el framework / API Cocoa en MacOS está escrito en el Objetivo C, y las API de nivel superior de BeOS fueron escritas en C ++. Gran parte del marco .NET de Microsoft fue escrito en C #, con el "Common Language Runtime" escrito en una mezcla de C ++ y ensamblador. El conjunto de widgets QT más utilizado en Linux está escrito en C ++. Por supuesto, esto introduce preguntas filosóficas sobre lo que cuenta como "el sistema operativo".

El kernel de Linux definitivamente vale la pena mirar esto, aunque, hay que decirlo, es enorme e intimidante para que cualquiera lo lea desde cero.


Las funciones de gestión de memoria y malloc no son palabras clave en C. Estas son funciones de las bibliotecas del sistema operativo estándar. No sé el nombre de este estándar (es poco probable que sea el estándar POSIX, no he encontrado ninguna mención), pero existe: se utiliza malloc en aplicaciones C en la mayoría de las plataformas.

Si desea saber cómo funciona el kernel de Linux, le recomiendo este libro http://oreilly.com/catalog/9780596005658/ . Creo que es una buena explicación con algún código C insertado :).


No empezaría a leer el kernel de Linux, es demasiado complicado para empezar.

Osdev es un excelente lugar para comenzar a leer. He hecho un pequeño os con información de Osdev para una materia escolar. Se ejecuta en vmware, bochs y qemu, por lo que es fácil probarlo. Aquí está el código fuente .


Tradicionalmente, C es más necesario para el kernel y los controladores de dispositivos debido a la interacción con el hardware. Sin embargo, lenguajes como C ++ y Java podrían usarse para todo el sistema operativo

Para más información, he encontrado que el Diseño e Implementación de Sistemas Operativos por Andrew Tannenbaum es particularmente útil con MUCHOS ejemplos de código.