Professional Documents
Culture Documents
ZV kérdések
1. Mutassa be a μCOS-II operációs rendszer felépítését és főbb szolgáltatásait!
μCOS-II operációs rendszer felépítése:
-16 fájlból áll
- 3 fő csport:
1. Port fájlok: processzro függő fájlok lehetővé válik ezen felül platform
független
2. Platform független kód: ez az oprendszer magja
3. Konfig fájlok: alkalmazás függő konfigurációs fájlok
Prioritás öröklés
alapelve, hogy amennyiben egy taszk elkezd várakozni egy szemaforra, amelyet egy
alacsonyabb prioritású taszk birtokol, akkor az alacsonyabb prioritású taszk
prioritását időlegesen megemeljük a magasabb prioritású taszkkal megegyező szintre
eseményjelző flagek
o több bitnyi információ átvitelére szolgálnak
o bitek csoportja, amely az esemény bekövetkeztekor az eseménynek
megfelelő bit bebillen
o a taszkok az események tetszőleges kombinációjára várakozhatnak, egy
eseményre több taszk is
o az eseményeket törölni kell várakozás után
o hasonló a megvalósítása a szemaforhoz
mutex
o olyan bináris szemafor, amelyek védettek a prioritás inverzió jelenségével
szemben (jelen esetben prioritás örökléssel)
postaláda
o általában egy pointer méretű tároló
o több taszk is elhelyezhet benne üzenetet és több taszk is várakozhat rá
o a legnagyobb prioritású veheti ki az üzenetet vagy FIFO szabály is lehet
o hasonló a megvalósítása a szemaforhoz
várakozási sor
o többrekeszes postaláda
o a rekeszekben pointereket lehet tárolni
o tetszőleges számú taszk helyezhet el üzenetet, kivenni a várakozó taszkok
közül a legmagasabb prioritásúnak van joga
o üzenetek kivétele lehet FIFO, LIFO
o hasonló a megvalósítása a szemaforhoz
Elindulás folyamata
Linux betöltése:
1. kernelbetöltő végzi el: LILO (The Linux Loader), Grub, uBoot, LOADLIN…
2. Hardveres segitség kernebetöltönek x86 bios armnál bootstrap
3. kernelbetöltő kernel programot indítja el (kitömörít elindít)
4. Hw incializálás majd első c kód start_kernel() hívása
5. init kernel szál:
o fájl rendszer csatolása
o konzol
o getyy process->user login
Initrd és initramfs:
olyan állományok egy összetömörített állományrendszert tartalmaznak pl: live
disztribúciók
SysV init:
a kernel a kezdeti feladatainak végrehajtása után és a root állományrendszer
csatolása után elindítja az init programot, ami a további rendszer inicializálási
lépéseket teszi meg
o hálózati eszközök beállítása
o konzol konfigurálása
o USB eszközök inicializálása
o állományrendszerek ellenőrzése és felcsatolása
ezután következik a különböző szolgáltatások elindítása, virtuális konzolok és X
felület létrehozása
o ezeket /etc/inittab állomány alapján végzi el
az init program több futás szintet definiál
o futási szint egy konfigurációs összeállítás, amelyben összeállíthajtuk, hogy a
rendszer egyes állapotaiban milyen szolgáltatások fussanak és melyek nem
Jogosultságok az állományoknak
minden felhasználó rendelkezik egy egyedi azonosító számmal (uid) és
egy vagy több csoport azonosító számmal (gid) → /etc/passwd állományban van a
többi csoportazonosító az /etc/group állomány alapján rendelődik hozzá a
felhasználóhoz
rendszergazda (uid 0) mindenek fellett áll
Állományok 1 tulajdonos(állomány létrehozó) és 1 csoport(létrehozó csoportja)
azonosítóval rendelkeznek
Felhasználó és állomány között 3 féle kapcsolat lehet:
o owner (ő hozta létre hozzá fér)
o group (azonos csoportban van hozzá fér)
o others (eltér felhasználó és csoport azonosító nem fér hozzá)
minden relációra 3 féle jogosultsági engedélyt állíthatunk be
o olvasás
o írás
o végrehajtás (könyvtárak esetén ez a keresési jog)
ls –l : az állományokat és hozzájuk tartozó jogokat mutatja meg
o pl: drwxr-xr-x 2 root root 4096 Sep 23 23:24 dir1
Működése
valós idejű rendszer készítése
o yocto project-tel valósidejű Linux rendszert is készíthetünk
o ez a normál rendszertől csak a kernelben tér el, illetve hozzáadhatunk néhány
sw eszközt a valósidejű használathoz
létrehozott könyvtárak
o fordítás során a “build” egy tmp könyvtárat hoz létre:
cache: átmeneti állomány, amely gyorsítja a receptek elindítását
deploy: telepíthető csomagok és image állományok
pkgdata: a csomagok adatai
rootfs: teljes beágy rendszer esetén a root állományrendszer
stamps: elvégzett műveletek üres állományok létrehozásával könyveli
sysroots: keresztfordító körny. állományai, library+header fordításhoz
work: egyes csomagok lefordításához külön könyvtárak létrehozása
o fordításáhozés telepítő csomagok work könyvtáron :
temp: a scriptek (minden lépéshez) mellett a műveletek log állományai
forrás könyvtár: patch-elés, konfigurálás, fordítás ebben könyvtárban
image: fordítás végén a telepítést itt végzi el + telepítő csomag
összeválogatása
packages-split: minden telepítő csomaghoz létrehoz egy alkönyvtárat,
belemásolja az image könyvtárból a csomaghoz tartozó állományokat
staging-pkg: fejlesztői könyvtár fordításkor a keresztfordítói körny.ben
is szükség van mind a library, mind a header állományokra, ebben a
könyvtárban rendezi össze egy telepítő csomaggá
telepítés
o A beágyazott rendszer telepítéséhez az alábbi lépések:
A cél tároló eszközt partícionálnunk kell. Tipikusan egy partíciót kell
létrehoznunk rajta és be kell állítanunk Linux típusúra.
El kell készítenünk az állományrendszert a partíción.
Fel kell csatolnunk a partíciót.
A deploy/images könyvtárban található tömörített állományrendszer
állományt ki kell tömörítenünk a felcsatolt partícióra.
A konfig esetleges módosítása, majd a partíció lecsatolása.
o a kernel telepítése függ az architektúrától
keresztfordítás
o recept nélkül is lefordítható saját program, kézzel elvégezve a keresztfordítást
o sysroots könyvtár tartalmazza a programokat és a keresztfordító körny.:
Keresztfordító programok, Segédprogramok
Fejlesztői könyvtárak (library), Header állományok
Konfigurációs állományok a fordításhoz
o a fordító programok könyvtárneve függ a hoszt és a cél architektúrától
o egyszerűsíthető “environment” állományok legenerálásával, amelyek
tartalmazzák a szükséges környezeti beállításokat
tmp könyvtárban “environment-setup-...”
SDK készítése
o önálló, telepíthető SDK csomag létrehozására van lehetőség
o telepítés után képesek lesznek a keresztfordítások elvégzésére a teljes
rendszer nélkül
o generálás eredménye egy önállóan futtatható shell script a „tmp/deploy/sdk/”
könyvtárban: tartalmazza tömörítve a teljes csomagot is, önkitömörítő telepítő
töréspontok:
o a watchpoint olyan spec. töréspont, amely akkor állítja meg a programot, ha a
megadott kifejezés értéke változik
olvasás → awatch
módosítás → rwatch
o a catchpoint egy másik spec. töréspont, amely akkor állítja meg a program
futását, ha egy meghatározott esemény következik be, pl. exception:
Valgrind:
parancssoros program, eszközkészlet a következőkre:
o Memóriakezelési hibák felderítése
o Szálkezelési hibák felderítése
o Teljesítmény analízis
a programot egy virtuális processzoron futtatja
a virtuális processzor számos hibaellenőrzést végez
AddressSanitizer:
memóriakezelési hiba érzékelő C/C++ alkalmazásokhoz
valgrind-hez képest nagy előnye, hogy sokkal gyorsabb
nem virtuális processzoron futtatja, hanem programkódot egészíti ki hibakereső
algoritmusokkal
fordításkor „-fsanitize=address” paraméter szükséges
o nagyobb, speciális változat készül el, csak hibakereséshez célszerű
Folyamat létrehozása:
1. Mutex
2. Feltételes változó
3. POSIX Szemafor
Mutex:
o Kölcsönös kizárás megvalósítására
o Szemafor 1 kezdő értékkel, egy szál foglalhatja egyszerre
o Ha lefoglalt akkor más nem foglalhatja le
o Kritikus szakaszokban a memória bizonyos részeihez csak egy szál férhet hozzá.
o Fajtái: Gyors, Rekurzív, Hibakereső: lefoglalás utáni újbol lefoglaláskor a
viselkedésük eltérő.
o Létrehozás: pthread_mutex_init
o Felszabadítás: pthread_mutex_destroy
o Lefoglalás pthread_mutex_lock
o Elengedés: pthread_mutex_unlock
Feltételes változó:
o Ha bekövetkezik egy esemény arról tudunk jelzést küldeni a többi szálnak
o Szálak várakozhatnak a jelzésre
o Szinkronizálni kell őket Mutexel.
o Létrehozás: pthread_cond_init
o Felszabadítás: pthread_cond_destroy
o Jelzés küldés:
1 szálnak pthread_cond_signal
Több szálnak pthread_cond_broadcast
o Fogadás pthread_cond_wait
POSIX szemafor:
o Szálak és folyamatok között is tud múködni
o Névtelen: létrehozás sem_init, törlés sem_destroy
o Megnevezett: létrehozás sem_open zárás sem_close törlés sem_unlink
o Lefoglalás sem_wait
o Felszabadítás sem_post
16. A Linux alkalmazások determinisztikus futásidejének érdekében milyen
óvintézkedéseket kell megtennünk az alkalmazásunkban?
A valósidejű alkalmazások esetén alapvetően ugyanaz az API használható, kivéve, hogy a egy
valósidejű RT kernel lesz. A valósidejű működés alapfeltétele a determinisztikus (kiszámítható)
működés.
Socket:
A kommunikáció alapja (Berkely API)
Létrehozása a socket() fgv-el
Meghatározza a kommunikációs protokollt (UNIX,INET) és típust
(STREAM,RAW,SEQPACKET)
Cím megadása:
Szimmetrikus kommunikációnál nem server és client van, mindkét fél lehet küldő és fogadó
is.
Fogadás:
1. Socket létrehozása socket() fgv-el
2. Lokális cím megadása
3. Bind-olás
4. recvfrom al egyből fogadás, és megnézni ki küldte: recvfrom visszaadja hány byte
csomagot kapott, eltárolja a bufferbe és megadja honnan jött az információ
Küldés:
1. Socket lérehozása
2. Célgép cím összeállítása, hova kell küldeni a csomagot (ip címből lekérdezéssel)
3. Bind nem szükséges ha csak küldeni akarunk (Bind fogadásra)
4. UDP csomagként sendto-val adat elküldése
19. Milyen különbségek vannak a Linux kernel modulok és alkalmazások
között? (felépítés, fordítás, hibakezelés, további megkötések)
Kernel:
o Csak C vagy assembly nyelven készülhet (általában C, gyors rész assembly)
o esemény vezérelt, (nem szekvenciális) futás eseményekre lesz kész lekezelés. Main
fgv. helyett callback fgv.
o A kernelmodulok a kernelhez linkelődnek, így nincs hozzárendelve libc (stdio stb.)
ezért ezek a függvények nem használhatók, de hasonló szimbólumok vannak pl
printk.
o Include: csak linux vagy asm könyvtárak használhatók (libc: stdio stb nem!)
o névütközés: Szimbólumok exportálásánál figyelni kell a név megadására mert egy
függvény/változó név csak egyszer szerepelhet
o Kernelmodulok a fizikai memóriát használják, allokációval vigyázni (memory leak)
o Lebegőpontos számításokat ne használjunk
Különbségek:
o Hibakezelés: A kernelmodulban elkövetett hibák sokkal súlyosabbak, mint
alkalmazások esetén, a teljes rendszer is összeomolhat, alkalmazás esetén csak az
alkalmazás omlik össze
o Kernelben nincs korlátozás, alkalmazás korlátolt
o Kernel: Konkurencia problémák megszakítások vagy több processzor esetén
20. Hogyan implementálhatjuk a paraméter átadást a Linux kernel modulban?
Hogyan használhatjuk a mechanizmust?
A kernelmodul paraméterek az alkalmazásokkal ellentétben nem egyszerűen definiálhatók, külön
létre kell hozni őket.
○
21. Ismertesse az eszközvezérlő modellt a Linux rendszerben!
Eszközvezérlő modell
● legegyszerűbb szinkronizáció,
● gépi kód szinten egy utasításban valósul meg
● nincs veszély, hogy a művelet végrehajtása közben egy másik processzoron futó másik kód
hatással lesz a műveletünkre
● egyszerű műveletek, csak egész számokon értelmezett érték növelő/csökkentő/tesztelő és
bit műveleteket tartalmazhat
Ciklikus zárolás (spinlock)
● CPU-t terhelő ciklusban kísérletezik a zárolás megszerzésével mindaddig, amíg meg nem
szerezte
● csak rövid kritikus szakaszok esetén használjuk
● a ciklikus zárolással védett kritikus szakasz ne tartalmazzon sleep() fvt. holtponthoz
vezethet, rendszer lefagyáshoz
● a létrehozás és init egy lépésben egy makróval is lehet: static DEFINE_SPINLOCK(lock);
● lefoglalás: spin_lock
● felszabadítás: spin_unlock
Szemafor (semaphore)
● a megszakítás vonalak száma véges, ezért több eszköz között osztanak meg egy megszakítás
vonalat
● ebben az esetben a megszakítás kezelő fv regisztrációjánál jeleznünk kell az IRQF_SHARED
flaggel a megosztott használatot
Megszakítás kezelő fvek megkötései
● letiltás:
○ void disable_irq(irq);
● ismételt engedélyezés: void enable_irq(unsigned int irq);
● összes megszakítás tiltása, illetve engedélyezése:
○ void local_irq_enable();
void local_irq_disable();
○
24. Ismertesse a QNX alapvető architektúráját és az üzenetek segítségével
történő kommunikáció folyamatát!
● QNX Neutrino mikrokernel architektúrájú, sw busznak nevezi az oprendszer magját és a
hozzá kapcsolódó szolgáltatásokat
○ mikrokernel (QNX):
■ a hw felett egy vékony réteget tekint
az operációs rendszer magjának
■ központi swnek a feladata az
alapvető szolgáltatásokat biztosítsa:
memóriakezelés, processzekkel
kapcsolatos műveletek, processzek
közötti kommunikáció biztosítása
■ a rendszerszolgáltatásokat ugyanolyan swek (szerver sw-ek), mint a valódi
felhasználói programok
● QNX kernel szolgáltatásai:
○ szálakkal kapcsolatos szolgáltatások (POSIX threads)
○ jelekkel kapcsolatos szolgáltatások (POSIX signals)
○ üzenettovábbítási szolgáltatások
○ szinkronizációs szolgáltatások (POSIX thread-
synchronization)
○ ütemezési szolgáltatások (POSIX scheduling)
○ időzítő szolgáltatások (POSIX timer services)
○ folyamatok kezelésével kapcsolatos szolgáltatások
(process management)
● a kernel soha nem kerül ütemezésre, végrehajtására közvetlen
kernelhívás, kivételkezelés (exception) vagy hw megszakítás hatására kerül sor
● a teljes rendszer felépítése, alapszolgáltatásai POSIX szabvány szerint
● hasonló a UNIX-hoz, de inkább szolgáltatásokat, felületet (interface) definiál és nem a
rendszerek belső felépítését
○ előny: az alkalmazások hordozhatóak a kül. oprendszer verziók között, általános és
hasonló eszközökkel fejleszthető a rendszer, a fejlesztők tudása széles területen
hasznos, gyorsabb fejlesztési ciklus valósítható meg
Üzenetek segítségével történő kommunikáció