PB173 - Ovladače jádra - Linux li. Jiří Slabý ITI, Fakulta Informatiky 5. 10. 2010 J. Slabý (ITI) PB173/01 5. 10. 2010 1 /1 Důležité informace • Kolokvium za DÚ • DÚ do příštího cvičení • Login/heslo O Exportované domovské adresáře => login/login (z Fl) O Jinak ^> vyvoj/vyvoj • GIT: git: / / decibel. f i . muni . c z / ~xslaby/pbl73 • git pull —rebase • Qemu Obraz: /home/local/centos . img • 2 účty: root/toor, user/user • ./qemu_startZ GITu J. Slabý (ITI) PB173/01 5. 10. 2010 2/1 Dnešní téma Komunikace jádro • uživatelský prostor J. Slabý (ITI) PB173/01 5. 10. 2010 3/1 Komunikace s uživatelem I. O Voláním funkce: systém call (syscall) • V jádře: tabulka číslo-funkce (unistd.h) • Skok do jádra speciální instrukcí (x86_64: syscall) • O skok se stará libc (fwrite^write^syscaii^instrukce) • Drahá operace (přepnutí kontextu) • syscall (__NR_write, STDOUT.FILENO, "Test\n", 5); • Demo: Ixr ->• __NR_write O Speciální syscall • Bez skoku do jádra, v knihovně linkované jádrem (vdso. so) • Několik málo jednoduchých funkcí (gettimeof day, ...) Každá nová funkcionalita = nový syscall J. Slabý (ITI) PB173/01 5. 10. 2010 4/1 Úkol V userspace: pomocí volání syscali spustit /bin/date. Předtím vypsat nějakou informaci. O syscall (__NR_write, . . ., "Running date\n", . . . ) O syscall (__NR_execve, "/bin/date", ...) Je třeba znát prototypy funkcí. • Většinou JSOU dokumentované: man write, man execve • Jinak použít Ixr • sys_fork • SYSCALL-DEFINEl (rmdir, ...) ->• sys_rmdir • SYSCALL_DEFINE3 (read, ...) ->• sys.read J. Slabý (ITI) PB173/01 5. 10. 2010 5/1 Komunikace s uživatelem II. O Speciální soubory v /dev • Komunikace přes soubor (není nutný nový syscall) • Seznam vDocumentation/devices.txta/proc/devices • Identifikované jako major a minor čísla • Většinou major=ovladač, minor=zanzení (tty: 4, 0-63) • Blokové (disky apod.) • Komunikace po blocích • Nebudeme se jimi zabývat (popsány v LDD) • Znakové (ostatní) • Komunikace po znacích (bajtech) • Viz následující slidy O Sockety, roury, ... J. Slabý (ITI) PB173/01 5. 10. 2010 6/1 Znaková zařízení I. • LDD3 3. a 6. kapitola • 2-3 kroky O Registrace rozsahu major+minor (module.init) • alloc-chrdev_region, register_chrdev_region, unregister_chrdev_region (linux/fs .h) • Přidání záznamu do /proc/devices O Registrace jednotlivých minorů (PCI, USB, .. .probe) • cdev.add, cdev.del (linux/cdev.h) • Po odpovídajícím mknod lze zařízení používat 0 Podat zprávu udev (vytvoření /dev/*) - nepovinné (probe) • device_create, device-destroy (linux/device.h) • Předem je potřeba vytvořit class (module.init) • Implementuje open, close, read, write, ioctl, mmap, . .. J. Slabý (ITI) PB173/01 5. 10. 2010 7/1 Stačí-li 1 zařízení (1 minor), lze použít vrstvu mise • Dělá všechnu práci z předchozího slidu • Potřebujeme • Seznam implementovaných funkcí (opět) a Definici mise zařízení (struct misedevice) • misc.register, misc.deregister • Objeví se V /proc/misc a /dev • linux/misedevice.h Popis funkcí • struct file_operations(linux/fs.h) • Seznam funkcí, které chceme obsluhovat • Parametr pro cdev_add, jsou v miscdevice apod. struct module *owner; /* = THIS-MODULE */ int (*open)(struct inode *inode , struct file *filp) ssize.t (* read)(struct file *filp , char ..user *buf, size.t count, loff.t * of f p ) int (* release)(struct inode *inode , struct file *filp); • f iip->private_data slouží programátorovi (libovolně) • of fp slouží programátorovi (k poznamenání průběhu) a ..user značí ukazatel od uživatele a Návratové hodnoty o int - záporné =-Echyba, jinak 0 o ssize.t - záporné = -Echyba, jinak počet zpracovaných znaků J. Slabý (ITI) PB173/01 5. 10. 2010 9/1 Úkol Vytvořit mise (znakové) zařízení s obsluhou open, read, write, release (tj. close). O Definice struct file_operations 0 Vytvoření funkcí dle prototypu z f iie.operations (nalézt v Ixr) • Open a release s nějakým printk • Read a write prozatím prázdná těla • Open a release vracejí 0 (žádná chyba), read též (EOF), write count (zapsáno vše) O Definice struct misedevice • minor = MISC_DYNAMIC_MINOR, name, fops O misc.register/deregister do module_init/exit Q make, insmod O Vyzkoušení cat /dev/name (name je Z misedevice) J. Slabý (ITI) PB173/01 5. 10. 2010 10/1 Uživatelská paměť • Něco, čemu nelze věřit (NULL, ukazatel to tabulek oprávnění,...) • Nutnost kontroly • copy.from.user, copy.to.user • „memcpy" s kontrolou • Vracejí počet NEzkopírovaných znaků (0=OK) • get.user, put.user • Jen primitiva (char, short, int, long) • „var = * (type *) buf" a „* (type *)buf = var" S kontrolou • Vracejí O nebo chybu (záporná hodnota) • Definované v linux/uaccess. h Demo: pb173/02 J. Slabý (ITI) PB173/01 5. 10. 2010 11/1 Úkol Dopsat těla funkcí read a write tak, aby zpracovávala data. O write vypíše uživatelský buffer pomocí printk • copy.from.user (chyba = return -EFAULT) • Ukončit zkopírovaný řetězec pomocí \0 Q read bude vracet "Ahoj" • copy.to.user J. Slabý (ITI) PB173/01 5. 10. 2010 12/1 Datové typy • Jádro a proces může běžet s různými bitovými šířkami (32, 64-bit) a Problém s ukazateli a long proměnnými • Jiná délka dat • Jiné zarovnání struktur • Jádro definuje pevné typy (z hlediska počtu bitů) • linux/types.h • __u8, __ul6, __u32, __u64 • __s8, __sl6, __s32, __s64 • Ukazatele musí být v union s __u 64 struct my { struct my { unsigned long flags ; short index ; void *data; „u64 flags ; __s1 6 index ; union { void *data; } my; „u64 filler; }; } my; read(fd, &my, sizeof(my)); ioctl {fd , DO.SOMETHING, &my) ; J. Slabý (ITI) PB173/01 5. 10. 2010 13/1