Cuando me acerco a una base de código grande, usualmente utilizo un enfoque combinado de subsistemas principales / inmersión profunda.
Paso 1: Entendiendo los principales subsistemas
La primera etapa en la comprensión de cualquier pieza de software es la comprensión de los subsistemas principales. Por lo general, puede consultar la jerarquía de directorios del código fuente como guía. Por ejemplo, aquí hay un navegador de código fuente para Linux:
http://lxr.free-electrons.com/
Así que podemos ver a partir de esto que hay algunos subsistemas, como drivers, crypto, kernel, mm, net, fs, ipc. La primera etapa es entender lo que hacen, por ejemplo, mm es la gestión de la memoria: la forma en que se asignan las páginas, cómo funciona el intercambio, etc. fs es sistemas de archivos, ipc: comunicaciones entre procesos.
- ¿Deberían los automóviles detenerse automáticamente si sus escáneres cerebrales notan que no está prestando suficiente atención a su conducción?
- Psicología: ¿Hasta qué punto es la capacidad de reaccionar bien ante los contratiempos genéticos? ¿En qué medida es ambiental?
- ¿Cómo es ser psicólogo?
- ¿Puede el acoso incluir el acoso?
- Cómo identificar un buen programador
Es posible que deba ir algunos niveles más profundo que solo el nivel superior. Por ejemplo, es posible que deba buscar en el núcleo para ver cuáles son las subpartes del núcleo.
De manera similar, si observa JDK, encontrará algunas piezas diferentes: debe comprender qué son esas piezas: el analizador, la máquina virtual, las bibliotecas centrales, la JNI, los controladores para cosas como gráficos, etc.
Paso 2: buceo profundo
Nota: Solo debe intentarse después de comprender los subsistemas principales.
Por lo general, cuando está leyendo el código fuente, es por una razón: desea realizar una modificación, por lo que desea comprender un componente en particular. Así que puedes rastrear el funcionamiento de ese componente en particular.
Alternativamente, si no tiene un componente en particular en mente, elija algunas actividades de ejemplo: por ejemplo, para el kernel de Linux, podría estar interesado en: ¿cómo iniciar un proceso?
Por lo tanto, buscaría dónde empezar, que es la llamada exec () en unistd.h (http://lxr.free-electrons.com/so…).
Aquí es donde se pone interesante: por el agujero del conejo, vaya. Ahí es cuando necesita comprender los sistemas de compilación, los archivos make, etc., para comprender cómo llegamos desde esa única llamada, hasta el cable metálico.
Un poco más de buceo te lleva a kernel / fork.c (http://lxr.free-electrons.com/so…). Un poco más de buceo te lleva al método do_fork (http://lxr.free-electrons.com/so…), que hace cosas como clonar el espacio de memoria, pasa los parámetros.
Luego entra en esta función, y comprende que se trata de un grupo de macros, y el siguiente método central es copy_process (http://lxr.free-electrons.com/so…). Repita hasta que llegue al metal desnudo, tocando fondo en los detalles de un chip en particular.
Tienes la idea Repita esto varias veces para otras tareas (¿qué sucede cuando se realiza una llamada de ipc? ¿Qué significa realmente abrir () y leer () un archivo? ¿Qué sucede cuando llamo a malloc ()?) Y comienza a obtener un sentir el sistema de compilación, los supuestos incorporados a las cosas, los estándares de codificación, los diseños, etc.
Estos dos pasos deberían al menos ayudarte a comenzar.