Pregunta

Quiero aprender a programar el Kernel de Linux.

¿Cuáles serían los puntos de partida para eso?¿Cuáles podrían ser algunos de los problemas más sencillos de abordar?

¿Fue útil?

Solución

Trate de hacerse con el libro de Robert Amor en Linux Kernel programación. Es muy concisa y fácil de seguir.

Después de eso, o junto con eso, es posible que desee echar un vistazo a "La comprensión del núcleo de Linux" .Pero yo no lo recomendaría durante las primeras etapas.

También, busque en la núcleo de Linux guía de programación . Dado que una gran cantidad se puede aprender de los módulos de programación del núcleo, que guía le ayudará. Y sí, para una gran cantidad de información, consulte la 'documentación' subdirectorio del archivo tar las fuentes del kernel.

Otros consejos

**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
         +addSection: Kernel Virtualization Engine

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

Libros recomendados para el No inicializado void *i

"Los hombres no entienden los libros hasta que tienen una cierta cantidad de vida, o en todo caso ningún hombre entiende un libro profundo, hasta que ha visto y vivido al menos parte de su contenido".–Ezra Libra

Un viaje de mil código-millas debe comenzar con un solo paso.Si no sabe con cuál de los siguientes libros empezar, no se preocupe, elija cualquiera de su elección.No todos aquellos que divagan están perdidos.Como todos los caminos finalmente se conectan con la autopista, explorará cosas nuevas en su recorrido por el kernel a medida que las páginas avancen sin encontrar callejones sin salida y, finalmente, se conectará con el code-set.Lee con la mente alerta y recuerda: El código no es literatura..

Lo que queda no es una cosa, ni una emoción, ni una imagen, ni un cuadro mental, ni un recuerdo, ni siquiera una idea.Es una función.Un proceso de algún tipo.Un aspecto de la Vida que podría describirse como función de algo "más grande".Y, por lo tanto, parece que no está realmente "separado" de esa otra cosa.Al igual que la función de un cuchillo, cortar algo, no está, de hecho, separada del cuchillo en sí.La función puede o no estar en uso en este momento, pero potencialmente nunca se separa.

Algoritmo desrandomizado de Solovay Strassen para la prueba de primalidad:

Solovay Strassen Derandomized Algorithm for Primality Test

Lea para no contradecir ni refutar;ni creer y dar por sentado;ni encontrar palabras y discursos;sino para sopesar y considerar.Algunos libros son para saborearlos, otros para tragarlos y algunos pocos para masticarlos y digerirlos:es decir, algunos libros deben leerse sólo en partes, otros deben leerse, pero no con curiosidad, y algunos pocos deben leerse en su totalidad, con diligencia y atención.

static void tasklet_hi_action(struct softirq_action *a)
{
        struct tasklet_struct *list;

        local_irq_disable();
        list = __this_cpu_read(tasklet_hi_vec.head);
        __this_cpu_write(tasklet_hi_vec.head, NULL);
        __this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
        local_irq_enable();

        while (list) {
                struct tasklet_struct *t = list;

                list = list->next;

                if (tasklet_trylock(t)) {
                        if (!atomic_read(&t->count)) {
                                if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                                                        &t->state))
                                        BUG();
                                t->func(t->data);
                                tasklet_unlock(t);
                                continue;
                        }
                        tasklet_unlock(t);
                }

                local_irq_disable();
                t->next = NULL;
                *__this_cpu_read(tasklet_hi_vec.tail) = t;
                __this_cpu_write(tasklet_hi_vec.tail, &(t->next));
                __raise_softirq_irqoff(HI_SOFTIRQ);
                local_irq_enable();
        }
}

Núcleo de Linux ( 5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6 )

“La naturaleza no tiene núcleo ni cáscara;ella lo es todo a la vez” –Johann Wolfgang von Goethe

El lector debe estar bien versado en conceptos del sistema operativo;una comprensión justa de los procesos de larga ejecución y sus diferencias con los procesos con períodos cortos de ejecución;Tolerancia a fallas y al mismo tiempo cumplir con restricciones de tiempo real suaves y duras.Mientras lee, es importante comprender y n/ack las elecciones de diseño realizadas por la fuente del kernel de Linux en los subsistemas centrales.

Los hilos [y] las señales [son] un rastro de miseria, desesperación, horror y locura que depende de la plataforma (~Anthony Baxte).Dicho esto, usted debe ser un experto en C autoevaluado antes de sumergirse en el núcleo.También debe tener una buena experiencia con listas vinculadas, pilas, colas, árboles rojos y negros, funciones hash, etc.

volatile int i;
int main(void)
{
    int c;
    for (i=0; i<3; i++) {
        c = i&&&i;
        printf("%d\n", c);    /* find c */
    }
    return 0;
}

La belleza y el arte de la fuente del kernel de Linux radica en la ofuscación deliberada del código que se utiliza.Esto suele ser necesario para transmitir el significado computacional que involucra dos o más operaciones de una manera limpia y elegante.Esto es especialmente cierto cuando se escribe código para arquitectura multinúcleo.

Videoconferencias en sistemas en tiempo real, Programación de tareas, Compresión de memoria, Barreras de la memoria, SMP

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. Desarrollo del núcleo de Linux - Roberto Amor
  2. Entendiendo el kernel de Linux - Daniel P.Bovet, Marco Cesati
  3. El arte del diseño del kernel de Linux - Yang Lixiang
  4. Arquitectura profesional del kernel de Linux - Wolfgang Mauerer
  5. Diseño del sistema operativo UNIX - Mauricio J.Llevar una vida de soltero
  6. Comprender el administrador de memoria virtual de Linux - Mel Gorman
  7. Componentes internos del kernel de Linux - Tigran Aivazian
  8. Introducción a Linux integrado - Christopher Hallinan

Controladores de dispositivos Linux ( 1 -> 2 -> 4 -> 3 -> 8 -> ... )

"La música no te lleva.Tienes que llevarlo adelante estrictamente por tu capacidad de concentrarte realmente en ese pequeño núcleo de emoción o historia".-Debbie Harry

Su tarea es básicamente establecer una interfaz de comunicación de alta velocidad entre el dispositivo de hardware y el núcleo del software.Debe leer la hoja de datos/manual de referencia del hardware para comprender el comportamiento del dispositivo y sus estados de control y datos y los canales físicos proporcionados.El conocimiento de ensamblador para su arquitectura particular y un buen conocimiento de los lenguajes de descripción de hardware VLSI como VHDL o Verilog lo ayudarán a largo plazo.

q:Pero ¿por qué tengo que leer las especificaciones del hardware?

A:Porque "hay un abismo de carbono y silicio que el software no puede salvar" - Rahul Sonnad

Sin embargo, lo anterior no supone ningún problema para Algoritmos computacionales (código de conductor - procesamiento de la mitad inferior), ya que se puede simular completamente en un Máquina universal de Turing.Si el resultado calculado es verdadero en el dominio matemático, es una certeza que también es cierto en el dominio fisico.

Videoconferencias en controladores de dispositivos Linux (Lec.17 y 18), Anatomía de un controlador KMS integrado, Control de PIN y actualización de GPIO, Marco de reloj común, Escriba un controlador de Linux real - Greg KH

static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
         struct phy_device *phydev = phy_dat;

         if (PHY_HALTED == phydev->state)
                 return IRQ_NONE;                /* It can't be ours.  */

         /* The MDIO bus is not allowed to be written in interrupt
          * context, so we need to disable the irq here.  A work
          * queue will write the PHY to disable and clear the
          * interrupt, and then reenable the irq line.
          */
         disable_irq_nosync(irq);
         atomic_inc(&phydev->irq_disable);

         queue_work(system_power_efficient_wq, &phydev->phy_queue);

         return IRQ_HANDLED;
}
  1. Controladores de dispositivos Linux - Jonathan Corbet, Alessandro Rubini y Greg Kroah-Hartman
  2. Controladores esenciales de dispositivos Linux - Sreekrishnan Venkateswaran
  3. Escribir controladores de dispositivos Linux - Jerry Cooperstein
  4. La guía de programación del módulo del kernel de Linux - Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Guía del programador PCMCIA de Linux - David Hinds
  6. Cómo programar SCSI en Linux - Heiko Eibfeldt
  7. Guía de programación serial para sistemas operativos POSIX - michael r.Dulce
  8. Controladores de gráficos de Linux:una introducción - Stéphane Marchesin
  9. Guía de programación para controladores de dispositivos USB de Linux - Detlef Fliegl
  10. El modelo de dispositivo del kernel de Linux - Patricio Mochel

Redes del núcleo ( 1 -> 2 -> 3 -> ... )

“Llámalo clan, llámalo red, llámalo tribu, llámalo familia:Como sea que lo llames, quienquiera que seas, necesite uno ". - Jane Howard

Comprender el recorrido de un paquete en el kernel es clave para comprender las redes del kernel.Comprenderlo es imprescindible si queremos comprender los aspectos internos de Netfilter o IPSec, y más.Las dos estructuras más importantes de la capa de red del kernel de Linux son: struct sk_buff y struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Comprender los aspectos internos de la red Linux - Christian Benvenuti
  2. Redes del kernel de Linux:Implementación y teoría - Rami Rosen
  3. Programación de red UNIX - w.Richard Stevens
  4. La guía definitiva para la programación de redes Linux - Keir Davis, John W.Turner, Nathan Yocom
  5. La pila TCP/IP de Linux:Redes para sistemas integrados - Tomás F.herbert
  6. Programación de sockets de Linux con ejemplo - Warren W.Homosexuales
  7. CÓMO Enrutamiento avanzado y control de tráfico de Linux - Bert Hubert

Depuración del núcleo ( 1 -> 4 -> 9 -> ... )

A menos que al comunicarse con él uno diga exactamente lo que quiere decir, es probable que surjan problemas.~Alan Turing, sobre computadoras

Brian W.Kernighan, en el artículo Unix para principiantes (1979), dijo: "La herramienta de depuración más eficaz sigue siendo una reflexión cuidadosa, junto con declaraciones impresas colocadas juiciosamente".Saber qué recopilar le ayudará a obtener los datos correctos rápidamente para un diagnóstico rápido.El gran científico informático Edsger Dijkstra dijo una vez que las pruebas pueden demostrar la presencia de errores pero no su ausencia.Las buenas prácticas de investigación deben equilibrar la necesidad de resolver problemas rápidamente, la necesidad de desarrollar habilidades y el uso eficaz de expertos en la materia.

Hay momentos en los que tocas fondo, nada parece funcionar y te quedas sin todas tus opciones.Es entonces cuando comienza la verdadera depuración.Un error puede brindarle el descanso que necesita para liberarse de su fijación en la solución ineficaz.

Videoconferencias sobre depuración y creación de perfiles del kernel, Análisis de volcado de núcleos, Depuración multinúcleo con GDB, Controlar las condiciones de carrera de múltiples núcleos, Electrónica de depuración

/* Buggy Code -- Stack frame problem
 * If you require information, do not free memory containing the information
 */
char *initialize() {
  char string[80];
  char* ptr = string;
  return ptr;
}

int main() {
  char *myval = initialize();
  do_something_with(myval);
}
/*  “When debugging, novices insert corrective code; experts remove defective code.”
 *     – Richard Pattis
#if DEBUG
 printk("The above can be considered as Development and Review in Industrial Practises");
#endif
 */
  1. Depuración de Linux y ajuste del rendimiento - Steve mejor
  2. Técnicas de depuración de aplicaciones Linux - Aureliano Melinte
  3. Depuración con GDB:El depurador a nivel de fuente GNU - roland h.Pesch
  4. Depuración de Linux integrado - Christopher Hallinan
  5. El arte de depurar con GDB, DDD y Eclipse - normando s.Matloff
  6. Por qué fallan los programas:Una guía para la depuración sistemática - Andreas Zeller
  7. Exorcismo de software:Un manual para depurar y optimizar el código heredado - Bill Blunden
  8. Depuración:Cómo encontrar los problemas de software y hardware más difíciles de alcanzar - David J.agans
  9. Depurar pensando:Un enfoque multidisciplinario - Robert Charles Metzger
  10. Encuentra el error:Un libro de programas incorrectos - Adam Barr

Sistemas de archivos ( 1 -> 2 -> 6 -> ... )

"Quería tener memoria virtual, al menos en lo que respecta a los sistemas de archivos".--Ken Thompson

En un sistema UNIX, todo es un archivo;si algo no es un archivo, es un proceso, excepto las canalizaciones y sockets con nombre.En un sistema de archivos, un archivo está representado por un inode, una especie de número de serie que contiene información sobre los datos reales que componen el archivo.El sistema de archivos virtual de Linux VFS almacena en caché información en la memoria de cada sistema de archivos a medida que se monta y utiliza.Se debe tener mucho cuidado para actualizar el sistema de archivos correctamente, ya que los datos dentro de estos cachés se modifican a medida que se crean, escriben y eliminan archivos y directorios.El más importante de estos cachés es el Buffer Cache, que está integrado en la forma en que los sistemas de archivos individuales acceden a sus dispositivos de almacenamiento en bloque subyacentes.

Videoconferencias en sistemas de almacenamiento, Sistema de archivos compatible con Flash

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
        struct open_flags op;
        int fd = build_open_flags(flags, mode, &op);
        struct filename *tmp;

        if (fd)
                return fd;

        tmp = getname(filename);
        if (IS_ERR(tmp))
                return PTR_ERR(tmp);

        fd = get_unused_fd_flags(flags);
        if (fd >= 0) {
                struct file *f = do_filp_open(dfd, tmp, &op);
                if (IS_ERR(f)) {
                        put_unused_fd(fd);
                        fd = PTR_ERR(f);
                } else {
                        fsnotify_open(f);
                        fd_install(fd, f);
                }
        }
        putname(tmp);
        return fd;
}

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
        if (force_o_largefile())
                flags |= O_LARGEFILE;

        return do_sys_open(AT_FDCWD, filename, flags, mode);
}
  1. Sistemas de archivos Linux - Bar Moshé
  2. Sistemas de archivos Linux - William Von Hagen
  3. Sistemas de archivos UNIX:Evolución, Diseño e Implementación - Steve D.Coronilla
  4. Diseño práctico de sistemas de archivos - Dominic Giampaolo
  5. Análisis forense del sistema de archivos - Brian Portador
  6. Jerarquía del sistema de archivos Linux - Binh Nguyen
  7. BTRFS:El sistema de archivos del árbol B de Linux - Ohad Rodeh
  8. StegFS:Un sistema de archivos esteganográfico para Linux - Andrés D.McDonald, Markus G.Kuhn

Seguridad ( 1 -> 2 -> 8 -> 4 -> 3 -> ... )

"UNIX no fue diseñado para impedir que sus usuarios hicieran estupideces, ya que eso también les impediría hacer cosas inteligentes".—Doug Gwyn

Ninguna técnica funciona si no se utiliza.La ética cambia con la tecnología.

"F × S = k"El producto de la libertad y la seguridad es una constante.- Leyes de Niven

La criptografía constituye la base de la confianza en línea.La piratería consiste en explotar los controles de seguridad, ya sea en un elemento técnico, físico o humano.Proteger el kernel de otros programas en ejecución es un primer paso hacia un sistema seguro y estable, pero obviamente esto no es suficiente:También debe existir cierto grado de protección entre diferentes aplicaciones en el terreno de los usuarios.Los exploits pueden apuntar a servicios locales o remotos.

"No puedes hackear tu destino, fuerza bruta... necesitas una puerta trasera, un canal lateral hacia la Vida". - Clyde Dsouza

Las computadoras no resuelven problemas, ejecutan soluciones.detrás de cada no determinista código algorítmico, hay un determinado mente. -- /var/log/dmesg

Videoconferencias sobre criptografía y seguridad de redes, Espacios de nombres para seguridad, Protección contra ataques remotos, Linux integrado seguro

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Hackear:El arte de la explotación - Jon Erickson
  2. El arsenal de rootkits:Escape y evasión en los rincones oscuros del sistema - Bill Blunden
  3. Hackeo expuesto:Secretos de seguridad de la red - Stuart McClure, Joel Scambray, George Kurtz
  4. Una guía para la explotación del kernel:Atacando el núcleo - Enrico Perla, Massimiliano Oldani
  5. El arte de la memoria forense - Michael Hale Ligh, Andrew Case, Jamie Levy, AAron Walters
  6. Ingeniería inversa práctica - Bruce Dang, Alexandre Gazet, Elías Bachaalany
  7. Análisis práctico de malware - Michael Sikorski, Andrew Honig
  8. Máxima seguridad de Linux:Una guía de piratas informáticos para proteger su servidor Linux - Anónimo
  9. Seguridad Linux - craig caza
  10. Seguridad de Linux en el mundo real - Bob Toxen

Fuente del núcleo ( 0.11 -> 2.4 -> 2.6 -> 3.18 )

"Al igual que el vino, el dominio de la programación del kernel madura con el tiempo.Pero, a diferencia del vino, se vuelve más dulce en el proceso".--Lawrence Mucheka

Quizás no creas que los programadores son artistas, pero la programación es una profesión extremadamente creativa.Es creatividad basada en la lógica.La educación en informática no puede convertir a nadie en un programador experto, como tampoco el estudio de los pinceles y los pigmentos puede convertir a alguien en un pintor experto.Como ya sabes, existe una diferencia entre conocer el camino y recorrerlo;Es de suma importancia arremangarse y ensuciarse las manos con el código fuente del kernel.Finalmente, con el núcleo así obtenido conocimiento, dondequiera que vayas, lo harás brillar.

Los codificadores inmaduros imitan;los codificadores maduros roban;Los malos codificadores desfiguran lo que toman, y los buenos codificadores lo convierten en algo mejor, o al menos en algo diferente.El buen codificador une su robo a un todo de sentimiento que es único, completamente diferente de aquel del que fue arrancado.

Videoconferencias sobre recetas de granos

linux-0.11
├── boot
│   ├── bootsect.s      head.s      setup.s
├── fs
│   ├── bitmap.c    block_dev.c buffer.c        char_dev.c  exec.c
│   ├── fcntl.c     file_dev.c  file_table.c    inode.c     ioctl.c
│   ├── namei.c     open.c      pipe.c          read_write.c
│   ├── stat.c      super.c     truncate.c
├── include
│   ├── a.out.h     const.h     ctype.h     errno.h     fcntl.h
│   ├── signal.h    stdarg.h    stddef.h    string.h    termios.h
│   ├── time.h      unistd.h    utime.h
│   ├── asm
│   │   ├── io.h    memory.h    segment.h   system.h
│   ├── linux
│   │   ├── config.h    fdreg.h fs.h    hdreg.h     head.h
│   │   ├── kernel.h    mm.h    sched.h sys.h       tty.h
│   ├── sys
│   │   ├── stat.h      times.h types.h utsname.h   wait.h
├── init
│   └── main.c
├── kernel
│   ├── asm.s       exit.c      fork.c      mktime.c    panic.c
│   ├── printk.c    sched.c     signal.c    sys.c       system_calls.s
│   ├── traps.c     vsprintf.c
│   ├── blk_drv
│   │   ├── blk.h   floppy.c    hd.c    ll_rw_blk.c     ramdisk.c
│   ├── chr_drv
│   │   ├── console.c   keyboard.S  rs_io.s
│   │   ├── serial.c    tty_io.c    tty_ioctl.c
│   ├── math
│   │   ├── math_emulate.c
├── lib
│   ├── close.c  ctype.c  dup.c     errno.c  execve.c  _exit.c
│   ├── malloc.c open.c   setsid.c  string.c wait.c    write.c
├── Makefile
├── mm
│   ├── memory.c page.s
└── tools
    └── build.c
  1. El comienzo del principiante con fuente de Linux 0.11 (menos de 20.000 líneas de código fuente).Después de 20 años de desarrollo, en comparación con Linux 0.11, Linux se ha vuelto enorme, complejo y difícil de aprender.Pero el concepto de diseño y la estructura principal no tienen cambios fundamentales.Aprender Linux 0.11 todavía tiene un significado práctico importante.
  2. Lectura obligatoria para hackers del kernel => Linux_source_dir/Documentation/*
  3. Debes estar suscrito y activo en al menos una lista de correo del kernel.Empezar con novatos del kernel.
  4. No es necesario leer el código fuente completo.Una vez que esté familiarizado con las API del kernel y su uso, comience directamente con el código fuente del subsistema que le interesa.También puede comenzar escribiendo sus propios módulos plug-n-play para experimentar con el kernel.
  5. Los escritores de controladores de dispositivos se beneficiarían al tener su propio hardware dedicado.Empezar con Frambuesa Pi.

El conserje del núcleo Linux Project

  

'' Vamos a través del código fuente del kernel de Linux, haciendo las revisiones de código, arreglar código sin mantenimiento y haciendo otras limpiezas y conversiones de API. Es un buen comienzo al núcleo piratería ''.

Yo tendría que decir: "aprender C". :)

Trate de este libro en línea gratis.

Programación Linux Kernel Módulo Guía http://www.linuxhq.com/guides/LKMPG/mpg.html

Comprobar kernelnewbies.org, suscribirse a la lista de correo Kernelnewbies, llegó a irc.oftc.org kernelnewbies

Algunos recursos:

  • libro: Robert amor, Linux Kernel Desarrollo, 3ª edición
  • libro: Corbet, Rubini, Linux Device Drivers, tercera edición (versión libre aquí )
  • libro: núcleo de Linux en pocas palabras (versión libre aquí )
  • Material gratuito proporcionado por Electrones libres
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top