Frage

Ich will Linux-Kernel-Programmierung erlernen.

Was wäre die Ausgangspunkte für das sein? Was einige der einfacheren Probleme sein könnte zielen?

War es hilfreich?

Lösung

Versuchen Sie halten Robert Love Buch über Linux Kernel-Programmierung zu erhalten. Es ist sehr übersichtlich und leicht zu folgen.

Danach oder zusammen mit, dass, können Sie einen Blick nehmen wollen „um die Linux-Kernel verstehen“ .Aber ich würde es während der frühen Stadien nicht empfehlen.

Auch sehen Sie die Linux-Kernel-Programmführer . Da viele aus programing Kernel-Module erlernt werden, wird dieser Leitfaden Ihnen helfen. Und ja, für viele Informationen finden Sie in der ‚Dokumentation‘ Unterverzeichnis des Kernel-Quellen Tarball.

Andere Tipps

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

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.
  

Buchempfehlungen für die Uninitialized void *i

     

„Männer verstehen nicht, Bücher, bis sie eine bestimmte Menge an Leben, oder jedenfalls versteht kein Mensch ein tiefes Buch, bis er und lebte zumindest einen Teil seines Inhalts gesehen hat“. -Ezra Pfund

Eine Reise von tausend Code-Meilen muss mit dem ersten Schritt beginnen. Wenn Sie in Verwirrung darüber, welche der folgenden Bücher sind mit zu beginnen, keine Sorge, holt jeden Ihrer Wahl. Nicht alle, die wandern, sind verloren. Als schließlich alle Straßen zur Autobahn verbinden , werden Sie neue Dinge in Ihrem Kernel Reise erkunden, wie die Seiten ohne die Erfüllung aller Sackgassen Fortschritte, und schließlich zum code-set verbinden. Lesen Sie mit den wachen Geist und denken Sie daran:. -Code ist nicht Literatur

Was bleibt, ist kein Ding oder ein Gefühl oder ein Bild oder ein mentales Bild oder ein Speicher oder sogar eine Idee. Es ist eine Funktion. Verfahren irgendeine Art. Ein Aspekt des Lebens, die in Abhängigkeit von etwas „größeren“ beschrieben werden könnte. Und deshalb scheint es, dass es nicht wirklich „trennen“ aus, dass etwas sonst. Wie die Funktion eines Messers - Schneiden etwas - ist in der Tat nicht, separate von dem Messer selbst. Die Funktion kann oder kann zur Zeit nicht in Gebrauch sein, aber es wird möglicherweise nie trennen.

Solovay Strassen derandomisiert Algorithmus für den Primzahltest :

Solovay Strassen derandomisiert Algorithmus für Primality Test

Lesen Sie nicht zu widersprechen und widerlegen; noch zu glauben, und für selbstverständlich; noch Rede und Diskurs zu finden; aber zu wiegen und zu berücksichtigen. Einige Bücher sind zu schmecken, andere geschluckt werden, und einige wenige gekaut und verdaut werden: das heißt, einige Bücher nur in Teilen zu lesen sind, andere zu lesen, aber nicht neugierig, und einige wenige ganz zu lesenden und mit Sorgfalt und Aufmerksamkeit.

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

  

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

     

„Die Natur hat weder Kern noch Schale; sie ist alles auf einmal“- Johann Wolfgang von Goethe

Reader auch mit Betriebssystemkonzepte versiert werden sollte; ein gutes Verständnis für lange laufende Prozesse und ihre Differenzen mit Prozessen mit kurzen Ausbrüchen der Ausführung; Fehlertoleranz während weichen und harten Echtzeitdruck zu treffen. Beim Lesen ist es wichtig, die Design-Entscheidungen durch die Linux-Kernel-Quellen in dem Kern Subsysteme zu verstehen und n/ack.

Threads [und] Signale [ist] eine plattformabhängige Spur von Elend, Verzweiflung, Schrecken und Wahnsinn (~ Anthony Baxte). Dass gesagt wird, sollen Sie einen Selbst Auswertung C-Experte sein, vor dem Tauchen in den Kernel. Sie sollten auch eine gute Erfahrung mit verketteten Listen, Stacks, Queues, Rot Schwarze Bäume, Hash-Funktionen, et al.

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

Die Schönheit und die Kunst des Source-Linux-Kernel liegt in der absichtlichen Code-Verschleierung verwendet entlang. Dies ist oft notwendig als die rechnerische Bedeutung, die zwei oder mehr Operationen in einem sauberen und eleganten Art und Weise zu vermitteln. Dies gilt insbesondere, wenn der Code für Multi-Core-Architektur zu schreiben.

Video Lectures auf Real-Time Systems , < a href = "https://www.youtube.com/watch?v=tp8n3ezVfkI" rel = "noreferrer"> Task Scheduling , Memory Compression , Speicherbarrieren 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 Entwicklung - Robert Liebe
  2. Verständnis der Linux Kernel - Daniel P. Bovet, Marco Cesati
  3. Die Kunst des Linux-Kernels Entwurf - Yang Lixiang
  4. Professionelle Linux Kernel Architektur - Wolfgang Mauerer
  5. Entwurf des UNIX-Betriebssystem - < em> Maurice J. Bach
  6. den Virtual Memory Manager Linux verstehen - Mel Gorman
  7. Linux Kernel Internals - Tigran Aivazian
  8. Embedded Linux Primer - Christopher Hallinan

  

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

     

„Musik ist nicht mitreißen. Sie haben es streng durch Ihre Fähigkeit zu tragen zusammen, um wirklich nur auf dem kleinen kleinen Kern von Emotion oder eine Geschichte zu konzentrieren“. - Debbie Harry

Ihre Aufgabe ist es im Grunde eine High-Speed-Kommunikationsschnittstelle zwischen dem Hardware-Gerät und dem Software-Kernel zu etablieren. Sie sollten die Hardware-Referenz Datenblatt / Handbuch lesen, das Verhalten der Vorrichtung zu verstehen, und es ist Steuerungs- und Datenzustände und zur Verfügung gestellt physikalischen Kanäle. Die Kenntnis der Versammlung für die jeweilige Architektur und ein faires Wissen von VLSI Hardwarebeschreibungssprachen wie VHDL oder Verilog werden Sie auf lange Sicht helfen.

F : Aber warum muss ich die Hardware-Spezifikationen lesen

A : Weil: "Es gibt eine Kluft von Kohlenstoff und Silizium kann die Software nicht überbrücken" - Rahul Sonnad

Allerdings ist die oben stellt kein Problem für Computational Algorithmen ( Treiber Code - untere Hälfte Verarbeitung ), da sie vollständig auf einem Universal-Turing-Maschine . Wenn das berechnete Ergebnis in der mathematische Domain , dann ist es eine Gewissheit, dass es ist auch in der physikalischen Domäne wahr.

Video Lectures auf Linux Device Drivers (Lec. 17 & 18), Anatomie eines Embedded KMS-Treiber, Pin-Steuerung und GPIO-Update , Gemeinsamer Clock Rahmen , schreibt Echt 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, und Greg Kroah-Hartman
  2. wichtiger Linux Device Drivers - Sreekrishnan Venkateswaran
  3. Writing Linux Device Drivers - Jerry Cooperstein
  4. Der Linux-Kernel Module Programming Guide - Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Linux PCMCIA-Programmierhandbuch - David Hinds
  6. Linux SCSI Programming Howto - Heiko Eibfeldt
  7. Serielle Programmierhandbuch für POSIX Betriebssysteme - Michael R. Süß
  8. Linux-Grafiktreiber: eine Einführung - Stéphane Marchesin
  9. Programmierhandbuch für Linux USB-Gerät Treiber - Detlef Fliegl
  10. Das Linux-Kernel-Device-Modell - Patrick Mochel

  

Kernel Networking (1 -> 2 -> 3 -> ...)

     

„Nennen Sie es ein Clan, nennen es ein Netzwerk, nennen es einen Stamm, nennen es eine Familie: Was auch immer Sie es nennen, wer auch immer du bist, du brauchen.“ - Jane Howard

ein Paket Freilos in der Kernel zu verstehen, ist ein wichtige Kernel-Networking zu verstehen. Das Verständnis ist es ein Muss, wenn wir Netfilter oder IPSec-Interna verstehen wollen, und vieles mehr. Die beiden wichtigsten Strukturen der Linux-Kernel-Netzwerkschicht sind: struct sk_buff und struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Verständnis Linux Netzwerk Internals - Christian Benvenuti
  2. Linux Kernel Networking: Implementierung und Theorie - 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. Der Linux-TCP / IP-Stack: Networking für Embedded Systems - Thomas F. Herbert
  6. Linux Socket-Programmierung von Beispiel - Warren W. Homosexuell
  7. Linux Advanced Routing & Traffic ControlHOWTO - Bert Hubert

  

Kernel-Fehlersuche (1 -> 4 -> 9 -> ...)

     

Es sei denn, mit ihm in Verbindung steht man sagt genau das, was man meint, werden Schwierigkeiten führen gebunden. ~ Alan Turing, über Computer

Brian W. Kernighan, in dem Papier Unix für Anfänger (1979) sagte: „Das effektivste Debugging-Tool ist noch sorgfältige Überlegung, gepaart mit Bedacht platziert print-Anweisungen“. Zu wissen, was zu sammeln helfen, die richtigen Daten schnell für eine schnelle Diagnose zu erhalten. Der große Informatiker Edsger Dijkstra sagte einmal, dass die Prüfung der Anwesenheit von Fehlern nachweisen kann, nicht aber ihre Abwesenheit. Gute Untersuchung Praktiken sollten die Notwendigkeit balancieren, um Probleme schnell zu lösen, wodurch die Notwendigkeit, Ihre Fähigkeiten zu bauen, und die effektive Nutzung von Fachexperten.

Es gibt Zeiten, wenn Sie Tiefstpreisen getroffen, nichts scheint zu funktionieren und Sie laufen aus alle Optionen. Seine dann, dass die eigentliche Fehlersuche beginnt. Ein Fehler kann den Bruch Sie von einer Fixierung auf der ineffektiven Lösung lösen müssen.

Video Lectures auf Kernel Debug und Profilierungs , < a href = "https://www.youtube.com/watch?v=CR569T-B2M0" rel = "noreferrer"> Core-Dump-Analyse , Multicore-Debugging mit 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 und Performance Tuning - Steve Beste
  2. Linux-Anwendungen Debugging-Techniken - Aurelian Melinte
  3. Debugging mit GDB: Der GNU Source-Level-Debugger - Roland H. Pesch
  4. Debuggen von Embedded Linux - Christopher Hallinan
  5. The Art of Debugging mit GDB, DDD, und Eclipse - Norman S. Matloff
  6. Warum Programme Fail: Ein Leitfaden für Systematische Debuggen - Andreas Zeller
  7. Software Exorzismus: Ein Handbuch zum Debuggen und Optimieren von Legacy-Code - Bill Blunden
  8. Debugging: Die Suche nach den meisten Elusive Software- und Hardwareproblemen - David J. Agans
  9. Debuggen von Denken: Ein multidisziplinärer Ansatz - Robert Charles Metzger
  10. den Bug finden: Ein Buch Falscher Programme - Adam Barr

  

Dateisysteme (1 -> 2 -> 6 -> ...)

     

„Ich wollte die virtuellen Speicher haben, zumindest, wie es mit Dateisystemen gekoppelt ist“. - Ken Thompson

Auf einem UNIX-System ist alles eine Datei; wenn etwas nicht eine Datei ist, ist es ein Prozess, except für Named Pipes und Sockets. In einem Dateisystem wird eine Datei durch eine inode, eine Art Seriennummer enthält Informationen über die aktuellen Daten dargestellt, die die Datei bilden. Das Linux Virtual File System VFS Caches von jeder Dateisysteminformation im Speicher, wie es angebracht ist und verwendet wird. Viel Sorgfalt muss das Dateisystem genommen werden, aktualisieren korrekt als Daten innerhalb dieser Caches als Dateien modifiziert und Verzeichnisse erstellt, geschrieben und gelöscht werden. Die wichtigsten dieser Caches ist der Puffer-Cache, der in die Art und Weise integriert ist, dass die einzelnen Dateisysteme ihre zugrunde liegenden Blockspeichergeräte zugreifen.

Video Lectures auf Speichersysteme , Flash-freundliches 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-Dateisysteme - Moshe Bar
  2. Linux Dateisysteme - William Von Hagen
  3. UNIX-Dateisysteme: Evolution, Design, und Die Umsetzung - Steve D. Pate
  4. Practical Dateisystemdesign - Dominic Giampaolo
  5. File System Forensic Analysis - Brian Carrier
  6. Linux Filesystem Hierarchy - Binh Nguyen
  7. BTRFS: Der Linux-B-Baum Filesystem - Ohad Rodeh
  8. StegFS: Ein Steganographie-Dateisystem für Linux - Andrew D. McDonald Markus G. Kuhn

  

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

     

„UNIX war nicht seinen Anwender von dummen Dinge zu tun zu stoppen, so dass auch sie daran kluge Dinge aufhören würde“. - Doug Gwyn

     

Keine Technik funktioniert, wenn es nicht verwendet wird. Ethik ändern mit der Technik.

     

" F × S = k " das Produkt der Freiheit und Sicherheit ist eine Konstante. - Niven Gesetze

Cryptography bildet die Grundlage des Vertrauens online. Hacking nutzt Sicherheitskontrollen entweder in einer technischen, physikalischen oder einer Mensch-Komponente. den Kernel von anderen laufenden Programmen zu schützen, ist ein erster Schritt zu einem sicheren und stabilen System, aber das ist offensichtlich nicht genug: ein gewisses Maß an Schutz zwischen verschiedenen Benutzer-Land-Anwendungen als auch vorhanden sein. Exploits können lokal oder remote Dienste abzielen.

  

„Du kannst nicht dein Schicksal, Brute-Force-Hack ... benötigen Sie eine Hintertür, einen Seitenkanal ins Leben.“            - Clyde Dsouza

     

Computer nicht lösen Probleme, führen sie Lösungen. Hinter jedem nicht-deterministisch algorithmischen Code aus, gibt es eine bestimmt Geist.            - / var / log / dmesg

Video Lectures auf Kryptographie und Netzwerksicherheit , Namespaces für Sicherheit , Schutz vor Fern Angriffe , Sichere Embedded Linux

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Hacking: Die Kunst der Ausbeutung - Jon Erickson
  2. Das Rootkit Arsenal: Escape and Evasion in den dunklen Ecken des Systems - Bill Blunden
  3. Hacking Exposed: Network Security Secrets - Stuart McClure, Joel Scambray, George Kurtz
  4. A Guide to Kernel Exploitation: Angreifen der Core - Enrico Perla, Massimiliano Oldani
  5. The Art of Memory Forensics - Michael Hale Ligh, Andrew Fall, Jamie Levy, AAron Walters
  6. Praktische Reverse Engineering - Bruce dang, Alexandre Gazet, Elias Bachaalany
  7. Practical Malware Analysis - Michael Sikorski, Andrew Hönig
  8. Maximum Linux Security: A Guide Hacker Ihr Linux Server Schutz - < em> Anonym
  9. Linux Security - Craig Jagd
  10. Real World Linux Security - Bob Toxen

  

Kernel Quelle (0.11 -> 2.4 -> 2.6 -> 3.18)

     

„Wie Wein, die Beherrschung der Kernel-Programmierung mit der Zeit reift. Aber im Gegensatz zu Wein, wird es süßer im Prozess“. --Lawrence Mucheka

Sie können nicht glauben, dass Programmierer sind Künstler, aber Programmierung ist ein äußerst kreativer Beruf. Es ist logikbasierte Kreativität. Informatik-Ausbildung kann nicht jemand einen Experten Programmierer macht mehr als Pinsel und Pigment studieren kann jemand einen Experten Maler machen. Wie Sie bereits wissen, gibt es einen Unterschied zwischen den Weg zu kennen und den Weg zu Fuß; es ist von größter Bedeutung, die Ärmel hochzukrempeln und sich die Hände schmutzig mit Kernel-Quellcode erhalten. Schließlich mit dem so gewonnenen kernel Wissen , wohin Sie gehen, werden Sie leuchten .

Unreife Coder imitieren; reife Coder stehlen; schlechte Programmierer verunstalten, was sie nehmen und eine gute Programmierer machen es zu etwas besser, oder zumindest etwas anderes. Die guten Coder schweißen seinen Diebstahl in eine ganz Gefühl, das einzigartig ist, völlig verschieden von den, aus dem es zerrissen wurde.

Video Lectures auf Kernel Rezepte

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. Anfänger Start mit Linux 0.11 Quelle (weniger als 20.000 Zeilen Quellcode). Nach 20 Jahren der Entwicklung, im Vergleich zu Linux 0.11 ist Linux sehr groß, komplex und schwer zu erlernen. Aber auch das Design-Konzept und Hauptstruktur haben keine grundlegenden cHang. Linux Learning 0.11 noch wichtige praktische Bedeutung hat.
  2. Pflichtlektüre für Kernel-Hacker => Linux_source_dir/Documentation/*
  3. Sie sollten abonniert und aktiv sein auf at-dest eine Kernel-Mailingliste. Beginnen Sie mit Kernel Newbies .
  4. Sie brauchen nicht den vollständigen Quellcode zu lesen. Sobald Sie vertraut mit dem Kernel-API und seiner Verwendung sind, direkt mit dem Quellcode des Subsystems starten Sie interessiert sind. Sie kann auch mit dem Schreiben Sie Ihre eigene Plug-n-Play-Module mit dem Kernel zu experimentieren beginnen können.
  5. Device Driver Autoren profitieren würden durch ihre eigene dedizierte Hardware mit. Beginnen Sie mit Raspberry Pi .

Schauen Sie sich Der Linux-Kernel Janitor Projekt

  

‚‘ Wir gehen durch den Linux-Kernel-Quellcode, Code-Reviews zu tun, nicht betreut Code Festsetzung und tun andere Bereinigungen und API Konvertierungen. Es ist ein guter Start in den Kernel-Hacking. ''

Ich würde sagen: „lernen C“. :)

Versuchen Sie, dieses kostenlose Online-Buch.

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

Überprüfen Sie kernelnewbies.org, abonnieren Sie die Kernelnewbies Mailing-Liste, bekam zu irc.oftc.org #kernelnewbies

Einige Quellen an:

  • Buch: Robert Love, Linux Kernel Entwicklung, 3. Auflage
  • Buch: Corbet, Rubini, Linux Device Drivers, 3. Auflage (kostenlose Version hier )
  • Buch: Linux-Kernel in einer Nussschale (kostenlose Version hier )
  • Free Material zur Verfügung gestellt von Freie Elektronen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top