PB173 - Ovladače jádra - Linux I. GIT a jádro Jiri Slabý ITI, Fakulta informatiky 17. 9. 2013 J. Slabý (ITI, Fl) PB173/02 17.9.2013 1/19 Část I Úvodní informace J. Slabý (ITI, Fl) PB173/02 17.9.2013 2/ 19 Úvodní informace • Semestr = 13 týdnů (22. 10. konference) • Cvičící o Vývoj jádra od r. 2005 (NetBSD, Linux) o Student Fl o Cíle cvičení • Nastínit trochu jiný model programování Prohloubit znalosti vnitřností OS a HW • Ukončení: k • Splnění všech domácích úkolů • 10 bodů na úkol, alespoň | z celkového počtu • Vše potřebné ve studijních materiálech v ISu J. Slabý (ITI, Fl) PB173/02 17.9.2013 3/ 19 Bodování úkolů Na začátku: 10 bodů za každý příklad • -3 body za každý týden prodlení (termín je vždy do dalšího cvičení) • -2 body za každé vrácení v případě nějaké nefunkčnosti • -2 body za bezpečnostní díru (ve slidech značené POZOR) a -1 bod za kód neodpovídající stylu • -1 bod za ostatní drobnosti J. Slabý (ITI, Fl) PB173/02 17.9.2013 4/ 19 S čím budeme pracovat? HW a Stroje satyr01-10 • CentOS 6.x • Login/heslo: vyvoj/vyvoj • Nemají viditelnou IP J. Slabý (ITI, Fl) S čím budeme pracovat? sw « GIT • Úvod do GITu dnes • Podrobněji: http://book.git-scm.com/ • Zdroje jádra • Použijeme předinstalované z RPM (/usr/src/kemeis/) • http://git.kernel.org/ (od 2.6.12) • full-history-linux GIT (od 0.01 do 2.6.26) • QEMU • HW k práci s PCI, l/O, na přerušení, DMA... J. Slabý (ITI, Fl) PB173/02 17.9.2013 6/ 19 Část II GIT J. Slabý (ITI, Fl) PB173/02 17.9.2013 7/ 19 Úkol Práce s GITem I. O Vytvořte si účet (pokud nemáte) na github.com O Proveďte fork • https://github.com/j irislaby/pbl73 0 Stáhněte si fork • git cloně git://github.com//pbl73.git O Prozkoumejte strukturu • Příklady ze cvičení • Adresář pro domácí úkoly J. Slabý (ITI, Fl) PB173/02 17.9.2013 8/ 19 Záplatování Výstup GITu = patch (záplata) Záplaty v linuxovém jádře O Poslat Odpovídajícímu správci (scripts/get_maintainer .pl) O Poslat na ML „pull request" a vystavit celý GIT strom • Popis V Documentation/SubmittingPatches Stejným způsobem odevzdávání domácích úkolů Ale ne přes github! J. Slabý (ITI, Fl) PB173/02 17.9.2013 9/ 19 Úkol Práce s GITem II. O Změňte cokoliv v souboru sandbox/hello O Zkontrolujte změny (git dif f —color) O git commit -a (správný log: shrnutí na řádek, volný řádek, zdůvodnění; vzor na git.kernel. org) • Git může chtít nastavit jméno a e-mail (instrukce jsou na stdout) O Smažte sandbox/hello (git rm) O git commit -a 0 Zkontrolujte log, zda obsahuje 2 změny (git log —color) O Podívejte se na poslední 2 změny (git show —color head, resp. head~i) 0 Vyzkoušejte git format-patch -2 O Proveďte push (git push) © Vygenerujte pull request (git request-pull) J. Slabý (ITI, Fl) PB173/02 17.9.2013 10/19 Část III Jádro J. Slabý (ITI, Fl) PB173/02 17.9.2013 11/19 Jádro vs. programy Hlavní rozdíly • Žádné libc (printf, strien, mailoc,...), ani ostatní (pthread) a Ne/oddělený paměťový prostor • Počáteční funkce (main) • module_init (=main), module_exit (=on_exit) a Pád systému => pád všeho J. Slabý (ITI, Fl) PB173/02 17.9.2013 12/19 Kód • Výhradně GNU C (x86 už jen GCC > 4.x) • Pevně daný CodingStyle • Kontrola: scripts/checkpatch.pl (není 100%) • Vše slinkováno do jednoho • vmlinux —> (b)zlmage o Ale moduly (standardní ELF: *.ko) J. Slabý (ITI, Fl) PB173/02 17.9.2013 13/19 Úkol Průzkum modulu (.ko objektu) O Zvolte si jeden modul v systému (ismod) O Zavolejte na něm modinf o 0 Proveďte objdump -d sekce .modinfo sekce O Porovnejte oba výstupy J. Slabý (ITI, Fl) Dokumentace • Linux Device Drivers, 3. edice a Documentation/* • Generovaná tamtéž (podobná DocBook) • Kód (http://lxr.linux.no/) Demo: pomocí Ixr najděte v jádře obecnou (v lib/) a optimalizovanou (v arch/) implementaci strlen J. Slabý (ITI, Fl) PB173/02 17.9.2013 15/19 Úkol Hello World O Spusťte virtuální stroj O Prozkoumejte adresář 01 z pb173 git repozitáře • Makefile, pbl73.c O Do init funkce doplňte výpis „Hello World" • printk(KERN_lNFO "..."); (ne, není tam čárka) • Objeví se v /proc/kmsg a na konzoli O Přeložte a vložte do systému • make, insmod O Zkontrolujte výstup dmesg O Můžete udělat commit a push do svého repozitáře J. Slabý (ITI, Fl) PB173/02 17.9.2013 16/19 Paměť • Omezený zásobník (4-8 K) • Žádná nebo malá rekurze • Jen pro malá data (int, malé struct, krátká pole, ...) • Pracuje se se stránkami (na x86 4K-1 G) • Omezená velikost alokace (fragmentace) o Podrobnosti v dalších cvičeních J. Slabý (ITI, Fl) PB173/02 17.9.2013 17/19 Jednoduché alokace Malé alokace (sta bajtů, maximálně až cca. 4 M) • Horní mez závislá na architektuře a kmalloc, kfree (linux/slab.h) Alokace mají (většinou) GFP parametr. Ten určuje, co si alokátor může dovolit (spát, swapovat, použít HIGHMEM, ...). Prozatím nám stačí GFP_KERNEL. void *mem = kmalloc(100, GFP.KERNEL); if (mem) { } "' kfree(mem); J. Slabý (ITI, Fl) PB173/02 17.9.2013 18/19 Úkol O V exit funkci naalokujte 1000 bytů (kmailoc) Q Udělejte do nich střepy „Bye" O Vypište paměť jako řetězec (printk a %s) O Uvolněte paměť O Vložte a odeberte modul ze systému (insmod a rmmod) 0 dmesg Q Můžete provést commit a push J. Slabý (ITI, Fl) PB173/02 17.9.2013 19/19