2009-05-27 11 views
45

Je souhaite apprendre la programmation du noyau Linux.Programmation du noyau d'apprentissage

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

merci d'avance

+0

Étape 1: le faire fonctionner sur une machine virtuelle: https://github.com/cirosantilli/runlinux –

+0

Cela aide aussi http://linuxseekernel.blogspot.in/2015/08/linux-kernel-module -programming.html – Jeyaram

Répondre

26

Essayez de mettre la main sur le livre de Robert Love sur le noyau Linux Programmation. C'est très concis et facile à suivre. Après cela ou avec cela, vous pouvez jeter un oeil à "Comprendre le noyau Linux" .Mais je ne le recommanderais pas au cours des premières étapes. En outre, regardez le Linux kernel programming guide. Puisque beaucoup de choses peuvent être apprises à partir des modules du noyau de programmation, ce guide vous aidera. Et oui, pour beaucoup d'informations, consultez le sous-répertoire 'documentation' de l'archive tar des sources du noyau.

8

Découvrez The Linux Kernel Janitor Project

'' 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. C'est un bon début pour le piratage du noyau. ''

+1

+1 lien impressionnant –

+1

Pour ceux qui souhaitent en savoir plus sur le projet Linux Kitorel Janitor, j'ai rédigé ma thèse de master analysant leur travail. Ce rapport est maintenant publié sous forme de livre, ISBN 978-3-639-20637-1. http://www.bookfinder.com/search/?isbn=3639206371&submit=Begin+search&mode=isbn&st=sr&ac=qr – hlovdal

1

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

1

Quelques ressources:

  • Livre: Robert Amour, Linux Kernel développement, 3ème édition
  • Livre: Corbet, Rubini, pilotes de périphériques Linux, 3e édition (version gratuite here)
  • B ook: noyau Linux en quelques mots (version gratuite here)
  • matériel gratuit fourni par Free Electrons
55
**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é pour les initialisées void *i

« Les hommes ne comprendre les livres jusqu'à ce qu'ils aient une certaine quantité de vie, ou en tout cas, aucun homme ne comprend un livre profond, jusqu'à comme vu et vécu au moins une partie de son contenu ". -Ezra Pound

Un voyage de mille le code-miles doit commencer par une seule étape. Si vous êtes dans la confusion sur lequel des livres suivants pour commencer, 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 voyage du noyau que les pages progressent sans rencontrer d'impasses, et finalement se connecter au code-set. Lisez avec un esprit alerte et rappelez-vous: Le code n'est pas la littérature. Ce qui reste n'est ni une chose, ni une émotion, ni une image, ni une image mentale, ni un souvenir, ni même une idée. C'est une fonction. Un processus de quelque sorte. Un aspect de la vie qui pourrait être décrit comme une fonction de quelque chose de «plus grand». Et par conséquent, il semble que ce n'est pas vraiment "séparé" de ce 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 ou ne peut pas être utilisée pour l'instant, mais elle n'est potentiellement JAMAIS séparée.

Solovay Strassen Derandomized Algorithm for Primality Test:

Solovay Strassen Derandomized Algorithm for Primality Test

Lire ne pas contredire et réfuter; ni croire et prendre pour acquis; ni pour trouver la conversation et le discours; mais peser et considérer. Certains livres doivent être goûtés, d'autres doivent être avalés, et quelques-uns à mâcher et à digérer, c'est-à-dire que certains livres ne doivent être lus qu'en partie, d'autres à lire, mais pas curieusement, et quelques-uns à lire entièrement. , et 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(); 
     } 
} 

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

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

lecteur doit être bien familiarisés avec operating system concepts; une bonne compréhension des processus de longue durée et de ses différences avec les processus avec de courtes périodes d'exécution; la tolérance aux pannes tout en répondant aux contraintes de temps réel, douces et dures. Pendant la lecture, il est important de comprendre et de choisir les choix de conception faits par la source du noyau Linux dans les sous-systèmes principaux. Threads [et] les signaux [sont] une traînée dépendant de la plateforme de la misère, du désespoir, de l'horreur et de la folie (~ Anthony Baxte). Cela étant dit, vous devriez être un expert C auto-évaluateur, avant de plonger dans le noyau. Vous devriez également avoir une bonne expérience avec les listes liées, les piles, les files d'attente, les arbres noirs de noir, les fonctions de hachage, et al. La beauté et l'art de la source Linux Kernel réside dans l'obscurcissement délibéré du code utilisé le long de. Ceci est souvent nécessaire pour transmettre la signification computationnelle impliquant deux ou plusieurs opérations d'une manière propre et élégante. Cela est particulièrement vrai lors de l'écriture de code pour l'architecture multicœur.

Video Lectures on Real-Time Systems, Task Scheduling, Memory Compression, Memory Barriers, SMP

#ifdef __compiler_offsetof 
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER) 
#else 
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 
#endif 
  1. Linux Kernel Development - Robert Amour
  2. Understanding the Linux Kernel-Daniel P. Bovet, Marco Cesati
  3. The Art of Linux KerneL Design-Yang Lixiang
  4. Professional Linux Kernel Architecture-Wolfgang Mauerer
  5. Design of the UNIX Operating System-Maurice J.Bach
  6. Understanding the Linux Virtual Memory Manager-Mel Gorman
  7. Linux Kernel Internals-Tigran Aivazian
  8. Embedded Linux Primer-Christopher Hallinan

Linux Device Drivers (1 -> 2 -> 4 -> 3 -> 8 -> ...)

"La musique ne vous accompagne pas. Vous devez porter le long strictement par votre capacité à vraiment se concentrer uniquement sur ce petit petit noyau d'émotion ou une histoire. » - Debbie Harry

Votre tâche consiste essentiellement à établir une interface de communication à grande vitesse entre le matériel périphérique et le noyau logiciel Vous devriez lire la fiche de données de matériel/manuel pour comprendre le comportement de l'appareil et ses états de contrôle et de données et les canaux physiques fournis.Connaissance de l'Assemblée pour votre architecture particulière et une bonne connaissance de VLSI Description du matériel VHDL ou Verilog vous aidera à long terme

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

A: Parce que, « Il y a un gouffre de carbone et de silicium le logiciel ne peut pas combler » - Rahul Sonnad

Cependant, ne pas ci-dessus pose un problème pour les algorithmes de calcul (Driver code - bottom-half processing), car il peut être entièrement simulé sur un Universal Turing Machine. Si le résultat calculé est vrai dans le mathematical domain, il est certain qu'il est également vrai dans le physical domain.

Video Lectures on Linux Device Drivers (Lec.17 & 18), Anatomy of an Embedded KMS Driver, Pin Control and GPIO Update, Common Clock Framework, Write a Real Linux Driver - 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. Linux Device Drivers - Jonathan Corbet, Alessandro Rubini, et Greg Kroah-Hartman
  2. Essential Linux Device Drivers - Sreekrishnan Venkateswaran
  3. Writing Linux Device Drivers - Jerry Cooperstein
  4. The Linux Kernel Module Programming Guide-Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Linux PCMCIA Programmer's Guide - David Hinds
  6. Linux SCSI Programming Howto - Heiko Eibfeldt
  7. Serial Programming Guide for POSIX Operating Systems-Michael R. Doux
  8. Linux Graphics Drivers: an Introduction - Stéphane Marchesi
  9. Programming Guide for Linux USB Device Drivers-Detlef Fliegl
  10. The Linux Kernel Device Model
  11. - Patrick Mochel

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

« appelez un clan, appelez un réseau, appelez une tribu, appelez une fa Mily: Tout ce que vous appelez, qui que vous soyez, vous en avez besoin « - Jane Howard

Comprendre un paquet de passage dans le noyau est une clé pour comprendre la mise en réseau du noyau.. Comprendre c'est un must si nous voulons comprendre les internes 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. Understanding Linux Network Internals - Christian Benvenuti
  2. Linux Kernel Networking: Implementation and Theory-Rami Rosen
  3. UNIX Network Programming-W. Richard Stevens
  4. The Definitive Guide to Linux Network Programming-Keir Davis, John W. Turner, Nathan Yocom
  5. The Linux TCP/IP Stack: Networking for Embedded Systems-Thomas F. Herbert
  6. Linux Socket Programming by Example-Warren W.Gay
  7. Linux Advanced Routing & Traffic Control HOWTO-Bert Hubert

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

Sauf en communiquant avec elle on dit exactement ce qu'on veut dire, il y a forcément des problèmes. ~ Alan Turing, sur les ordinateurs

Brian W. Kernighan, dans le journal Unix pour les débutants (1979) a dit: « L'outil de débogage la plus efficace est la pensée toujours prudent, couplé avec des instructions d'impression judicieusement placés ». Savoir quoi collecter vous aidera à obtenir les bonnes données rapidement pour un diagnostic rapide. Le grand informaticien Edsger Dijkstra a dit un jour que les tests pouvaient démontrer la présence de bugs mais pas leur absence. De bonnes pratiques d'enquête devraient équilibrer le besoin de résoudre rapidement les problèmes, le besoin de développer vos compétences et l'utilisation efficace des experts en la matière.

Il ya des moments où vous frappez le fond, rien ne semble fonctionner et vous n'avez plus aucune option. C'est alors que le vrai débogage commence. Un bug peut fournir la pause dont vous avez besoin de se désengager d'une fixation sur la solution inefficace.

Video Lectures on Kernel Debug and Profiling, Core Dump Analysis, Multicore Debugging with GDB, Controlling Multi-Core Race Conditions, Debugging Electronics

/* 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. Linux Debugging and Performance Tuning - Steve Meilleur
  2. Linux Applications Debugging Techniques-Aurelian Melinte
  3. Debugging with GDB: The GNU Source-Level Debugger-Roland H. Pesch
  4. Debugging Embedded Linux-Christopher Hallinan
  5. The Art of Debugging with GDB, DDD, and Eclipse-Norman S. Matloff
  6. Why Programs Fail: A Guide to Systematic Debugging-Andreas Zeller
  7. Software Exorcism: A Handbook for Debugging and Optimizing Legacy Code-Bill Blunden
  8. Debugging: Finding most Elusive Software and Hardware Problems-David J. Agans
  9. Debugging by Thinking: A Multidisciplinary Approach-Robert Charles Metzger
  10. Find the Bug: A Book of Incorrect Programs-Adam Barr

systèmes de fichiers (1 -> 2 -> 6 -> ...

"Je voulais avoir de la mémoire virtuelle, au moins car elle est couplée à des 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, sauf pour les pipes et sockets nommés. Dans un système de fichiers, un fichier est représenté par un inode, un type de numéro de série contenant des informations sur les données réelles qui composent le fichier. Le système de fichiers virtuels Linux VFS met en cache les informations en mémoire de chaque système de fichiers lorsqu'il est monté et utilisé. Un grand soin doit être pris pour mettre à jour le système de fichiers correctement car les données dans ces caches sont modifiées au fur et à mesure que les fichiers et répertoires sont créés, écrits et supprimés. Le plus important de ces caches est le cache de mémoire tampon, qui est intégré dans la manière dont les systèmes de fichiers individuels accèdent à leurs périphériques de stockage de blocs sous-jacents.

Video Lectures on Storage Systems, Flash Friendly File System

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. Linux File Systems - Moshe Bar
  2. Linux Filesystems-William Von Hagen
  3. UNIX Filesystems: Evolution, Design, and Implementation-Steve D. Pate
  4. Practical File System Design-Dominic Giampaolo
  5. File System Forensic Analysis-Brian Transporteur
  6. Linux Filesystem Hierarchy - Binh Nguyen
  7. BTRFS: The Linux B-tree Filesystem-Ohad Rodeh
  8. StegFS: A Steganographic File System for Linux-Andrew D. McDonald, Markus G. Kuhn

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

« UNIX n'a ​​pas été conçu pour arrêter ses utilisateurs de faire des choses stupides, car cela les empêcherait 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 exploite les contrôles de sécurité dans un élément technique, physique ou humain. Protéger le noyau des autres programmes en cours d'exécution est un premier pas vers un système sécurisé et stable, mais ce n'est évidemment pas suffisant: un certain degré de protection doit également exister entre les différentes applications utilisateur. Les exploits peuvent cibler des services locaux ou distants.

« Vous ne pouvez pas pirater votre destin, la force brute ... vous avez besoin d'une porte arrière, un canal latéral dans la vie. » - Clyde Dsouza

Les ordinateurs ne résolvent pas les problèmes, ils exécuter des solutions Derrière chaque non-deterministic le code algorithmique, il y a un esprit determined -../var/log/dmesg

Video Lectures on Cryptography and Network Security, Namespaces for Security, Protection Against Remote Attacks, Secure Embedded Linux

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock" 
  1. Hacking: The Art of Exploitation - Jon Erickson
  2. The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System - Bill Blunden
  3. Hacking Exposed: Network Security Secrets-Stuart McClure, Joel Scambray, George Kurtz
  4. A Guide to Kernel Exploitation: Attacking the Core-Perla Enrico, Massimiliano Oldani
  5. The Art of Memory Forensics-Michael Hale Lig, affaire Andrew, Jamie Levy, AAron Walters
  6. Practical Reverse Engineering-Bruce Dang, Alexandre Gazet, Elias Bachaalany
  7. Practical Malware Analysis-Michael Sikorski, Andrew Honig
  8. Maximum Linux Security: A Hacker's Guide to Protecting Your Linux Server-Anonyme
  9. Linux Security-Craig Hunt
  10. Real World Linux Security - Bob Toxen

noyau Source (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 doux dans le processus ». --Lawrence Mucheka

Vous ne pourriez pas penser que les programmeurs sont des artistes, mais la programmation est une profession extrêmement créatif. Il est la créativité basée sur la logique. L'enseignement des sciences de l'ordinateur ne peut pas Faire de quelqu'un un programmeur expert, pas plus que d'étudier les pinceaux et les pigments peuvent 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 marcher sur le chemin, il est primordial de retrousser ses manches. mains sales avec le code source du noyau Enfin, avec votre noyau ainsi gagné connaissance, partout où vous allez, vous allez briller.

Les codeurs immatures imitent; les codeurs matures volent; les mauvais codeurs défigurent ce qu'ils prennent, et les bons codeurs en font quelque chose de mieux, ou du moins quelque chose de différent. Le bon codeur soude son vol dans un sentiment unique, tout à fait différent de celui dont il était déchiré.

Video Lectures on Kernel Recipes

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. le début du débutant avec Linux 0.11 source (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 n'ont pas de changements fondamentaux. Apprendre Linux 0.11 a encore une signification pratique importante.
  2. Lecture obligatoire pour les pirates du noyau =>Linux_source_dir/Documentation/*
  3. Vous devez être inscrit et actif sur au moins une liste de diffusion du noyau. Commencez par kernel newbies.
  4. Vous n'avez pas besoin de lire le code source complet. Une fois que vous êtes familiarisé avec les API du noyau et son 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 avec le noyau.
  5. Les développeurs de pilotes de périphériques bénéficieraient de leur propre matériel dédié. Commencez par Raspberry Pi.
+3

Bon pour voir une réponse dépendante durable, complète et non liée à une question comme celle-ci. +1 –

+4

J'espère être assez artistique pour comprendre la beauté de cette réponse un jour! – Hamzahfrq

+0

@manav m-n: Pouvez-vous dire pourquoi vous publiez le test de primalité de Solovay-Strassen dans votre réponse. Je pense que vous voulez exprimer quelque chose, mais je n'ai pas compris. – user565739

Questions connexes