Cómo aprender sobre el kernel de Linux

Gracias por A2A. Se recomienda que comprenda la arquitectura de alto nivel del Kernel de Linux y la pila de sitios de usuario (bibliotecas / marcos).

Es esencial que también conozca las características principales del kernel de Linux que incluye lo siguiente:

  • Linux paradigmas de diseño de kernel, objetivos y convenciones.
  • Diferentes contextos de ejecución dentro del kernel-espacio y sus limitaciones.
  • Varias características de propósito general dentro del kernel de Linux.
  • Funciones de gestión de memoria dentro del espacio del kernel.
  • Manejo de interrupciones y gestión de interrupciones de hardware.
  • Varios mecanismos de concurrencia y sincronización.
  • Técnicas de depuración / registro / instrumentación / diagnóstico / resolución de problemas.
  • Una visión general del modelo de dispositivo Linux.
  • Módulos de kernel cargables y funciones de kernel relacionadas.
  • Varias macros específicas del compilador utilizadas dentro de la programación del kernel de Linux (probable (), improbable (), __init, __exit, etc.).

Más allá de los conceptos enumerados anteriormente, es posible que le interese especializarse en subsistemas particulares en función de sus requisitos de desarrollo que pueden incluir los siguientes:

  • Controladores del sistema de archivos
  • Bloquee la capa de E / S y bloquee los controladores de dispositivos
  • Conductores de caracteres
  • Controladores de red, pila de red y varios otros componentes relacionados con la red
  • Controladores de plataforma / bus (PCI, USB, GPIO, SPI, etc.)
  • Funciones relacionadas con la virtualización (KVM, SR-IOV, etc.)

Si tiene la intención de trabajar en kernel-space (desarrollo de controladores y transferencia), no es necesario conocer todas las llamadas al sistema, pero tendrá que tener una visión general de cómo funcionan las llamadas al sistema y las convenciones de diseño de Linux para exponer las API del kernel frente a las ABI. a la tierra de usuario.

También sería útil contar con un buen entendimiento sobre la pila de usuarios en tierra (el conocimiento de proyectos como busybox puede ser útil). Además, algunos conocimientos sobre los cargadores de arranque (u-boot, por ejemplo) y proyectos como buildroot, yocto project ayudarán a construir distribuciones de linux incrustadas mantenibles.

Espero que esta información ayude. Feliz hacking en Linux 🙂

Como usted lo pregunta, me aproximo a esta respuesta desde el punto de vista del interrogador, tal como lo entiendo: alguien con experiencia en el código de nivel de sistema operativo en otros sistemas operativos (o RTOS):

  • Nivel BSP: realmente necesitará entender la arquitectura e implementación del mismo nivel BSP en el sistema operativo Linux. Esto se aplicaría normalmente al trabajo BSP en todos los subsistemas relevantes del kernel de Linux: VM, VFS, red (ok, quizás no tanto). Como ejemplo, las funciones de enlace para el manejo de la memoria virtual / MMU, el almacenamiento en caché de la CPU, la manipulación de TLB, etc. deben ser completadas por el desarrollador del sistema operativo para la plataforma de destino. Otro sistema de archivos, por ejemplo, debe ser portado primero para adaptarse al estándar VFS de Linux.
  • Bootloader- U-Boot es probablemente tu mejor opción; hay mucha documentación sobre cómo portar una plataforma a U-Boot; pl google para la coincidencia más cercana a su plataforma
  • Obviamente, necesitarías un conocimiento profundo del hardware y el firmware de la plataforma de destino para poder llevarle Linux.
  • Tal vez un buen ejemplo (porque tiene una gran cantidad de recursos y una comunidad capacitada detrás de él) es el traslado de Linux a la plataforma Raspberry-Pi. Aquí hay un punto de partida: RPi Hub – eLinux.org

El problema que presentas es un poco conflictivo.

Parte uno:

el problema es portar Lo primero que debe ser portado a otras arquitecturas es el compilador GCC.

No es algo simple de hacer.

Esto lo hacen con mayor frecuencia las personas más familiarizadas con la arquitectura Y con la generación de código y la optimización realizada por gcc. Gcc es un programa grande, con muchas arquitecturas ya soportadas. Esperemos que tengas suerte si tu arquitectura ya es una de ellas. Si es así, compruebe si esa arquitectura ya es compatible con Linux. Linux soporta muchas (no todas) las arquitecturas soportadas por gcc. Incluyo “no todos” porque algunos microcontroladores no tienen suficiente memoria u otras instalaciones (como una MMU) necesarias para soportar Linux. Algunos de estos a veces son compatibles con uClinux ™ – Proyecto de microcontrolador de Linux incorporado – Página de inicio.

La siguiente parte trata sobre “principalmente interesado en el kernel y algunas utilidades básicas” y puede ser más simple.

Portar el kernel tampoco es necesariamente fácil de hacer a menos que ya lo hayas hecho una o dos veces. Hay muchos ejemplos disponibles. Existe el problema de la cantidad de controladores necesarios. El primero y más básico es un dispositivo de entrada / salida. El más simple es una línea serie. También necesita un cargador de arranque. Una vez superados esos dos, obtiene controladores de almacenamiento, controladores de red (según el caso de uso), su interfaz de dispositivo personalizada (otro controlador). Familiarizarse con el núcleo es lo que.

KernelJanitors – Linux Kernel Newbies

Almacenamiento a largo plazo para Google Code Project Hosting. (también kerneljanitors)

son para. Pero estos están orientados a comenzar con el desarrollo general del kernel y no con Linux incorporado.

Para las utilidades incrustadas, hay varias cosas diferentes en las que pensar. Muchas de las “utilidades básicas” se combinan / fusionan con el proyecto BusyBox. Esto simplifica las cosas, ya que es una utilidad única que puede servir como sustituto del proceso init, el shell y muchas herramientas comunes. Los editores son externos. Las herramientas del sistema de archivos suelen ser proyectos externos por su cuenta.

Primero, esto es comenzar desde el principio y el mejor libro para aprender es el “Desarrollo del Kernel de Linux” por Robert Love. Solo recuerde que esto se basa en la versión 2.6 de Linux, y hay pocos cambios en 3.0 y 4.0.

La siguiente fuente de información útil es la Guía de programación del módulo del kernel de Linux.

Una vez que te gradúes de estos libros y pruebes algunos trucos en línea. Comience a buscar cambios exactos relacionados con funciones y archivos específicos.

Una buena fuente de información es LinuxChanges – Linux Kernel Newbies

Si desea saber cuáles son los cambios en los códigos entre las versiones de Linux Kernel, vaya a The Linux Kernel Archives y haga clic en “ver diferencias” y luego desplácese y busque su archivo y vea los cambios en el código.

Feliz Linuxing !!

  • Instala alguna distribución de Linux en tu sistema. Ya sea arranque dual, o solo una instalación de Linux. CentOS, SuSE son algunas buenas opciones.
  • Descarga la última fuente de kernel.
  • Comience a leer sobre el kernel de Linux desde Linux Kernel Development por Robert Love.
  • El directorio de documentación dentro de la fuente del kernel de Linux es una fuente de conocimiento * Vast *. Está escrito directamente por los desarrolladores.
  • Compilar el kernel con soporte de módulo insertable.
  • Escribir módulos sencillos del kernel. Jugar. Experimentar.

Mantenga el aprendizaje en marcha para comprender mejor todos los subsistemas.

No hay necesidad de aprender el kernel de Linux, a menos que tenga la intención de ayudar en su desarrollo.

Si desea usar Linux, necesita aprender las herramientas de línea de comandos de las distribuciones comunes.

Si desea escribir programas para Linux, debe comenzar por aprender la programación Unix / POSIX. De esa manera, podrá escribir programas que no solo se ejecutan en Linux, sino también en otros Unixes.

Si desea ser un administrador de sistemas Linux / Unix, necesitará aprender algunas cosas sobre el kernel, pero tendrá una gran cantidad de administración de sistemas Unix genérica que deberá conocer primero.

Entonces … ¿qué es lo que estás tratando de hacer? Averigua eso, luego pregúntalo.

Creo que también necesitas entender el código subyacente. Por favor, consulte mi respuesta: la respuesta de Ganesh Phatangare a ¿Cómo aprendo a usar Linux? ¿Dónde empiezo? ¿Son todas las distros Linus iguales? Si no, ¿cuál debería usar?

Lea la documentación, lea las listas de correo, lea el código fuente. ¡No hay otra manera de evitarlo!

Las respuestas ya proporcionadas son más de lo que puedo aportar. Buena suerte.