2010-07-15 8 views
6

He querido escribir un kernel desde hace algún tiempo. Ya tengo un conocimiento suficiente de C y he incursionado en el ensamblador x86. Verá, he querido escribir un kernel que sea compatible con POSIX en C, de modo que las aplicaciones * NIX puedan potencialmente transferirse a mi sistema operativo, pero no he encontrado muchos recursos en las funciones estándar del kernel POSIX. Encontré recursos en la estructura del sistema de archivos, variables de entorno y más en the Open Group's POSIX page.Escribiendo un kernel compatible con POSIX

Desafortunadamente, no he encontrado nada que explique qué llamadas y funciones del kernel debe tener un kernel compatible con POSIX (en otras palabras, qué tipo de estructura interna debe tener un kernel para cumplir con POSIX). Si alguien puede encontrar esa información, por favor dígame.

Respuesta

11

POSIX no define la estructura interna del kernel, la interfaz kernel-to-userspace, o incluso libc, en absoluto. De hecho, incluso Windows tiene un subsistema compatible con POSIX. Solo asegúrese de que las interfaces POSIX definidas en su enlace funcionen de alguna manera. Sin embargo, tenga en cuenta que POSIX no requiere que se implemente nada específicamente en el kernel; puede implementar cosas en la biblioteca C utilizando interfaces de kernel más simples de su propio diseño, si es posible, si lo prefiere.

Ocurre que muchos de los sistemas operativos compatibles con POSIX (BSD, Linux, etc.) tienen una relación bastante estrecha entre muchas de esas llamadas y la capa kernel, pero hay excepciones. Por ejemplo, en Linux, una llamada write() es un syscall directo, que invoca una función sys_write() en el kernel. Sin embargo, en Windows, write() se implementa en una DLL de soporte POSIX, que traduce el descriptor de archivo a un manejador NT y llama al NtWriteFile() para repararlo, que a su vez invoca una llamada al sistema correspondiente en ntoskrnl.exe. Así que tienes mucha libertad en cómo hacer las cosas, lo que hace que las cosas sean más difíciles, si acaso :)

4

El opengroup.org deja las decisiones sobre las llamadas del kernel a cada implementación.
write(), por ejemplo tiene que verse y comportarse como se indica, pero lo que se llama debajo no está definido. Muchas llamadas como write, read, lseek son libres de llamar al punto de entrada que quieran dentro del kernel.

Así que, no, realmente no hay nada que diga que debe tener un nombre de función determinado con un conjunto definido de semántica disponible en el kernel. Simplemente tiene que estar disponible en la biblioteca C runtime.

+0

OK, ahora entiendo. Espero poder escribir el kernel POSIX correctamente. Gracias por aclarar eso! –