PB173 - Ovladače jádra - Linux VI. Jiří Slabý ITI, Fakulta Informatiky 2. 11. 2010 J. Slabý (ITI) PB173/01 2. 11. 2010 1 / 1 Datové typy LDD3 kap. 11 • Základní typy • Endianita (pořadí bytů) • Datové struktury (seznam, FIFO) 2. 11. 2010 2/1 Základní typy a char, short, int, long, long long (+ unsigned) • u8, ul6, u32, u64, __u8, __ul6, __u32, __u64 • s8, sl6, s32, s64, __s8, __sl6, __s32, __s64 arch char short int long ptr long long alpha 1 2 4 8 8 8 arm 1 2 4 4 4 8 ia64 1 2 4 8 8 8 m68k 1 2 4 4 4 8 mips 1 2 4 4 4 8 ppc 1 2 4 4 4 8 spare 1 2 4 4 4 8 sparc64 1 2 4 8 8 8 X86.32 1 2 4 4 4 8 X86-64 1 2 4 8 8 8 Tabulka: sizeof základních typů pro různé architektury J. Slabý (ITI) PB173/01 2. 11. 2010 3/1 Základní typy arch long virt phys X86.32 4 4 4 X86.32+PAE 4 4 4.5 X86.64 8 8 8 Tabulka: sizeof dalších typů (ukazatelů) Pro práci s fyzickou adresou long/ukazatel nestačí « Ale u64 může být zbytečné (čisté 32-bity) • Proto speciální typy • phys_addr_t (RAM) • dma_addr_t (RAM) • resource_size_t (PCI prostor apod.) • Anebo long, ale pak v něm uchovávat p f n (phys/PAGE_sizE) Úkol: opravte typy v pb173/06 (první TODO) J. Slabý (ITI) PB173/01 2. 11. 2010 4/1 Pořadí bytů Tabulka: Číslo 0x12345678 v paměti Adresa: 0 1 2 3 Big-endian 0x12 0x34 0x56 0x78 Little-endian 0x78 0x56 0x34 0x12 Mixed-endian 0x34 0x12 0x78 0x56 Pro typy o velikosti větší než 1 je nutné vědět pořadí a Specifikace • x86: LE • PowerPC: LE nebo BE (dle nastavení CPU) • PCI: LE • Síťový provoz: BE J. Slabý (ITI) PB173/01 2. 11. 2010 5/1 Funkce pro pořadí bytů • asm/byteorder.h • __leXX, _JoeXX • cpu_to_leXX, cpu_to_beXX • leXX_to_cpu, beXX_to_cpu • XX G {16, 32, 64} • *p varianty - ukazatele « *s varianty - in-place • ntohs, ntohl, htons, htonl Úkol: doplňte tělo decode_and_print v pb173/06 (druhé TODO) J. Slabý (ITI) PB173/01 2. 11. 2010 6/1 Chyby jako ukazatele • void *funkce() • Jak vrátit chytřejší chybu, než NULL? • Díra na konci adresového prostoru • Tj. nevalidní ukazatel (dereference by způsobila pád) • Např. Oxfffffffffff00000-Oxffffffffffffffff (x86_64) » Lze použít k zakódování chyby • void *ptr=ERR_PTR (-Eerror) » IS_ERR(ptr) int err=PTR_ERR (ptr) • IS_ERR (NULL) =f alse J. Slabý (ITI) PB173/01 2. 11. 2010 7/1 Seznam I. • linux/list.h • struct list-head (obsahuje prev, next) • Jak samotný seznam (počátek), tak jeho prvky • LIST_HEAD (my_list) , INIT_LIST_HEAD (&my_list) • list_add(co, kam) , list_add_tail, list_del • list_move, list_move_tail struct my.struct { struct my.struct *s; int a; s = kmalloc( sizeof (*s) , GFP.KERNEL) ; struct list.head list; if (!s) { ... } }; I i s t _ a d d (& s—> list , &my.list); LIST.HEAD( my.list) ; /* I i s t .a d d .t a i I (&s->l i s t , &my.list) Úkol: naalokujte 20 stránek a v seznamu si je pamatujte. J. Slabý (ITI) PB173/01 2. 11. 2010 8/1 Seznam II. • linux/list.h • list_empty • list_entry, list-first_entry, list.f or.each.entry (...) { . . . } (jako for), list-f or.each.entry.rever se (...) { . . . } • *_saf e varianty - pokud měním aktuální člen seznamu struct my.struct *s, *s1 ; s = I i st _f i rst.e n t ry (&my.list , struct my.struct , list); s = I i st.e n t ry (s-> I i s t . next , struct my.struct , list); /* or */ I ist.f o r.each.en t ry (s , &myJist , list) { s->a; } list.for.each.entry.safe (s , s1 , &my.list , list) { I ist.de I (&s->l i st ) ; } Úkol: předchozích 20 stránek uvolněte. J. Slabý (ITI) PB173/01 2. 11. 2010 9/1 FIFO • linux/kfifo.h, samples/kfifo/* • struct kfifo • Statické: declare_kfifo + init_kfifo • Dynamické: kfifo_alloc (&fifo, size, gfp_*), kfifo_free • Zápis: kf if o_in (&f if o, buf, count) • Ctení: kf if o_out (&f if o, buf, count) • Obsazeno: kfifo.ien (&fifo) • Volno: kfifo.avail (&fifo) J. Slabý (ITI) PB173/01 2. 11. 2010 10/1 Úkol Práce s FIFO (linux/kfifo.h) O Globální FIFO 8 intů (declare_kfifo) Q init_kfifo 0 Zapisovat čísla (kf if o_in) dokud je místo O Vypsat všechna čísla (kf if o.out + kf if o_ien) Pozn.: ve starších jádrech je jiné rozhraní: • jen dynamicky: my_f ifo=kf ifo.aiioc • __kf if o_put=kf if o_in • __kf if o_get=kf if o.out • __kfifo.len, avail není J. Slabý (ITI) PB173/01 2. 11. 2010 11/1