Domanda

Voglio imparare lLinux la programmazione del Kernel.

Quali sarebbero i punti di partenza per che?Quali possono essere alcuni dei più semplici problemi al bersaglio?

È stato utile?

Soluzione

Prova a entrare in possesso del libro di Robert Love su Linux Kernel di programmazione. La sua molto conciso e facile da seguire.

Dopo di che o insieme a questo, si consiglia di dare un'occhiata a "Capire il kernel di Linux" .Ma io non lo consiglio durante le prime fasi.

Inoltre, guardare il kernel Linux guida di programmazione . Dal momento che un sacco si può imparare da moduli del kernel di programmazione, che guida vi aiuterà. E sì, per un sacco di informazioni, consultare il 'documentazione' sotto-directory di sorgenti del kernel tarball.

Altri suggerimenti

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

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

Libri consigliati per la Non inizializzata void *i

"Gli uomini non capiscono libri fino a quando non hanno una certa quantità di vita, o comunque nessuno capisce una profonda libro, fino a che non ha visto e vissuto almeno una parte del suo contenuto".–Ezra Pound

Un viaggio di mille codice miglia deve cominciare con un solo passo.Se siete in confusione su quale dei seguenti libri per iniziare, non ti preoccupare, scegliere uno qualsiasi di vostra scelta.Non tutti quelli che vagano sono persi.Come tutte le strade, infine, collegare autostrada, si scopriranno nuove cose nel kernel viaggio come pagine di progresso, senza incontrare alcuna finisce morto, e, infine, collegare il code-set.Leggere con mente attenta e ricordate: Il codice non è Letteratura.

Che cosa è di sinistra non è una cosa o di un'emozione, di un'immagine o un'immagine mentale o un ricordo o anche un'idea.Si tratta di una funzione.Un processo di qualche tipo.Un aspetto della Vita che potrebbe essere descritto come una funzione di qualcosa di più "grande".E risulta, quindi, che non è davvero "separato" da qualcosa che altro.Come la funzione di un coltello, tagliando qualcosa - non è, di fatto, separato dalla lama stessa.La funzione può o non può essere in uso al momento, ma è potenzialmente MAI separare.

Solovay-Strassen Derandomized Algoritmo per il Test di Primalità:

Solovay Strassen Derandomized Algorithm for Primality Test

Leggere non per contraddire e confutare;né per credere e dare per scontato;né per cercare di conversazione e del discorso;ma per pesare e valutare.Alcuni libri devono essere assaggiati, altri inghiottiti, pochi per essere masticato e digerito:che è, alcuni libri sono da leggere solo in parte, ad altri di essere letto, ma non in modo curioso, e un po ' pochi per essere letto per intero, e con diligenza e attenzione.

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

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

“La natura non ha né kernel né shell;lei è tutto in una volta” -- Johann Wolfgang von Goethe

Lettore dovrebbe essere ben versati con sistema operativo concetti;una buona comprensione di lunghi processi in esecuzione e le sue differenze con i processi con brevi raffiche di esecuzione;la tolleranza di errore durante l'incontro di soft e hard limiti di tempo reale.Durante la lettura, è importante capire e n/ack le scelte di design fatte dal codice del kernel di linux nel nucleo sottosistemi.

Thread [e] segnali [sono] un dipendente dalla piattaforma sentiero di miseria, di disperazione, di orrore e di follia (~Anthony Baxte).Detto questo, si dovrebbe essere un auto-valutazione C esperto, prima di immergersi nel kernel.Si dovrebbe anche avere una buona esperienza con i Collegati Liste, Pile, Code, Rosso Neri Alberi, Funzioni Hash, 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;
}

La bellezza e l'arte dei sorgenti del Kernel Linux, si trova nella deliberata codice offuscamento usato.Questo è spesso necessario per trasmettere al computazionale significato che coinvolge due o più operazioni in un ambiente pulito ed elegante.Questo è particolarmente vero quando si scrive codice per l'architettura multi-core.

Video Lezioni su Sistemi Real-Time, La Programmazione Delle Attività Di, Memoria Di Compressione, Le Barriere Di 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. Sviluppo Del Kernel Di Linux - Robert Amore
  2. La comprensione del Kernel di Linux - Daniel P.Bovet, Marco Cesati
  3. L'Arte del KerneL Linux Design - Yang Lixiang
  4. Professionale Di Architettura Del Kernel Linux - Wolfgang Mauerer
  5. Il Design del Sistema Operativo UNIX - Maurice J.Bach
  6. Comprensione Linux Virtual Memory Manager - Mel Gorman
  7. Linux Kernel Internals - Tigran Aivazian
  8. Linux Embedded Primer - Christopher Hallinan

Linux Driver Di Periferica ( 1 -> 2 -> 4 -> 3 -> 8 -> ... )

"La musica non porterà lungo.Avete da portare lungo strettamente dalla vostra capacità di davvero concentrarsi solo su quel piccolo piccolo kernel di emozione o di una storia".-- Debbie Harry

Il vostro compito è quello di stabilire una comunicazione ad alta velocità di interfaccia tra il dispositivo hardware e il software del kernel.Si consiglia di leggere l'hardware di riferimento scheda tecnica/manuale per comprendere il comportamento del dispositivo e di controllo e stati di dati e forniti canali fisici.Conoscenza di Assemblea per la sua particolare architettura e discreta conoscenza della VLSI per la Descrizione dell'Hardware Lingue come il VHDL o Verilog vi aiuterà nel lungo periodo.

Q:Ma perché devo leggere le specifiche hardware?

Un:Perché "C'è un abisso di carbonio e di silicio, il software non riesce a ponte" - Rahul Sonnad

Tuttavia, non rappresenta un problema per Algoritmi Di Calcolo (Codice del Driver - parte inferiore di elaborazione), come può essere completamente simulato su un Macchina Di Turing Universale.Se calcolato risultato vero matematica dominio, è una certezza che è vero anche nell' dominio fisico.

Video Lezioni su Linux i Driver di Periferica (Lec.17 e 18), Anatomia di un Embedded KM Driver, Pin di Controllo e GPIO Aggiornamento, Comune Di Clock Quadro, Scrivi un Vero e proprio Driver 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. Linux Driver Di Periferica - Jonathan Corbet, Alessandro Rubini, e Greg Kroah-Hartman
  2. Essenziale Linux Driver Di Periferica - Sreekrishnan Venkateswaran
  3. La Scrittura Di Linux Driver Di Periferica - Jerry Cooperstein
  4. Il Modulo Del Kernel Di Linux Programming Guide - Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Linux PCMCIA Guida del Programmatore - David Hinds
  6. Linux SCSI Programming Howto - Heiko Eibfeldt
  7. Seriale Guida per la Programmazione Sistemi Operativi POSIX - Michael R.Dolce
  8. Driver Grafici Per Linux:un'Introduzione - Stéphane Marchesin
  9. Guida alla programmazione in Linux i Driver di Periferica USB - Detlef Fliegl
  10. Il Kernel Di Linux Modello Del Dispositivo - Patrick Mochel

Il Kernel Di Rete ( 1 -> 2 -> 3 -> ... )

“Chiamare un clan, chiamare una rete, chiamata di una tribù, di chiamare una famiglia:Qualunque cosa tu lo chiami, chi sei, hai bisogno di uno.” - Jane Howard

La comprensione di un pacchetto di walk-through nel kernel è una chiave per la comprensione del kernel di rete.La comprensione è un must se si vuole capire Netfilter o IPSec interni, e di più.Le due strutture più importanti del kernel di linux a livello di rete sono: struct sk_buff e struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. La Comprensione Di Rete Linux Interni - Christian Benvenuti
  2. Kernel Linux Networking:Attuazione e Teoria - Rami Rosen
  3. Programmazione di Rete UNIX - W.Richard Stevens
  4. La Guida Definitiva per Linux Programmazione di Rete - Keir Davis, John W.Turner, Nathan Yocom
  5. Linux Stack TCP/IP:Di rete per Sistemi Embedded - Thomas F.Herbert
  6. Linux Presa di Programmazione da Esempio - Warren W.Gay
  7. Linux Avanzate di Routing e di Controllo del Traffico HOWTO - Bert Hubert

Il Debug Del Kernel ( 1 -> 4 -> 9 -> ... )

A meno che non in grado di comunicare con esso uno dice esattamente quello che uno vuole dire, problema è legato al risultato.~Alan Turing, sui computer

Brian W.Kernighan, in carta Unix per Principianti (1979) ha detto, "Il più efficace strumento di debug è ancora un'attenta riflessione, accoppiato con cautela stampa piazzata dichiarazioni".Sapendo che raccolgono vi aiuterà a ottenere il diritto rapidamente i dati per una diagnosi veloce.Il grande scienziato informatico Edsger Dijkstra ha detto una volta che il test può dimostrare la presenza di alcuni bug, ma non la loro assenza.Buona investigazione pratiche dovrebbe bilanciare la necessità di risolvere rapidamente i problemi, la necessità di costruire le vostre abilità, e l'uso efficace degli esperti in materia.

Ci sono momenti in cui è toccato il fondo, nulla sembra funzionare e si esegue fuori di tutte le vostre opzioni.Il suo poi che il vero debug inizia.Un bug può fornire la pausa è necessario svincolarsi da una fissazione di una soluzione inefficace.

Video Lezioni su di Debug del Kernel e Profilatura, Analisi Dei Core Dump, Multicore Debug con GDB, Controllo Multi-Core Condizioni Di Gara, Il Debug Di Elettronica

/* 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 e Ottimizzazione delle Prestazioni - Steve Best
  2. Le Applicazioni Linux, Tecniche Di Debug - Aureliano Melinte
  3. Il debug con GDB:GNU Debugger a Livello Sorgente - Roland H.Pesch
  4. Debugging Linux Embedded - Christopher Hallinan
  5. L'Arte di Debug con GDB, DDD, ed Eclipse - Normanna S.Matloff
  6. Perché I Programmi Di Errore:Una Guida Sistematica di Debug - Andreas Zeller
  7. Software Di Esorcismo:Un Manuale per il Debug e Ottimizzazione di Codice Legacy - Bill Blunden
  8. Debug:Trovare più Sfuggente Software e Hardware - David J.Agans
  9. Il debug da Pensare:Un Approccio Multidisciplinare - Robert Charles Metzger
  10. Trovare il Bug:Un Libro di non Corretto Programmi - Adam Barr

I Sistemi Di File ( 1 -> 2 -> 6 -> ... )

"Volevo avere la memoria virtuale, almeno per come è accoppiata con sistemi di file".-- Ken Thompson

Su un sistema UNIX tutto è un file;se qualcosa non è un file, è un processo, tranne che per le named pipe e socket.In un sistema di file, un file è rappresentato da un inode, una sorta di numero di serie, contenente informazioni circa le reali dati che compongono il file.Linux Virtual File System VFS memorizza nella cache le informazioni nella memoria di ogni file system è montato e utilizzato.Molta cura deve essere presa per aggiornare i file di sistema correttamente i dati all'interno di queste cache è modificato come file e le directory sono ideati, scritti e cancellati.La più importante di queste cache la Cache del Buffer, che è integrato in modo che il file singoli sistemi di accesso sottostante periferiche di archiviazione di blocco.

Video Lezioni sui Sistemi di Storage, Flash Amichevole File Di Sistema

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. I File System Di Linux - Moshe Bar
  2. I Filesystem Linux - William Von Hagen
  3. Filesystem UNIX:L'evoluzione, la Progettazione e la Realizzazione - Steve D.Pate
  4. Pratico Sistema Di File Di Disegno - Domenico Giampaolo
  5. File Di Sistema Di Analisi Forense - Brian Carrier
  6. Linux Filesystem Hierarchy - Binh Nguyen
  7. BTRFS:Linux B-albero del Filesystem - Ohad Rodeh
  8. StegFS:Un Steganografico File System per Linux - Andrew D.McDonald, Markus G.Kuhn

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

"UNIX non è stato progettato per impedire ai suoi utenti di fare cose stupide, come che può anche impedire loro di fare ottime cose".— Doug Gwyn

Nessuna tecnica funziona se non è utilizzato.L'etica cambia con la tecnologia.

"F × S = k"il prodotto della libertà e della sicurezza è una costante.- Niven Leggi

La crittografia è la base di fiducia online.Hacking è sfruttare i controlli di sicurezza sia dal punto di vista tecnico, fisico o umano a base di elemento.Proteggere il kernel da altri programmi in esecuzione è un primo passo verso una sicura e stabile del sistema, ma questo ovviamente non è sufficiente:un certo grado di protezione deve esistere tra i diversi user-land applicazioni.Sfrutta possibile destinazione di locali o servizi a distanza.

“Non si può incidere il vostro destino, la forza bruta...hai bisogno di una porta sul retro, in un canale laterale in Vita." ― Clyde Dsouza

I computer non risolvere i problemi e di eseguire soluzioni.Dietro ogni non deterministico codice algoritmico, c'è un determinato mente. -- /var/log/dmesg

Video Lezioni Crittografia e Sicurezza delle reti, Gli spazi dei nomi per la Sicurezza, Protezione Contro Attacchi Remoti, Secure Linux Embedded

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Hacking:L'Arte di Sfruttamento - Jon Erickson
  2. Il Rootkit Arsenal:Di fuga e di Evasione, negli Angoli Bui del Sistema - Bill Blunden
  3. Hacking Exposed:Rete Di Protezione Di Segreti - Stuart McClure, Joel Scambray, George Kurtz
  4. Una Guida per il Kernel di Sfruttamento:Attaccare il Core - Enrico Perla, Massimiliano Oldani
  5. L'Arte della Memoria Forensics - Michael Hale Ligh, Andrew Caso, Jamie Levy, AAron Walters
  6. Pratico Reverse Engineering - Bruce Dang, Alexandre Gazet, Elias Bachaalany
  7. Pratiche Per L'Analisi Del Malware - Michael Sikorski, Andrew Honig
  8. Massima Sicurezza Di Linux:Un Hacker Guida per Proteggere il Vostro Server Linux - Anonimo
  9. Di Sicurezza Di Linux - Craig Caccia
  10. Mondo Reale Sicurezza Di Linux - Bob Toxen

Sorgente Del Kernel ( 0.11 -> 2.4 -> 2.6 -> 3.18 )

"Come il vino, la padronanza della programmazione del kernel matura con il tempo.Ma, a differenza del vino, diventa più dolce nel processo".--Lawrence Mucheka

Si potrebbe non pensare che i programmatori sono gli artisti, ma la programmazione è estremamente professione creativa.È basato sulla logica della creatività.Informatica educazione non può rendere qualcuno un esperto programmatore di più che studiare i pennelli e pigmenti può rendere qualcuno un esperto pittore.Come già sapete, c'è una differenza tra il sapere, il percorso e il percorso compiuto;è della massima importanza per rimboccarsi le maniche e sporcarsi le mani con il codice sorgente del kernel.Infine, con il così guadagnato kernel conoscenza, ovunque si vada, si shine.

Immaturi programmatori imitare;maturo programmatori rubare;cattivi programmatori deturpare quello che prendono, e buoni programmatori fanno in qualcosa di meglio, o almeno qualcosa di diverso.Il buon coder saldature suo furto in un complesso insieme di sentimento, che è unico, completamente diverso da quello da cui è stato strappato.

Video Lezioni su Kernel Ricette

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. Principianti iniziare con Linux 0.11 fonte (meno di 20.000 righe di codice sorgente).Dopo 20 anni di sviluppo, rispetto a Linux 0.11, Linux è diventato molto grande, complesso e difficile da imparare.Ma il concetto di design e la struttura principale dispone di cambiamenti fondamentali.Imparare Linux 0.11 ancora è importante significato pratico.
  2. Una Lettura obbligatoria per il Kernel Hacker => Linux_source_dir/Documentation/*
  3. Si dovrebbe essere sottoscritto e attivo su almeno un kernel mailing list.Iniziare con kernel newbies.
  4. Non è necessario leggere il codice sorgente completo.Una volta che si ha familiarità con il kernel API e il suo utilizzo, avviare direttamente con il codice sorgente del sub-sistema si è interessati.Si può anche iniziare con la scrittura di un proprio plug-n-play moduli di sperimentare con il kernel.
  5. Driver di periferica scrittori dei vantaggi di avere un proprio hardware dedicato.Iniziare con Raspberry Pi.

Il Kernel Linux Janitor Progetto

  

'' Andiamo attraverso il codice sorgente del kernel di Linux, facendo revisioni del codice, sistemando il codice non mantenuto e fare altre ripuliture e conversioni API. E 'un buon inizio per Kernel hacking ''.

avrei dovuto dire: "imparare C". :)

Prova questo libro online gratis.

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

Controlla kernelnewbies.org, iscriviti alla mailing list Kernelnewbies, avuto modo di irc.oftc.org #kernelnewbies

Alcune risorse:

  • libro: Robert Love, Linux Kernel Development, 3a edizione
  • libro: Corbet, Rubini, driver di periferica Linux, 3rd edition (versione gratuita qui )
  • libro: il kernel Linux in un guscio di noce (versione gratuita qui )
  • materiale gratuito fornito da Free Electrons
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top