SWI075 - Linux kernel

1. Kernel build system, kompilace, přenositelnost: Jak (podrobně) fungují Makefiles v novém build systému v kernelu 2.6 (kbuild). Konfigurace kernelu, řešení přenositelnosti na různé HW architektury (jak na úrovni konfigurace, tak především na úrovni vlastních zdrojáků). Jednotlivé fáze překladu (do .o jednotlivé zdrojáky, moduly do .ko, linkování image vlastního kernelu, ...). K Přenositelnosti - jak na přenositelnost datových typů mezi různě-bitovými architekturami - opaque typy, je to se znaménkem u datového typu char, datové typy s explicitně udanou velikostí, zarovnání, padding struktur, jak se programují architekturové závislé části, aby byly pro ostatní kód transparentní.

2. Procesy a plánování: Proces a jeho vznik, související datové struktury (task_struct - kde byl uložen ve starších kernelech a jak je to s ním ve 2.6 (thread_info)). Alokace PID, stavy procesu amožné přechody mezi nimi, rozdíl mezi kernel-space a user-space. Process context, interrupt context. Vznik procesu, funkce fork(), exec(), wait4(), waitpid(), exit() a mechanismus copy on write. Rozdíl mezi procesem a threadem, jak linux implementuje thready. Kernelové thready. Plánovač - rozdíl mezi kooperativní a preemptivním multitaskingem, jak funguje plánovač v linuxovém kernelu - I/O bound kontra Processor bound procesy, k čemu se využívá priorita procesu. Co je timeslice. Algoritmus plánovače, runqueues. Spaní a vzbouzení procesů, waitqueues, loadbalancer na SMP, přepínaní kontextu při přeplánování (jak v user-space tak v kernel-space).

3. Synchronizace v kernelu + syscally: Rozdíl mezi synchronizací použivající pasivní a aktivní čekání, její implementace v linuxovém kernelu (semafory, respektive spinlocky), kdy se který typ synchronizace používá a naopak kdy se který použít nesmí. Race condition, deadlock, kritické sekce. Co je potřeba zamykat (kde jsou kritické sekce) - kdy vůbec může dojít k souběžnému přistupu (interrupt, preempce v kernelu, sleep, synchronizace s user space, SMP, ..), completion variables, big kernel lock, od spinlockům k preemptivnímu kernelu, memory barriers.
Co je to syscall, vztah mezi libc a kernelem. Tradiční způsob volání syscallů na x86 (int 0x80) a nový koncept vsyscallů. Předávání parametrů z userlandu do kernelu (a jejich ověřování), jak si přidat do kernelu vlastní syscall (a proč to nedělat :) ).

4. Interrupty a interrupt handlery: Asynchronní a synchronní interrupty. ISR. Funkce interrupt handleru - co se v něm smí a co ne. Přiřazení interrupt handlerů k IRQ. Sdílené a reentrantní interrupt handlery. Interrupt context. Implementace obsluhy přerušení. Povolení a zakázání interruptů, cli() a sti() versus local_irq_enable() a local_irq_restore(). disable_irq() a disable_irq_nosync(). Bottom halves - obecně princip, k čemu slouží. Softirqs (co jsou, implementace, použití). Tasklety (co jsou, vztah k softirqs, implementace, použití). ksoftirqd kernel thread. Workqueues (co jsou, implementace, použití). Zamykání a synchronizace v interruptech a mezi bottom halves.

5. VFS a filesystémy: Co je VFS, abstrakce. Nejdůležitější datové struktury (superblock, inode, file, dentry, ...), k čemu slouží, operace na nich. dcache (dentry cache). Vztah VFS ke skutečným filesystémům. Vazba VFS na proces. Jak fungují nejběžněji používané dnešní filesystémy, jejich "vnitřnosti" a vlastnosti. (ext2/3, reiserfs, xfs, ...).

6. Memory management: Alokace paměti v kernelu - stránky (struct page), zóny (proč rozdělení stránek do zón (DMA, normal, highmem)), struct zone. Alokace a dealokace stránek - které funkce použít a jak fungují - alloc_pages(), __get_free_pages(), get_zeroed_page(). kmalloc() - popis rozhraní, jak funguje. vmalloc() a rozdíl oproti kmalloc(). Slab allocator - co jsou slaby, k čemu slouží, jak fungují. struct slab, vztah mezi cache, slab a object. API ke slab allocatoru - kmem_cache_create(), kmem_cache_alloc(). Alokace na stacku, dočasná mapování, , GFP_HIGHMEM, ...

7. Adresní prostor procesu, stránkování: Memory destriptor (struct mm_struct) a práce s ním. Jak je to s kernel thready co se týče adresního prostoru. Koncept VMA - k čemu slouží a jak funguje. struct vm_area_struct, vybrat její "zajímavé" položky a k čemu slouží (vm_ops, jak jsou VMA spojeny do spojáku, červeno-černý strom skrytý za vm_rb. Vztah vma a výpis /proc/<pid>/maps. Přemisťování a spojování VMA - find_vma() a příbuzné funkce. Co se stane když uživatelsý proces zavolá mmap(). Jak glibc provádí alokaci paměti - brk() vs. mmap(). Jak funguje stránkování a jeho reprezentace v kernelu (PMD, PGD, PTE). Co je to Page cache a k čemu ji kernel využívá. struct address_space. Buffer cache - k čemu slouží buffer cache a kernelový thread pdflush, jak provádí writeback.

8. Ovladače zařízení obecně + Bloková zařízení: Co je ovladač zařízení. I v userspace se dají psát "drivery" (viz vgalib). Jak psát drivery pro různé HW (bloková zařízení, znaková zařízení, SCSI, PCI, periféria (myš, klávesnice, joystick, ...)). Bloková zařízení - struct bio, buffery, request queues, I/O schedulery v kernelu - deadline, elevator, anticipatory, cfq.

9. Debugging + Time: Problémy s debugováním kernelu. printk(), syslogd, klogd. Co je to kernel oops a jak ho použít k ladění chyby - ksymoops, kallsyms, soubor System.map. Jak ladit problémy se zamykáním a atomicitou (in_interrupt(), might_sleep(), in_atomic()). Makra BUG() a BUG_ON(). Magic SysRq. Jak použít gdb k ladění kernelu. Projekt kgdb. User mode linux.
Počítání času v kernelu - hodnota HZ - co všechno ovlivňuje její nastavení (přesnější kernel timery, select() a poll(), přesnější scheduler). Co jsou to jiffies a jak jsou vkernelu reprezentovány. RTC. Jak je kernelem obsluhováno přerušení od časovače. Kernel timers - k čemu jsou a jak se používají - struct timer_list. BogoMIPS.

10. Rootkity, bezpečnostní problémy: Rootkity - co jsou, jak se používají. LKM rootkity. Rootkity založené na práci s /dev/kmem, včetně podrobné analýzy suckitu. + cokoliv dalšího co se týká bezpečnosti a není pokryto jiným referátem.

11. LSM, SELinux: LSM, SELinux, přehled LSM modulů.

12. Networking: Síťová zaŕízení (jak funguje transport mezi různými úrovněmi (i v vzhledem k ISO/OSI) vrstvám, co je skb, netfilter, nastavování parametrů socketu, raw sockety), ...

13. ACPI: Power management, DSDT, ...

255. Cokoliv dalšího


Co se týče zápočťáků, tak pokud hledáte inspiraci, doporučuji především zkusit mrknout na http://bugzilla.kernel.org/, což je bugzilla k linuxovému kernelu, takže je tam možné najít dostatek problémů k řešení :) Další možností je podívat se po něčem zajímavém na stránce http://janitor.kernelnewbies.org/, ovšem ta poslední dobou poněkud umírá.


Seminář se v akademickém roce 2007/2008 koná každé úterý od 09:00 v Unixové laboratoři SU2. První seminář se bude konat 9.10.2007


Jiří Kosina <jikos@jikos.cz>