Minua kiinnostaisi tietää kuinka lukea (ja syöttää) dataa suoraan raudasta tai kuinka lähelle sitä päästäänkään ja minkälaisia vaatimuksia alkaa syvemmällä olla.
Esimerkkinä näytönohjain, verkkokortti ja äänikortti. Näiden käsittelyyn arkielämässä käytetään kirjastoja jotka parhaimmillaan käyttävät allaan monimutkaisempia kirjastoja. Mutta mitä tapahtuu siellä syvällä ja kuinka päästä käsiksi sinne? Onko esimerkiksi mahdollista lukea näytönohjaimen muistista ruudun tilaa tai suoraan verkkokortista liikkuvaa dataa? Voiko tämän tehdä C(++):lla vai täytyykö menna ASM:n asti?
Lopuksi haluan sanoa että en todellakaan ole tekemässä "virusta", vakoilu- tai muuta haittaohjelmaa tai ylipäätään mitään joka haittaisi / vahingoittaisi muita käyttäjiä / koneita. Ilkivalta on tyhmää niin sähköisessä kuin irl muodossa.
On mahdollista. C++ taitaa olla korkeimman tason kieli, jolla voi käsitellä tälläisiä jutskia, tai siis en ainakaan itse ole kohdannut esimerkiksi python mikrokontolleria. Laitteisojen dataa on nykyään käyttöjärjestelmien takia todella vaikeaa muutella itsellään, mutta mikrokontollerien lisäily taktisiin paikkoihin mahdollistaa tämänkin. Voit toki tutustua linuxin muokkailuun, joka mahdollistaa sen laitetason muuttelun.
Kiitos vastauksesta. Avainsana siis mikrokontrolleri. Tuli mieleen tässä että esimkerkiksi printteri/muun yksinkertaisen portin manipulointi voisi mahdollistaa näppärästi pienten elektronisten laitteiden kytkemistä tietokoneeseen. Puhuit "muuttelusta", tarkoitatko siis että kirjoittaminen on vaikeaa? Jos näin entä lukeminen?
x86-arkkitehtuurissa laitteiden kanssa keskustellaan usein numeroitujen porttien kautta (port I/O). Lisäksi laitteet voivat pyytää huomiota laukaisemalla keskeytyksen (IRQ). Tässä tavassa on yksi suuri heikkous, nimittäin prosessori on varattuna koko ajan. Tehokkaampi ratkaisu suurten datamäärien siirtoon on, että porttien kautta siirretään vain pieni määrä hallinnollista dataa (esim. "lue levyltä megatavu tuonne") ja suurin osa siirretään suorempaa reittiä keskusmuistin ja laitteiden välillä (DMA), jolloin prosessori voi siirron aikana tehdä jotain muuta. Vielä yksi kommunikointitapa on, että tietyt muistiosoitteet osoittavatkin laitteiden (erityisesti näytönohjaimen) sisäiseen muistiin, jolloin keskustelu tapahtuu tavallisten muistioperaatioiden tavoin (MMIO).
Nykyaikaiset käyttöjärjestelmät luonnollisesti estävät laitteiden suoran käytön, koska muutenhan mikä tahansa ohjelma voisi (vahingossa tai tahallaan) käyttää laitteita mihin tahansa ja jopa vahingoittaa niitä.
Parhaiten laitteisiin pääsee käsiksi tekemällä oman laiteajurin johonkin järjestelmään tai kokonaan oman käyttöjärjestelmän. Luultavasti esim. sarjaporttia tai rinnakkaisporttia käyttäviä ajureita löytyykin valmiiksi monille järjestelmille. Uudemmat portit (kuten USB) toimivat yleensä niin paljon mutkikkaammin, että jokin valmis kontrolleri lienee käytännössä välttämätön.
Analogista signaalia voi yrittää siirtää myös kuuloke- ja mikrofoniliitäntöjen kautta. ;)
Siis sanoin muuttelu, koska sekaantuminen on vaikeaa, lukeminen helppoa, sanan sekaantuminen käyttö sekoittavaa. Esimerkiksi Linuxista voit ottaa lukemisen ja tulostaa sen sellaisenaan, ajuria muuttamalla siten, että raakadata lähetetään jonnekin ja sitten käsitellään.
Ja mitähän ihmettä se Jokotai taas yrittää sanoa? Kirjoittaminen ja lukeminen ovat teknisesti aivan yhtä helppoja, eikä ongelma yleensä olekaan näissä perusasioissa vaan siinä, mitä laitteelle pitää sanoa ja miten niitä laitteen vastauksia tulkitaan.
Ja alkuperäiseen kysymykseen vielä: Esimerkiksi näytön tilan lukeminen silloin, kun toimitaan ilman erillisiä ajureita perinteisissä VGA-tiloissa (esim. 80x25 merkkiä tekstiä tai 320x200 pikseliä), tapahtuu yksinkertaisesti lukemalla ja kirjoittamalla muistia osoitteesta 000A0000 alkaen.
Siis teknisesti juu, mutta silloin pitää todellakin tietää, mitä tekee.
Noniin kiitos selvityksistä =) Eiköhän tällä päästä jo eteenpäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.