2009-06-18 3 views
36

La programmazione non è il mio lavoro principale, sebbene mi diverta e qualche volta mi paghi. Per molti anni ho sentito parlare di Linux e i miei amici mi hanno mostrato molti * nix (o * nici?), Anche se sono rimasto con Mac OS.Quali parti del kernel Linux posso leggere per divertimento?

Pensi che ci siano parti del kernel di Linux che potrei divertire a guardare, che mi aiuterebbero a capire di cosa si tratta? Ad esempio, in che modo Linux è diverso da Darwin?

Sono cresciuto con assemblatore e DOS, quindi cose come interrupt o C di basso livello non dovrebbero essere ostacoli alla comprensione. Ma alla fine sono più interessato ai concetti di alto livello, come il threading o lo stack di rete - so che i diversi sistemi operativi li fanno in modo diverso. E sto cercando qualcosa di divertente, facile e divertente, come la lettura a tarda notte.

(Nota: fatto un CW, nel caso)

Aggiornamento: Ho guardato per alcuni documenti e cominciai a leggere:

+3

probabilmente meglio leggere il codice per * BSD (un sistema operativo che, come Linux, è basato su Unix) *. Non solo è * molto * meglio progettato, ma Mac OSX è basato su BSD ... quindi potrai anche leggere una grande parte del kernel OSX! –

+1

Vedi anche Rusty's Unreliable Guide to Kernel Hacking, se stai cercando divertimento, ha una bella sezione sui commenti divertenti trovati sul kernel. – ninjalj

risposta

30

Vorrei raccomandare guardando LXR. Rende più semplice seguire il flusso del codice (non è necessario cercare ogni funzione che si chiami —, ma il sito lo fa per te).

Alcuni punti di partenza, per la versione corrente (2.6.30):

  • start_kernel() — pensare a come il kernel equivalente di main(). Questa funzione inizializza quasi tutti i sottosistemi del kernel; seguilo per vedere in codice ciò che vedi scorrere sullo schermo durante l'avvio.
  • entry_32.S — chiamate di sistema e interrupt (x86-32 versione, che dovrebbe essere più vicino ciò che si sa, si noti l'uso della AT & T assemblaggio dialetto invece di Intel si dialetto potrebbe essere più abituati a).
  • head_32.S — il punto di ingresso del kernel. Qui inizia il kernel dopo il passaggio alla modalità protetta; alla fine, chiamerà start_kernel().
  • arch/x86/boot — il codice di bootstrap in modalità reale. Inizia in assembly (boot/header.S), ma salta rapidamente nel codice C (a partire da boot/main.c). Fa l'inizializzazione in modalità reale (principalmente chiamate BIOS che devono essere fatte prima di passare alla modalità protetta); è compilato utilizzando uno strano trucco GCC (.code16gcc), che consente la generazione di codice in modalità reale a 32 bit.
  • arch/x86/boot/compressed — se vi siete mai chiesti da dove viene il messaggio "Decomprimi Linux ...", viene da qui.
+0

Penso che l'url LXR che hai sia cambiato. -> http://lxr.free-electrons.com/source/kernel/ –

11

me stesso, ho sempre trovato il codice di pianificazione delle attività un po 'di spasso: -/

Methinks hai bisogno di farti un hobby al di fuori del settore. O una vita :-)

+3

+1 dall'OP. Hai ragione :) –

8

I commenti nel kernel possono essere piuttosto divertenti. Ci sono alcuni tips on where to find the best ones su kerneltrap.

arco/sparc/lib/checksum.S-/* Sun, non puoi battermi, non puoi. Smetti di provare, arch/sparc/lib/checksum.S: * rinunciare. Dico sul serio, sto andando a calci la merda vivente arch/sparc/lib/checksum.S- * fuori di voi, game over, luci spente. */

+1

Stavo per suggerire anche questo! –

1

Si sarebbe probabilmente ottenere di più di leggere un libro sulla teoria del sistema operativo. Per quanto riguarda il codice sorgente, non ne ho idea, ma puoi facilmente scaricare lo Linux kernel source e vedere se riesci a trovare qualcosa che faccia appello.

+0

Mi piace l'inglese non ... mi piace C :) –

+0

oh, allora Pax ha ragione - hai bisogno di una vita :-) –

3

Si potrebbe voler leggere o sfogliare un libro che descrive il kernel di Linux prima di esaminare in profondità il kernel di Linux.

I libri che vengono in mente sono:

+0

Cosa consiglieresti tra le cose che sono (1) più brevi, (2) su Internet? –

+0

Il secondo libro ("Il design del sistema operativo UNIX") è buono, ma non ti dirà nulla di Linux. È stato scritto più di venti anni fa --- ben prima della creazione di Linux. Quello che ti offre è un bel tour del kernel UNIX del tempo, che descrive i vari moduli e algoritmi senza immergersi nel codice. Non è aggiornato, ma poiché descrive una versione più semplice del kernel, rende anche più facile conoscere molti dei concetti chiave. –

1

Questo dovrebbe alzare un po 'di codice interessante quando viene eseguito nella directory src:

grep -ir "fixme" * 

prova anche con altri termini comici, merda, merda, f ***, pinguino, ecc.

1

È necessario ridefinire la parola "divertente" nel proprio contesto. :)

Detto questo, il kernel di Linux potrebbe essere troppo di un mostro da assumere. Potresti voler iniziare con alcuni kernel accademici o più primitivi per capire come stanno andando le cose, per prima cosa.Si consiglia inoltre di prendere in considerazione il libro Jolix.

1

È stato consigliato da molte persone che la versione 1.0 di Linux sia la più facile da capire.

Tuttavia, se si sta cercando una buona fonte del kernel da leggere, non andrei con Linux, è una bestia di un hack (su come dire che le fonti GCC sono "divertenti") Invece, si potrebbe desiderare di provare Minix o uno dei BSD (Darwin è fondamentalmente un ramo di NetBSD iirc) o anche uno dei tanti cloni DOS gratuiti se tutto il resto è un po 'troppo spaventoso ..

0

Per divertimento suppongo che si possa anche vedere Minix, non è esattamente linux ma i sistemi operativi moderni di tenenbaum sono una buona lettura.

1

provare a leggere il codice che implementa questi dispositivi a caratteri: /dev/zero /dev/null /dev/full

E forse i generatori di numeri casuali, se siete inclini. Il codice è semplice e semplice rispetto a tutti gli altri driver di dispositivo poiché non tocca alcun hardware.

Inizio driver/char/mem.*

6

linux-0.01.tar.gz è Kernel storico e buona per l'avvio
è semplice e molto piccolo e migliore per iniziare a leggere
(anche esso hanno void main (void) Invece di start_kernel() lol: D)

1

kernel.h

Alcuni trucchi semplici che possiamo imparare, come ad esempio

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 
... 
#define min(x, y) ... 
... 
#define container_of