Question

Je veux apprendre la programmation du noyau Linux.

Quels seraient les points de départ pour cela ?Quels pourraient être les problèmes les plus simples à cibler ?

Était-ce utile?

La solution

Essayez de mettre la main sur le livre de Robert Love sur le noyau Linux Programmation. Son très concis et facile à suivre.

Après cela ou en même temps, vous pouvez jeter un oeil à « Comprendre le noyau Linux » .Mais je ne le recommanderais pas pendant les premières étapes.

De plus, regardez la guide de programmation noyau Linux . Comme beaucoup à apprendre des modules du noyau de programmation, ce guide vous aidera. Et oui, pour un grand nombre d'informations, consultez le sous-répertoire « documentation » des sources du noyau tarball.

Autres conseils

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

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

Livres recommandés pour le Non initialisé void *i

"Les hommes ne comprennent pas les livres avant d'avoir acquis une certaine quantité de vie, ou en tout cas, aucun homme ne comprend un livre profond avant d'avoir vu et vécu au moins une partie de son contenu".– Livre Ezra

Un voyage de mille code-miles doit commencer par un seul pas.Si vous ne savez pas par lequel commencer parmi les livres suivants, ne vous inquiétez pas, choisissez celui de votre choix.Tous ceux qui errent ne sont pas perdus.Comme toutes les routes se connectent finalement à l'autoroute, vous explorerez de nouvelles choses dans votre parcours noyau au fur et à mesure que les pages progressent sans rencontrer d'impasse, et finalement vous connecterez au code-set.Lisez avec un esprit alerte et rappelez-vous : Le code n'est pas de la littérature.

Ce qui reste n’est ni une chose, ni une émotion, ni une image, ni une représentation mentale, ni un souvenir, ni même une idée.C'est une fonction.Un processus en quelque sorte.Un aspect de la Vie qui pourrait être décrit comme fonction de quelque chose de « plus grand ».Et par conséquent, il semble qu'il ne soit pas vraiment "séparé" de quelque chose d'autre.Comme la fonction d'un couteau - couper quelque chose - n'est pas, en fait, séparé du couteau lui-même.La fonction peut être utilisée ou non pour le moment, mais elle n'est potentiellement jamais séparée.

Algorithme dérandomisé de Solovay Strassen pour le test de primalité:

Solovay Strassen Derandomized Algorithm for Primality Test

Lisez pour ne pas contredire et réfuter ;ni croire et tenir pour acquis ;ni trouver des paroles et des discours ;mais à peser et à considérer.Certains livres sont à déguster, d’autres à avaler, et quelques-uns à mâcher et digérer :c'est-à-dire que certains livres doivent être lus seulement en partie, d'autres doivent être lus, mais pas avec curiosité, et quelques-uns doivent être lus en entier, avec diligence et attention.

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();
        }
}

Linux de base ( 5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6 )

« La nature n’a ni noyau ni coquille ;elle est tout à la fois » - Johann Wolfgang von Goethe

Le lecteur doit bien connaître notions de système d'exploitation;une bonne compréhension des processus à exécution longue et de leurs différences avec les processus à courtes rafales d'exécution ;tolérance aux pannes tout en respectant des contraintes de temps réel douces et dures.En lisant, il est important de comprendre et n/ack les choix de conception faits par les sources du noyau Linux dans les sous-systèmes centraux.

Les fils de discussion [et] les signaux [sont] une traînée de misère, de désespoir, d'horreur et de folie dépendant de la plate-forme (~Anthony Baxte).Cela étant dit, vous devriez être un expert en C auto-évalué avant de plonger dans le noyau.Vous devez également avoir une bonne expérience avec les listes liées, les piles, les files d'attente, les arbres rouges et noirs, les fonctions de hachage, 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 beauté et l'art de la source du noyau Linux résident dans l'obscurcissement délibéré du code utilisé.Cela est souvent nécessaire pour transmettre la signification informatique impliquant deux ou plusieurs opérations de manière claire et élégante.Cela est particulièrement vrai lors de l’écriture de code pour une architecture multicœur.

Conférences vidéo sur les systèmes temps réel, Planification des tâches, Compression de la mémoire, Barrières de mémoire, SMP

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. Développement du noyau Linux - Robert Amour
  2. Comprendre le noyau Linux - Daniel P.Bovet, Marco Cesati
  3. L'art de la conception du noyau Linux - Yang Lixiang
  4. Architecture professionnelle du noyau Linux - Wolfgang Mauerer
  5. Conception du système d'exploitation UNIX - Maurice J.Bach
  6. Comprendre le gestionnaire de mémoire virtuelle Linux - Mel Gorman
  7. Composants internes du noyau Linux - Tigran Aïvazian
  8. Introduction à Linux embarqué - Christophe Hallinan

Pilotes de périphériques Linux ( 1 -> 2 -> 4 -> 3 -> 8 -> ... )

"La musique ne vous emporte pas.Vous devez le faire avancer strictement par votre capacité à vous concentrer uniquement sur ce petit noyau d'émotion ou d'histoire".- Debbie Harry

Votre tâche consiste essentiellement à établir une interface de communication à haut débit entre le périphérique matériel et le noyau logiciel.Vous devez lire la fiche technique/le manuel de référence du matériel pour comprendre le comportement de l'appareil, ses états de contrôle et de données ainsi que les canaux physiques fournis.La connaissance de l'assembly pour votre architecture particulière et une bonne connaissance des langages de description de matériel VLSI comme VHDL ou Verilog vous aideront à long terme.

Q:Mais pourquoi dois-je lire les spécifications matérielles ?

UN:Parce que « il existe un gouffre de carbone et de silicium que le logiciel ne peut pas combler » - Rahul Sonnad

Cependant, ce qui précède ne pose pas de problème pour Algorithmes informatiques (Code du conducteur - traitement de la moitié inférieure), car il peut être entièrement simulé sur un Machine de Turing universelle.Si le résultat calculé est vrai dans le domaine mathématique, c'est une certitude que c'est aussi vrai dans le domaine physique.

Conférences vidéo sur les pilotes de périphériques Linux (Lec.17 & 18), Anatomie d'un pilote KMS intégré, Contrôle des broches et mise à jour GPIO, Cadre d'horloge commun, Écrire un vrai pilote Linux - 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. Pilotes de périphériques Linux - Jonathan Corbet, Alessandro Rubini et Greg Kroah-Hartman
  2. Pilotes de périphériques Linux essentiels - Sreekrishnan Venkateswaran
  3. Écriture de pilotes de périphériques Linux - Jerry Cooperstein
  4. Le guide de programmation du module du noyau Linux - Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Guide du programmeur Linux PCMCIA - David Hinds
  6. Comment programmer Linux SCSI - Heiko Eibfeldt
  7. Guide de programmation série pour les systèmes d'exploitation POSIX - Michael R.Doux
  8. Pilotes graphiques Linux :une introduction - Stéphane Marchesin
  9. Guide de programmation pour les pilotes de périphériques USB Linux - Detlef Fliegl
  10. Le modèle de périphérique du noyau Linux - Patrick Mochel

Mise en réseau du noyau ( 1 -> 2 -> 3 -> ... )

« Appelez ça un clan, appelez ça un réseau, appelez ça une tribu, appelez ça une famille :Quoi que vous l'appelez, qui que vous soyez, vous en avez besoin. - Jane Howard

Comprendre la procédure pas à pas des paquets dans le noyau est une clé pour comprendre le réseau du noyau.Le comprendre est indispensable si nous voulons comprendre les composants internes de Netfilter ou IPSec, et plus encore.Les deux structures les plus importantes de la couche réseau du noyau Linux sont : struct sk_buff et struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Comprendre les composants internes du réseau Linux - Christian Benvenuti
  2. Mise en réseau du noyau Linux :Mise en œuvre et théorie - Rami Rosen
  3. Programmation réseau UNIX - W.Richard Stevens
  4. Le guide définitif de la programmation réseau Linux - Keir Davis, John W.Turner, Nathan Yocom
  5. La pile Linux TCP/IP :Mise en réseau pour les systèmes embarqués - Thomas F.Herbert
  6. Programmation de socket Linux par exemple - Warren W.Gays
  7. HOWTO avancé de routage et de contrôle du trafic Linux - Bert Hubert

Débogage du noyau ( 1 -> 4 -> 9 -> ... )

À moins qu’en communiquant avec lui, on ne dise exactement ce que l’on veut dire, des problèmes surviendront inévitablement.~Alan Turing, à propos des ordinateurs

Brian W.Kernighan, dans l'article Unix for Beginners (1979), a déclaré : « L'outil de débogage le plus efficace reste une réflexion approfondie, associée à des instructions d'impression judicieusement placées ».Savoir quoi collecter vous aidera à obtenir rapidement les bonnes données pour un diagnostic rapide.Le grand informaticien Edsger Dijkstra a dit un jour que les tests peuvent démontrer la présence de bugs mais pas leur absence.Les bonnes pratiques d'enquête doivent équilibrer la nécessité de résoudre les problèmes rapidement, la nécessité de développer vos compétences et l'utilisation efficace d'experts en la matière.

Il y a des moments où vous touchez le fond, rien ne semble fonctionner et vous manquez de toutes vos options.C'est alors que le véritable débogage commence.Un bug peut fournir la pause dont vous avez besoin pour vous désengager d’une fixation sur une solution inefficace.

Conférences vidéo sur le débogage et le profilage du noyau, Analyse du vidage de base, Débogage multicœur avec GDB, Contrôler les conditions de course multicœurs, Débogage de l'électronique

/* 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. Débogage Linux et réglage des performances - Steve Meilleur
  2. Techniques de débogage des applications Linux - Aurélien Melinte
  3. Débogage avec GDB :Le débogueur GNU au niveau source - Roland H.Pesch
  4. Débogage de Linux embarqué - Christophe Hallinan
  5. L'art du débogage avec GDB, DDD et Eclipse - Normand S.Matloff
  6. Pourquoi les programmes échouent :Un guide de débogage systématique - Andreas Zeller
  7. Exorcisme logiciel :Un manuel pour le débogage et l'optimisation du code existant - Bill Blunden
  8. Débogage :Trouver les problèmes logiciels et matériels les plus insaisissables - David J.Agans
  9. Débogage par la réflexion :Une approche multidisciplinaire - Robert-Charles Metzger
  10. Trouvez le bug :Un livre de programmes incorrects - Adam Barr

Systèmes de fichiers ( 1 -> 2 -> 6 -> ... )

"Je voulais avoir de la mémoire virtuelle, du moins car elle est couplée aux systèmes de fichiers".-Ken Thompson

Sur un système UNIX, tout est un fichier ;si quelque chose n'est pas un fichier, c'est un processus, à l'exception des canaux et sockets nommés.Dans un système de fichiers, un fichier est représenté par un inode, une sorte de numéro de série contenant des informations sur les données réelles qui composent le fichier.Le système de fichiers virtuel Linux VFS met en cache les informations en mémoire de chaque système de fichiers au fur et à mesure de son montage et de son utilisation.Il faut faire très attention à mettre à jour correctement le système de fichiers, car les données contenues dans ces caches sont modifiées à mesure que les fichiers et les répertoires sont créés, écrits et supprimés.Le plus important de ces caches est le cache tampon, qui est intégré à la manière dont les systèmes de fichiers individuels accèdent à leurs périphériques de stockage par blocs sous-jacents.

Conférences vidéo sur les systèmes de stockage, Système de fichiers compatible 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. Systèmes de fichiers Linux - Moshé Bar
  2. Systèmes de fichiers Linux - William Von Hagen
  3. Systèmes de fichiers UNIX :Évolution, conception et mise en œuvre - Steve D.Crâne
  4. Conception pratique du système de fichiers - Dominique Giampaolo
  5. Analyse médico-légale du système de fichiers - Brian Carrier
  6. Hiérarchie du système de fichiers Linux - Binh Nguyen
  7. BTRFS :Le système de fichiers Linux B-tree - Ohad Rodeh
  8. StegFS :Un système de fichiers stéganographique pour Linux - Andrew D.McDonald, Markus G.Kuhn

Sécurité ( 1 -> 2 -> 8 -> 4 -> 3 -> ... )

"UNIX n'a ​​pas été conçu pour empêcher ses utilisateurs de faire des choses stupides, car cela les empêcherait également de faire des choses intelligentes".— Doug Gwyn

Aucune technique ne fonctionne si elle n'est pas utilisée.L'éthique change avec la technologie.

"F × S = k" Le produit de la liberté et de la sécurité est une constante.- Les lois de Niven

La cryptographie constitue la base de la confiance en ligne.Le piratage consiste à exploiter les contrôles de sécurité sur le plan technique, physique ou humain.Protéger le noyau des autres programmes en cours d'exécution est une première étape vers un système sécurisé et stable, mais cela n'est évidemment pas suffisant :un certain degré de protection doit également exister entre les différentes applications des terres utilisées par les utilisateurs.Les exploits peuvent cibler des services locaux ou distants.

"Vous ne pouvez pas pirater votre destin, par la force brute... vous avez besoin d'une porte dérobée, d'un canal secondaire vers la Vie." -Clyde Dsouza

Les ordinateurs ne résolvent pas les problèmes, ils exécutent des solutions.Derrière chaque non déterministe code algorithmique, il existe un déterminé esprit. -- /var/log/dmesg

Conférences vidéo sur la cryptographie et la sécurité des réseaux, Espaces de noms pour la sécurité, Protection contre les attaques à distance, Linux embarqué sécurisé

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Le piratage:L'art de l'exploitation - Jon Erickson
  2. L'arsenal de rootkits :Évasion et évasion dans les recoins sombres du système - Bill Blunden
  3. Piratage exposé :Secrets de sécurité réseau - Stuart McClure, Joel Scambiray, George Kurtz
  4. Un guide pour l'exploitation du noyau :Attaquer le noyau - Enrico Perla, Massimiliano Oldani
  5. L’art de la médecine légale de la mémoire - Michael Hale Ligh, Andrew Case, Jamie Levy, AAron Walters
  6. Ingénierie inverse pratique - Bruce Dang, Alexandre Gazet, Elias Bachaalany
  7. Analyse pratique des logiciels malveillants - Michael Sikorski, Andrew Honig
  8. Sécurité Linux maximale :Guide du hacker pour protéger votre serveur Linux - Anonyme
  9. Sécurité Linux - Craig Hunt
  10. Sécurité Linux dans le monde réel - Bob Toxen

Source du noyau ( 0.11 -> 2.4 -> 2.6 -> 3.18 )

"Comme le vin, la maîtrise de la programmation du noyau mûrit avec le temps.Mais contrairement au vin, il devient plus sucré au cours du processus. »--Lawrence Mucheka

Vous ne pensez peut-être pas que les programmeurs sont des artistes, mais la programmation est un métier extrêmement créatif.C'est une créativité basée sur la logique.L’éducation en informatique ne peut pas faire de quelqu’un un programmeur expert, pas plus que l’étude des pinceaux et des pigments ne peut faire de quelqu’un un peintre expert.Comme vous le savez déjà, il y a une différence entre connaître le chemin et parcourir le chemin ;il est de la plus haute importance de retrousser vos manches et de vous salir les mains avec le code source du noyau.Enfin, avec votre noyau ainsi gagné connaissance, où que tu ailles, tu le feras briller.

Les codeurs immatures imitent ;les codeurs matures volent ;les mauvais codeurs dégradent ce qu’ils prennent, et les bons codeurs en font quelque chose de meilleur, ou du moins quelque chose de différent.Le bon codeur soude son vol en un ensemble de sentiments unique, tout différent de celui dont il a été arraché.

Conférences vidéo sur les recettes de noyaux

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. Débutant avec Source Linux 0.11 (moins de 20 000 lignes de code source).Après 20 ans de développement, comparé à Linux 0.11, Linux est devenu très énorme, complexe et difficile à apprendre.Mais le concept de conception et la structure principale ne subissent aucun changement fondamental.L'apprentissage de Linux 0.11 a toujours une signification pratique importante.
  2. Lecture obligatoire pour les hackers du noyau => Linux_source_dir/Documentation/*
  3. Vous devez être abonné et actif sur au moins une liste de diffusion du noyau.Commencer avec les débutants du noyau.
  4. Vous n'avez pas besoin de lire le code source complet.Une fois que vous êtes familiarisé avec les API du noyau et leur utilisation, commencez directement par le code source du sous-système qui vous intéresse.Vous pouvez également commencer par écrire vos propres modules plug-n-play pour expérimenter le noyau.
  5. Les rédacteurs de pilotes de périphériques bénéficieraient de leur propre matériel dédié.Commencer avec Tarte aux framboises.

Consultez Projet Linux noyau Janitor

  

« » Nous traversons le code source du noyau Linux, faire des revues de code, en fixant le code et faire d'autres unmaintained opérations de nettoyage et les conversions API. Il est un bon début pour le piratage du noyau. « »

Je dois dire: « apprendre C ». :)

Essayez ce livre gratuit en ligne.

Linux Kernel Module Guide de programmation http://www.linuxhq.com/guides/LKMPG/mpg.html

Vérifier kernelnewbies.org, abonnez-vous à la liste de diffusion Kernelnewbies, obtenu à irc.oftc.org #kernelnewbies

Certaines ressources:

  • Livre: Robert Love, Linux Kernel Development, 3ème édition
  • Livre: Corbet, Rubini, pilotes de périphériques Linux, 3ème édition (version gratuite ici )
  • Livre: Noyau Linux en quelques mots (version gratuite )
  • Matériel gratuit fourni par Free Electrons
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top