Hardverek programozása, hogyan?
2010-10-25T08:10:16+02:00
2010-10-27T18:42:05+02:00
2022-07-24T22:22:28+02:00
  • Ha indítod a gépet, akkor először a BIOS indul el. Ez elvégez pár ellenőrzést, kiír pár dolgot a képernyőre, majd a BOOT sorrentnek megfelelően az első eszközről megkísérli betölteni a boot rekordot (vagy mit), és ennek átadja a vezérlést.

    Ez az a pont, ahol indul a floppy lemez, vagy a HDD.
    Betölti a rekordot, elindítja. Ezután az operációs rendszer dolga, hogy mit csinál. Ha akarja később még használhatja a BIOS eljárásait, de nem kötelező, megcsinálhat mindent maga is.

    Bármi fut, végülis bekerül a program a memóriába, onnan az utasítás a processzorba. Mindegy, hogy a program honnan fut, ez a BIOS vagy bármi más.

    A "közös nyelv" meg a gépi kód. A processzor csak gépi kódú utasításokat tud végrehajtani. Hogy ezt a kódot hogyan állítod elő, az a te dolgod. Az Assembly csak az egyik lehetőség (igaz, talán a legjobb).
    Mutasd a teljes hozzászólást!
  • Hali!
    "kéne lennie egy közös nyelvnek"
    Nem akarok nagyon beleokoskodni, mert még nagyon kezdő vagyok hardver közeli programozásban, de nemrég én is valami hasonlót kérdeztem a "Számítógép programozása" című topicban.
    Nekem a megoldást az assembly nyelv jelentette.
    Ha gyakorlati szempontból szeretnéd megközelíteni a kérdést, nézz utána az assembly programozásnak.
    Mutasd a teljes hozzászólást!
  • bocs
    Mutasd a teljes hozzászólást!
  • Ok, máris megyek magolni.

    Egyébként én ezt sokkal érdekesebbnek találom, mint a mai csilli-villi fejlesztőrendszerekben 10 klikk alatt megváltani a világot. Engem mindig is érdekeltek a miérteknek a miértjei, főleg a hardver működésében/programozásában. És szerintem ezt a gyermeki énemet már sosem fogom kinőni.
    Mutasd a teljes hozzászólást!
  • Igen te. Ha már tévedésből neked címeztük a választ.
    Mutasd a teljes hozzászólást!
  • "Ülj le és kezdd el megtanulni az alapokat,..."


    Én???
    Mutasd a teljes hozzászólást!
  • "És akkor még stack kezeléséről valamint interrupt letiltásról nem is beszéltünk. Az megszakítás-maszkolásról pedig még egy hangot sem ejtettünk...
    Meg a többi egyéb dologról, pl. amikor a megszakítás megszakítódik...."


    Én mondtam, hogy nagyon-nagyon leegyszerűsítve mutatom be a folyamatot.

    "Nekem az a véleményem, ne az egészet akard egyszerre megtanulni."

    Nem én akarom megtanulni, hanem vekkerlaszlo.
    Mutasd a teljes hozzászólást!
  • tl;dr: Ülj le és kezdd el megtanulni az alapokat, kemény munka nélkül nem fog menni.
    Mutasd a teljes hozzászólást!
  • És akkor még stack kezeléséről valamint interrupt letiltásról nem is beszéltünk. Az megszakítás-maszkolásról pedig még egy hangot sem ejtettünk...
    Meg a többi egyéb dologról, pl. amikor a megszakítás megszakítódik....

    Nekem az a véleményem, ne az egészet akard egyszerre megtanulni. Vegyed külön-külön a részegységeket, és mikor már ismersz jópárat akkor próbáld meg összeilleszteni a dolgokat egybe. Szerintem akik tisztában vannak a számítógép működésével ezt a módszert követték.
    Mutasd a teljes hozzászólást!
  • Annak érzékeltetésére, hogy milyen fába vágtad a fejszéd, bemutatok egy elméleti folyamat lépéseit, amiből jól látszik majd, hogy egy apró kis változás mennyi háttérművelet jól összehangolt működését követeli meg.

    Legyen az a feladat, hogy kövessük végig azt, hogy mi történik akkor, ha az egeret mindössze egyetlen pixellel arrébb mozdítod. Ehhez tételezzük fel, hogy nem fut semmilyen olyan program, amely figyelné az egér változását, és az egérkurzor új pozíciója sem jár következményként egyéb más művelet végrehajtásával.

    1) Elmozdítod az eredet 1 pixellel balra.
    2) Az egér elektronikája észleli a változást.
    3) A változásról értesíti a hardvert, azaz egy megszakításkérelemmel fordul a rendszerhez.
    4) A megszakításvezérlő észleli, hogy egy periféria (ezesetben az egér) megszakítást kért tőle.
    5) A megszakításvezérlő a saját kis listájába beilleszti ezt a kérést, mint eseményt.
    6) A megszakításvezérlő "megböki" a CPU-t jelezve, hogy egy új megszakítás érkezett.
    7) A CPU észleli ezt, így abba hagyja az éppen futtatott program végrehajtását.
    8) A CPU kiolvassa az IVT-ből (valós módban Interrupt Vector Table) vagy az IDT-ből (védett módban az Interrupt Descriptor Table) annak a rutinnak az adatait, ami a kapott megszakítás-számhoz tartozik (a megszakításszám ezesetben az egérhez tartozik).
    9) Az adatok alapján átadja a vezérlést ennek a rutinnak, vagyis a CPU mostantól nem a programmal foglalkozik, hanem ennek a rutinnak a futtatásával.
    10) A rutin az IN utasítással lekérdezi az egér port-járól az új adatokat (merre történt változás, és mennyi, illetve melyik gomb lett lenyomva). Figyeld meg, hogy maga a rutin tudja, hogy neki az egérrel kell foglalkoznia, a CPU ebből mit sem sejt, ő csak végrehajtja, amit rábíztak.
    11) A rutin kiszámítja az új kurzorpozíciót és státuszt az egértől érkező adatok alapján.
    12) A rutin megszólítja azt a grafikus rutint, ami az egérkurzor áthelyezésére való, és átadja neki az új koordinátákat.
    13) A CPU mostantól az egérkurzor-rajzoló rutint futtatja.
    14) Ez utóbbi rutin megszólítja a videokártyát a rá vonatkozó port-on néhány OUT utasítással, melyben így "közli vele", hogy az egérkurzornak mi az új koordinátája.
    15) A videokártya leradírozza a régi, már érvénytelen helyre rajzolt kurzort, és kirajzolja az újat.
    16) A videokártya kezelő rutin közben megvárta, amíg a videokártya elvégzi a dolgát (váró hurokban figyel egy jelzésre IN utasításokkal egy adott port-on).
    17) A videokártya egérkurzor-rajzoló rutinja ezzel befejezte a dolgát, és egy RET utasítással jelzi a CPU-nak, hogy készen van.
    18) A CPU a RET hatására visszatér a megszakítási rutin futtatásához, azon belül is ott folytatja tovább, ahol előzőleg abba hagyta.
    19) Most a megszakítási rutin azt csinálja, hogy szól az operációs rendszernek is, őt is értesítve a változásról.
    20) Ezt az OS egy rutinjának meghívásával teszi meg, ami feljegyzi magának, hogy egér-esemény következett be. A feljegyzést követően ő is egy RET-tel tér vissza az őt hívóhoz (ami ugye a megszakítási rutin volt).
    21) A CPU ismét a megszakítási rutint futtatja tovább.
    22) A megszakítási rutin befejezte a dolgát, amiről 2 dolgot is értesítenie kell.
    23) Először értesíti a megszakításkezelőt egy jól irányzott OUT utasítással, ahova kiküld neki egy EOI (End Of Interrupt) értéket.
    24) Ennek az EOI jelnek hatására a megszakításvezérlő tudomásul veszi, hogy most már nem kell várakozva gyűjtögetnie a közben érkező megszakításkérelmeket, hanem most már ismét lehetősége van egy ilyen újabb kérelem teljesítésére (azaz mostantól újra szólhat a CPU-nak).
    25) Másodszor pedig a megszakítási rutin értesíti a CPU-t egy IRET utasítással, hogy részéről a küldetése bevégeztetett.
    26) Ennek az IRET-nek hatására a CPU visszatér az éppen futtatott (pontosabban a félbe hagyott) program futtatására.
    27) Egy másik szálon futó rutin megnézi, hogy az OS eseménygyűjtőjébe érkezett-e valami új hír.
    28) Megtalálja az előzőleg bejegyzett egér eseményt, és kiveszi a listából.
    28) Miután kivette, szépen sorban minden futó programnak küld egy üzenetet, jelezve ezzel nekik is az egéreseményt. (Ezt hívják rendszer-hook-nak.)
    29) Mivel nem talál egy olyan programot sem, akinek átadhatná az egéreseményt, így végül nem történik semmilyen egyéb művelet.
    30) Innentől kezdve (mivel a folyamat befejeződött) az egész kezdődhet elölről...

    Nos, nagyon-nagyon leegyszerűsítve (itt-ott az egyszerűség végett eltorzítva) nagyjából ennyi, azaz 30 lépés csak az, ha az egeret egyetlen pixellel arrébb mozdítod. Durva mi?

    Szerk.:
    Mindebből 2 tanulság vonható le:
    1) Talán így már érthető, miért kell a több 100MHz-es (vagy akár több GHz-es) órajel a CPU-hoz. Így már látszik, hogy iszonyú sok munka van csak a legapróbb változás teljesítésével is.
    2) Figyeld meg, hogy a CPU mindig minden esetben csak és kizárólag IN/OUT utasításokkal tartotta a kapcsolatot a perifériákkal. Eközben a CPU-nak fogalma sem volt róla, mit csinál, hiszen nem a CPU tudja mit csinál, hanem a program (szoftver), ami parancsol neki. Ugyanígy a CPU nem tudja, milyen hardverrel beszélget, ő csak azt tudja, hogy fogadnia (IN) vagy küldenie (OUT) kell adatot, de azt már nem tudja, minek küldi, azt meg végképp nem, mi lesz a mozgatott adat sorsa, vagy hogy egyáltalán mire szolgál az.
    Mutasd a teljes hozzászólást!
  • Huh, hát rendesen kevered a szezont a fazonnal, de az tetszik, hogy nem adod fel egy könnyen, mivel pont olyasmit akarsz megtanulni, ami kitartás nélkül lehetetlen lenne.

    Azt mondom, hogy első lépésként tanulmányozd át ezt a cikksorozatot: Az x86 architektúra
    Ehhez nem kell messzire menni, itt van a Prog.Hu-n, magyarul. Olvasd át, és próbáld megérteni. Ha közben valahol elakadsz, kérdezz rá nyugodtan, de minden kérdéskor írd meg, hogy a cikksorozat melyik részén tartasz (könnyebb lesz belőle megtudnunk, mi az, amit nem értesz). Itt is nagyon fontos, hogy szánj rá elég időt, türelmesen olvasd el és ha kell, egy-egy mondatot többször is.

    A kérdésedre válaszolva:
    "De akkor kéne lennie egy közös nyelvnek..."

    Nem közös nyelv van, hanem közösen, azaz minden hardver által betartandó szabályrendszer, amelynek segítségével kommunikálni tudnak egymással. Ha elolvasod a fenti cikket, akkor (remélhetőleg) tudni fogod, mik ezek a szabályok.
    Mutasd a teljes hozzászólást!
  • Én feladtam.:))
    Mutasd a teljes hozzászólást!
  • Nem.
    Proci a kernel alapján vezérli az interface IC-ket, PCI vagy más buszokat,számol, stacket, memóriát kezel stb. semmi mást.
    Bonyolult.
    Mutasd a teljes hozzászólást!
  • Ha már így szóba jött, akkor nem halaszthatom el, meg kell hogy kérdezzem. Szóval akkor mikor bekapcsolod a gépet, oprendszer nélkül eljut odáig nálam, hogy egy fekete háttéren egy alulvonás villog a bal felső sarokban. Ha pl, Dos-os időkre emlékezve lemezről bootolnék, akkor a lemezen lennének utasítások a BIOS-nak. Ha jól gondolom. Tehát a lemez először a BIOS-sal lépne kapcsolatba és utána a BIOS-os beépített utasításokon keresztül működne, mondjuk a copy parancs.?
    Mutasd a teljes hozzászólást!
  • A CPU csak olyan utasítást adhat a videokártyának (a DOS-os időkben így volt, ma már lehet másabb a helyzet), hogy pl. a 53-as regiszterbe írjon 134-et. Vagy a 20-as regiszter értékét beolvassuk. Külön utasítással ezt növeljük, majd harmadik utasítással visszaírjuk.
    Ezen kívül még elérheti a video memóriát (DOS alatt 64/128K-s részt belőle). Tehát írhatsz egy számot, vagy olvashatsz.

    Ennyi.

    A hardver (videokártya) úgy van megépítve, hogy például a 20-as port mondja meg, hogy milyen felbontást használsz. (Valójában sok regiszter mondja meg.) A hardver így mindíg úgy rakja össze a képet, ahogy a 20-as regiszterben lévő számérték alapján kell (+video memória tartalma alapján). Ez a végrehajtás hardveres megoldás, nem program. Hogy a 20-as regiszter hogy kap értéket a videokártyát nem érdekli.

    A programod (illetve a Windows/Driver) feladata, hogy tudja, hogy milyen típusú a videokártya, és hogy melyik regiszter mit csinál. Ha nem tudja, akkor "semmit" nem tud kezdeni vele, vagy csak olyan dolgokat, ami minden típúson ugyanúgy működik (lásd: szabványos VGA driver).
    Okos hardverek valami információt adnak magukról, amiből az oprendszer felismerheti őket, és ha van hozzá driver akkor rögtön kezeli is. Ha nem ismeri fel akkor meg ismeretlen eszközt jelez, kéri a telepítő lemezt. A lemezen lévő program meg tudja hogy hogy működik a hardver (hisz a gyártó adja), közli az oprendszerrel hogy mi ez, mi a neve stb.

    Más hardvernél is a gyártó leírja, hogy hogy működik, melyik regiszter/port mit csinál. A programozó meg ez alapján tudja programozni.
    Így tényleg bármilyen hardvert lehet építeni a géphez (nem csak PC-hez).

    Drivert írni amúgy nem nehéz. Windows/Linux alá talán az, de DOS alá könnyen készíthet bárki egy alap felületet amin keresztül a programok kezelhetik a hardvert.
    Régen nagyon jó leírások voltak például a videokártyákhoz, így nem okozott nagy gondot házilag programozni. Ma ilyen leírást nem kapsz sajnos, de ha lenne akkor szintén könnyű lenne programozni (nehézséget a 3D gyorsítás bonyolult programozhatósága okozhatja).
    Igasság szerint a hardvert közvetlenül is lehet programozni, nincs szükség driverre, még operációs rendszerre sem. Ezek csak megkönnyítik az ember dolgát, de nem nélkülözhetetlenek.

    De a lényeg, hogy a processzorban bővel elég ha az IN/OUT utasítások szerepelnek (már vagy 35 éve ha nem több), ezekkel bármit programozhatsz.

    ui: megjegyzem a régebbi processzorokban olyan "alap" utasítások sem voltak, hogy szorzás vagy osztás, ezeket a programozónak kellett több tíz-száz assembly utasítással megvalósítani. Ennyire "buta" procikat gyártottak, hogy tényleg csak a szükséges alap utasításokat tudja. De ez elég is volt.
    Mutasd a teljes hozzászólást!
  • Igen. A te hozzászólásodra szerettem volna írni, amit írtam. Elnézést.
    Mutasd a teljes hozzászólást!
  • Ezt biztos, hogy ptiszainak szántad, és nem nekem? Mert a példát az én hozzászólásomból hoztad, de a hozzászólásod neki intézted. Most akkor ki válaszoljon?
    Mutasd a teljes hozzászólást!
  • Na szóval. Előre meghatározott szabályokon keresztül komunikál a CPU a többi perifériával. Tehát teszem azt a CPU kiad egy valamilyen utasítást a videokártya portjára, hogy fekete háttér szürke betü bal felső sarok. Tehát akkor ez egy bitekben számolva egy rakás 0, meg 1-es. Ezt fogadja a videokártya és utána tudni fogja hogy fekete háttés szürke betű bal felső sarokba rakja a betüt. De akkor kéne lennie egy közös nyelvnek, amit a CPU és a videokártya közösen megért, különben honnan tudná a videokártya mit kell csinálnia. Valamit a CPU-nak is tudnia kell a videokártyáról. Kérlek magyarázd el.
    Mutasd a teljes hozzászólást!
  • Ha hiszed, ha nem, az a baj, hogy te a számítógép belső működését eleve rosszul fogod fel. Te azt hiszed, hogy a gép belül nagyon intelligens eszköz, melynek mindenhez meg van a saját módszere, amivel működteti a dolgokat, és emiatt te ezeket a módszereket keresed, hogy például a hálókártyát irányíthasd. Nos, ez hiba, mert ez nagyon nem így van.

    A valóság az, hogy a számítógép belső arhitektúrális felépítse úgy van megtervezve, hogy az valami hihetetlenül buta egy jószág, ami tényleg csak azt tudja, ami éppen csak hogy elég ahhoz, hogy működni tudjon. Ezt úgy fogd fel, hogy a gép belül nem speciális hardverek mindegyikére van felkészítve (nem okos, nagyon nem), hanem csak egy amolyan univerzális eszköz, mely csak a legalapvetőbb dolgokat tudja, de ezekkel minden hardver illeszthetővé válik.

    Tehát eleve rosszul fogod fel a dolgot. Mutatok egy képzeletbeli (nem valós, de a dolgot jól szemléltető) példát.

    Te így fogod fel:
    nvidia_8800gt_szoveges_mod_keptorles [80x25] [fekete_hatter] [szurke_betu] [kurzor_a_bal_felso_sarokba]


    Vagyis te azt gondolod, hogy a CPU-nak van ilyen utasítása, ami az nVidia 8800GT kártyákon, szöveges módban törli a képernyőt. Na ilyen nincs. Mert emiatt mindenféle videókártyához léteznie kellene külön utasításnak, ráadásul a egyes utasításoknak "tudniuk kellene", hogy a hozzájuk tartozó hardverben miként lehet a feladatukat megoldani. Most képzeld el, hogy hányféle videókártya létezik, hányféle módon programozható, azoknak hányféle korlátaik vannak, és még ezt szorozd meg azzal, hogy hányféle műveletet kell tudni elvégezni vele (mert ugye nem csak képernyőtörlés van). Irdatlan sok utasítása lenne így a CPU-nak csak a videókártyák kezelésére is, és ugye millió kütyü van, nem csak videókártya. Vagyis logikus, hogy ez így kivitelezhetetlen.

    Ráadásul mi van, ha egy új hardvert (mondjuk új videókártyát) teszel a gépbe, amihez a CPU még nem tartalmazza a rá specializált utasításait? Na ilyenkor mi van? Talán frissíteni kellene hozzá a CPU mikrokódját? Hát ez azért már elég abszurd lenne...

    Nem, nem, nem! A dolog egészen máshogy működik. A CPU-nak nincs egyetlen egy olyan utasítása sem, amivel egy adott hardvert programozni lehetne (ezért nem találsz ilyet a Google-ben sem). Csak olyan utasítása van, amivel mindössze arra alkalmas, hogy megszólítsa a hardvert (IN/OUT), de ez buta, mint a főd', mert csak arra alkalmas, hogy "kikiabáljon" a paraméterül megadott port-ra, de a CPU-nak ettől még halovány lila gőze sincs róla, hogy az adott port mögött milyen hardver csücsül. Maga a hardver (mondjuk valamilyen hálókártya, videokártya, hangkártya) az, ami "tudja", hogy ha őt megszólítja a CPU egy adott porton, akkor ott ő mit tud nyújtani, vagy mit szeretne fogadni.

    Ez a nagyon buta, triviálisnak tűnő hozzáállás egyben azt is jelenti, hogy a lehető leguniverzálisabb megoldás, azaz ilyen módszerrel (mivel a CPU nem tudja, mivel kommunikál) bármilyen hardver illeszthető a rendszerbe. A dolog kulcsa abból fakad, hogy a CPU szemszögéből nézve minden létező hardver, amit IN/OUT utasításokkal ér el (azaz nem memória, mert az címezve éri el ugye), az mind-mind perifériának számít, azaz egy külső eszköznek, aminek a működéséhez a CPU-nak az ég világon semmi köze sincs. És igen, ez így nagyon nehézkesnek tűnik, de hidd el, ez adja a legtöbb szabadságot arra, hogy elvileg akármilyen hardvert illeszteni lehessen egy géphez annélkül, hogy emiatt magát a gépet architektúrális szinten buherálni kellene.

    Szóval az itt az igazi baj, hogy eleve nem is érted még a gép elméleti működését sem, csak feltételezel magadnak valami egyszerű dolgot, amivel könnyen bármit megoldhatsz, csak hát csodálkozol, hogy nem találod a Google kereséssel az egyszerű megoldást.

    Azt tanácsolom, hogy előbb mindenképpen értsd meg legalább a számítógéped működési elvét, és akkor rájössz, hogy teljesen máshogy zajlik minden, mint ahogy eddig te ezt elképzelted. Vagyis a továbbiakban ne konkrét kérdésre keress egyszerű megoldást (mert úgy, ahogy te elképzeled úgy nem létezik megoldás), hanem magának a működési elvnek a kérdéseivel foglalkozz, és ha ebben valami nem tiszta, akkor kérdezd meg bátran, sokan fognak segíteni. Ha kell, következő hozzászólásomban írok egy rövid (tényleg rövid) elméleti magyarázatot a rendszer működési elvéről. De csak akkor, ha ezt külön kéred, feleslegesen nem akarok gépelni.
    Mutasd a teljes hozzászólást!
  • pl. XP-nél kell neked DDK rendszer és SDK.
    DDK CD-t rendelni lehetett....
    Linux-nál minden meg van.
    Mutasd a teljes hozzászólást!
  • Hardvereken IC-k vannak.
    AZ IC-nek regiszterei.
    A kernel (hal) driver-ek az indításkor beállítják a regisztereket, és ha kommunikál pl. eth ic, akkor beállítja az adatoknak a DMA-t, beágyazza a virtuális memóriába.
    Stb.
    User SDK-val IOCTRL C fg. férsz hozzá a driver-hez.


    Nem egyszerű driver-t írni.
    Hardver ismeret a legtöbbször követelmény.
    Ezért főleg informatikus villamosmérnökök írnak komoly driver-t.
    Mutasd a teljes hozzászólást!
  • Az lenne a kérdésem, hogy hogyan vannak lekódolva a hardver?
    Tehát a processzornak vannak utasításai, amikben nincsenek közvetlen hardver vezérléses utasítások. Pl. hogyan működik egy hálózati kártya driver? Már volt hasolóról itt szó, amikor is azt írta valaki, hogy vannak erre utasítások, de nem találtam a googleba.
    Mutasd a teljes hozzászólást!
abcd