A NetBSD kernel belsejében Bevezetés a kernel módú programozásba Hóka Ádám The NetBSD Foundation.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

64 bites architektúra, csapdák és átjárók Tóth Sándor Terméktámogatási tanácsadó.
1 Számítógépek felépítése 9. előadás I/O rendszerek.
Felhasználói felületek és üzleti logika Bollobás Dávid ASP.NET
CUDA.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Objective-C Memória kezelés
ATMEL AVR mikrokontroller család hardver-felépítése
Hibakezelés és Tesztelés a Visual Studio.NET-ben
LINUX/UNIX PARANCSOK.
JavaScript.
Szabó Tamás Károly G6HT12 A Ruby programozási nyelv.
Dinamikus tömbök.
Bevezetés a Java programozásba
10. előadás (2004. április 20.) A C előfordító (folytatás) Néhány hasznos compiler opció Egy tanulságos könyvtári függvény Változó hosszúságú argumentum.
11. előadás (2005. május 10.) A make segédprogram Alacsony szintű műveletek és bitmezők Fájl, katalógus rendszer hívások 1.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
Mikrovezérlők alkalmazástechnikája laboratóriumi gyakorlat Kovács Tamás & Mingesz Róbert 3. óra február 20., 23.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Követelmények Bevezetés a Javába Első java program írása Dokumentációk
Mutatók, tömbök, függvények
Borland C/C++ mintapéldák fájlokra. 1. példa Írjon olyan programot,amely megnyit egy hw.txt fájlt és írja bele a Hello világ szöveget. Ez után zárja le.
Ellenőrző kérdések a)Auto-indexing enabled b)Auto-indexing disabled c)Nem eldönthető 1.
Mikroszámítógépek I 8085 processzor.
Krizsán Zoltán.  Ha az algoritmus sokáig dolgozik,  de el akarjuk kerülni a „fagyást”.  Kisebb a költsége, mint az új folyamatnak.  Programozás szempontjából.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
1 Operációs rendszerek Az NT folyamatok kezelése.
1 Operációs rendszerek Signal kezelés. 2 SIGNAL kezelés Egyszerű folyamatok közötti kommunikációs (IPC – Inter Process Communication) megoldás. A signal.
PHP III. Fájlok, űrlapok.
Mikrovezérlők, perifériák laboratóriumi gyakorlat 3. óra szeptember 18. Mingesz Róbert v
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Mikrokontroller (MCU, mikroC)
2012. tavaszi félév Vitéz Gergely. A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele.
1.3. Pascal program felépítése Az els ő program. Program ; … Begin … End. Program fej Deklarációs rész Végrehajtó rész.
Fejlesztés PHP-NUKE portál rendszerre Horváth Zoltán Második Magyarországi PHP Konferencia március 27. Copyright PHP Konferencia,
Készítette: Csíki Gyula
Hernyák Zoltán Programozási Nyelvek II.
Széchenyi Isván Egyetem Számítógépes hálózatok II 1 Számítógépes Hálózatok II Széchenyi István Egyetem.
Készítette: Lipp Marcell
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Turbo Pascal Indítás: C:\LANGS\Turbo Pascal Turbo Pascal.
Mi a NetBSD? A projekt 1993 áprilisában jött létre a megrekedt 386BSD folytatásaként és ebből adódóan a legrégebbi ma is aktívan fejlesztett teljes értékű,
ARM tanfolyam 2. előadás.
Java programozási nyelv Filekezelés
Web fejlesztés V. Illés Zoltán ELTE Informatikai Kar
Miért is jók a rétegek?  Ha alkalmazást készítünk, nem akarunk IP csomagok küldésével bajlódni Ethernet keretekkel foglalkozni Implementálni megbízható.
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Objektum orientált programozás
Objektum orientált programozás
A Visual Basic nyelvi elemei
CUDA C/C++ programozás Atomikus műveletek A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Excel programozás (makró)
Számítógépes Grafika 3. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
Fájlkezelés Programozási tételek
Bevezetés az informatikába 3. előadás Software alapismeretek II Operációs rendszerek 1. A DOS operációs rendszer.
Mikrovezérlők alkalmazástechnikája laboratóriumi gyakorlat Hőmérséklet mérése Makan Gergely, Mellár János, Mingesz Róbert V március 23.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Szoftvergyártás: gyártás- vezérlés kód-figyeléssel Előadó: Banai Miklós és Rakyta Péter.
Programozási alapismeretek
A Számítógépek hardver elemei
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Függvénysablonok használata
Számítógépek felépítése 9. előadás I/O rendszerek
Előadás másolata:

A NetBSD kernel belsejében Bevezetés a kernel módú programozásba Hóka Ádám The NetBSD Foundation

Mi az a kernel mód? Supervisor mode kernel, meghajtóprogramok, fajlrendszerek User mode libc, programok, démonok

Mi a különbség? Közös address space A kernel egy nagy program (monolitikus felépítés) Hiba eseten az egész megáll kernel panic, NULL pointer dereference, etc. Nincs libc és más megszokott függvények Van, ami ugyanaz: memcpy Van, ami teljesen más:malloc ↔ kmem_alloc

Memóriafoglalás NAME kmem -- kernel wired memory allocator SYNOPSIS #include void * kmem_alloc(size_t size, km_flag_t kmflags); void * kmem_zalloc(size_t size, km_flag_t kmflags); void kmem_free(void *p, size_t size);

Példa a kmem_alloc használatára uint8_t *data; /* foglalunk 128 byte memoriát */ data = kmem_alloc(128, KM_SLEEP); … /* fontos, hogy tudjuk a meretét később is! */ kmem_free(fp, 128);

Példa a kmem_zalloc használatára /* egy structra van szükségünk */ struct foo *fp; /* lefoglaljuk a struct foo méretű memóriát */ fp = kmem_zalloc(sizeof(*fp), KM_SLEEP); … /* felszabadítjuk */ kmem_free(fp, sizeof(*fp));

Mutexek Céljuk a kritikus kódrészek védelme Akkor van rájuk szükség, ha több szál is hozzáférhet a változóinkhoz, vagy szeretnénk elkerülni valamilyen más race condition-t Típusai: – Adaptive mutex – Spin mutex

Mutex típusok Spin – Rövid időközönként újra próbálkozik Hátránya: terheli a processzort Előnye: csak ez használható interrupt contextben Adaptive – Alapból spin mutexként viselkedik, de egy megadott, rövid idő után várólistára rakja a thread-et (turnstile) Nem terheli a CPU-t, viszont nem használható bárhol

NetBSD kernel mutexek SYNOPSIS #include void mutex_init(kmutex_t *mtx, kmutex_type_t type, int ipl); void mutex_destroy(kmutex_t *mtx); void mutex_enter(kmutex_t *mtx); void mutex_exit(kmutex_t *mtx);

Példa mutexekre #include kmutex_t lock; mutex_init(&lock, MUTEX_DEFAULT, IPL_NONE); mutex_enter(&lock); /*... */ mutex_exit(&lock); mutex_destroy(&lock);

condvar SYNOPSIS #include void cv_init(kcondvar_t *cv, const char *wmesg); void cv_destroy(kcondvar_t *cv); void cv_wait(kcondvar_t *cv, kmutex_t *mtx); int cv_wait_sig(kcondvar_t *cv, kmutex_t *mtx);

condvar int cv_timedwait(kcondvar_t *cv, kmutex_t *mtx, int ticks); int cv_timedwait_sig(kcondvar_t *cv, kmutex_t *mtx, int ticks); void cv_signal(kcondvar_t *cv); void cv_broadcast(kcondvar_t *cv); bool cv_has_waiters(kcondvar_t *cv);

Condvar példa 1. Thread 1: mutex_enter(&lock); cv_wait_sig(&cv, &lock); mutex_exit(&lock); Thread 2: mutex_enter(&lock); cv_signal(&cv); mutex_exit(&lock);

Condvar példa 2. mutex_enter(&lock); r = cv_timedwait_sig(&cv, &lock, hz * 4); mutex_exit(&lock); if (r == EWOULDBLOCK) /* lejárt az időzítő */ else /* jelzést kaptunk */

Egyéb fontos kernel API-k callout – Függvények időzített és periodikus futtatása bufq – struct buf kezelése queue-ban rwlock – read/write lock kthread – kernel thread létrehozása függvényből

Egyéb fontos kernel API-k spl – A CPU interrupt szintjének változtatása kauth – Authentikációs alrendszer delay – rövid szünet (busy wait) store/fetch – Adat másolás a kernel és a userspace között

Egyéb fontos kernel API-k bus_dma – Gépfüggetlen DMA (Direct Memory Access) bus_space – Gépfüggetlen I/O (registerek, memóriák elérése) softint – Szoftveres megszakítások (software interrupt) pmf – Power management framework

config(9) A kernel forrás lefordításáért felelős Kezeli a függőségeket a fájlok között A config(1) program értelmezi A kernel lefordításához fájlokat generál – A fordításhoz szükséges make(1) fájlokat – C forrás és header fájlokat

config(9) példa /usr/src/sys/conf/files # DM9000 Ethernet controllers # device dme: arp, ether, ifnet file dev/ic/dm9000.c dme

config(9) példa /usr/src/sys/arch/evbarm/conf/files.devkit8000 # on-board DM9000 # attach dme at gpmc with dme_gpmc file arch/evbarm/devkit8000/if_dme_gpmc.c dme_gpmc

config(9) példa /usr/src/sys/arch/evbarm/conf/DEVKIT8000 include "arch/evbarm/conf/files.devkit8000" # DM9000 Ethernet (requires omapgpio0) dme0 at gpmc? addr 0x2c intr 121

Hibakeresés Lehetséges hibák: – NULL pointer dereference – NULL function pointer dereference – Egyéb memóriavédelmi hibák – panic() (általában szándékosak) – KASSERT (csak DIAGNOSTIC módban) – Deadlock

Kernel opciók fejleszőknek DIAGNOSTIC – Konzisztencia ellenőrzés (KASSERT és társai) – Kb 15% lassulást okoz! LOCKDEBUG – Mutexek és CV-k használatának ellenőrzése – SMP rendszereken lassú lehet! DEBUG – Hibakereső kódrészek bekapcsolása

ddb, a kernel debugger i386-on Control-Alt-Esc, vagy panic-nál sysctl-lal állítható a működése – ddb.onpanic Whether to enter ddb on a kernel panic – ddb.fromconsole Whether ddb can be entered from the console – ddb.tee_msgbuf Whether to tee ddb output to the msgbuf – ddb.commandonenter Command to be executed on each ddb enter

ddb parancsok trace vagy bt – Stack trace kiírása – /l kapcsolóval mentés dmesg-be sync – Memory dump kiírása és újraindítás reboot – Újraindítás dump nélkül

ddb parancsok show registers – A CPU regisztereinek kiírása x/i 0x0000 – 0x0000 címen lévű utasítás assembly-jének kiírása – A cím lehet függvény neve is. continue – végrehajtás folytatása (panic után értelmetlen)

ddb parancsok ps – A (panic előtt) futó processek listázása break 0x0000 – Breakpoint a 0x0000 címen (a cím lehet fv neve)

Példa egy egyszerű driverre struct prcm_softc { device_t sc_dev; bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; bus_addr_t sc_base; bus_size_t sc_size; }; /* for external access to prcm operations */ struct prcm_softc *prcm_sc; /* prototypes */ static int prcm_match(device_t, cfdata_t, void *); static void prcm_attach(device_t, device_t, void *); /* attach structures */ CFATTACH_DECL_NEW(prcm, sizeof(struct prcm_softc), prcm_match, prcm_attach, NULL, NULL);

static int prcm_match(device_t parent, cfdata_t match, void *aux) { struct obio_attach_args *obio = aux; if (obio->obio_addr != OBIOCF_ADDR_DEFAULT) return 1; return 0; }

static void prcm_attach(device_t parent, device_t self, void *aux) { struct obio_attach_args *obio = aux; prcm_sc = device_private(self); prcm_sc->sc_dev = self; prcm_sc->sc_iot = &omap_bs_tag; prcm_sc->sc_base = obio->obio_addr; prcm_sc->sc_size = OMAP2_PRM_SIZE; /* map i/o space for PRM */ if (bus_space_map(prcm_sc->sc_iot, prcm_sc->sc_base, prcm_sc->sc_size, 0, &prcm_sc->sc_ioh) != 0) { aprint_error("prcm_attach: can't map i/o space"); return; } aprint_normal(": Power, Reset and Clock Management\n"); }

static uint32_t prcm_read(bus_addr_t module, bus_addr_t reg) { return bus_space_read_4(prcm_sc->sc_iot, prcm_sc->sc_ioh, module + reg); } static void prcm_write(bus_addr_t module, bus_addr_t reg, uint32_t data) { bus_space_write_4(prcm_sc->sc_iot, prcm_sc->sc_ioh, module + reg, data); }

void prcm_cold_reset() { uint32_t val; val = prcm_read(OMAP3430_GR_MOD, OMAP2_RM_RSTCTRL); val |= OMAP_RST_DPLL3; prcm_write(OMAP3430_GR_MOD, OMAP2_RM_RSTCTRL, val); }

Házi Feladat ;-) bsd/index.html 44bsd/index.html A példa program: A prezentáció letölthető PDF formátumban az alábbi helyről: