/dev/port avagy mire képes a Linux

Fórumok

Sziasztok!

A következő történt:

A suliban ültünk egy BackTrack2 -es gép elött és hirtelen nem tudtunk mit csinálni. Ekkor ráakadtunk a "/dev/port"-ra. Így első ránézésre nem tudtuk kitalálni, hogy mi is lehet az, hát egy "cat"-tal beleirányítottuk a "/dev/hda"-t. Ebben a pillanatban a gép újraindult, és a BIOS "CMOS CRC error"-t írt ki, majd az alapbbeállításokkal indult el (jelszó nélkül ;-) ).Ezek után kipróbáltuk beleirányítani a "/dev/urandom" -ot és a "/dev/zero"-t is. a gép mindkétszer lefagyot, és reset után ugyanúgy "CMOS CRC error".

Tudna valamelyikőtök magyarázatot adni erre?

Hozzászólások

Magyarázat: a rendszergazda azt csinál a géppel, amit akar. :)

A /dev/port főleg DOS/ASM programozóknak melegíti meg a keblét. Itt lehet IO utasításokkal felprogramozni a DMA vezérlőt, megmondani a hangkártyának hogy milyen mintavételes lejátszás/felvétel legyen, vagy a videokártyának hogy középre kéred az elektronnyalábot, amíg ki nem ég a foszfor a régi CRT-ből.

Szóval a lehető legalacsonyabb szintű hozzáférés az élethez, a világmindenséghez, meg mindenhez. Random dolgokat beleírva random dolgok történnek, random hardvereszközökön. :)

Simán beleírva a következő eszközökre küldesz ki 1-1 byte-ot, sorrendben:
http://bochs.sourceforge.net/techspec/PORTS.LST

Azért mert szép sorban írsz az IO portokra (0,1,2 ...). Amikor eléred a 0x70-es címet, akkor oda bekerül a CMOS memória címe. A következő kiírt adat a 0x71 címen ez előbb megadott címen kerül eltárolásra a CMOS-ban. A BIOS a CMOS-ban található adatokról ellenőrző összeget képez, ezért induláskor ez hibás lesz ("véletlen" címre 0x70, "véletlen" adat 0x71).

0x70 - Memória cím a CMOS-on belül
0x71 - A 0x70-en megadott CMOS memória adott tartalma

Okos otlet. Akkor toroltetni kellene az osszes forum temat es megkerni trey -t, hogy ha valaki postol egy uj temat, akkor egy bot arra automatikusan valaszolja azt,hogy google asshole.... Mert ugye 99% hogy a megoldast megtalalod a neten.
Az nem is lehetseges, hogy valakinek surgosen kellene egy info es inkabb kerdez, mint sem keresget? Vagy egyszeruen lusta (csak azt ne mond, hogy te nem vagy az). En is az vagyok :) minden ITs hajlamos a lustasagra :) Velem is sokszor elofordul, hogy eloszor kerdezek es kozben magam is megtalalom a megoldast, de en sem orulnek egy asshole valasznak.

--
http://laszlo.co.hu/

Lehet, hogy rosszul fogalmaztam, de az érdekel lényegében, hogy miért száll el a BIOS konfigja, ha bármiféle (elég hosszú) dolgot beleírok.

Kb a beleküldött 0x70-0x7F. byte környékén kezd izgalmas lenni a dolog, ott irkálsz mindenfélét a CMOS-ba: "0070-007F ---- CMOS RAM/RTC (Real Time Clock MC146818)"

Mivel IO szinten éred el az RTC-t, a te feladatod hogy módosítás után a CRC értékét is kiszámítsd, és ugyanígy frissítsd.

Ó igen! Gimiben így törtük meg a BIOS-jelszóval védett gépeket :). Ha jól emlékszem a 70-es és a 72-es port kell a CMOS-ban tárolt BIOS beállítások irásához / olvasásához. Ha egy byteot átírsz akkor rossz lesz a CRC és beenged jelszó nélkül.

[off]
Aztán csináltunk két BIOS konfigot! Az egyikkel 3-as sebességet mért a gépen valamelyik Norton Utility (ilyen van még? :) ), a másikkal meg 35-öst. Majd a hátsó sorban levő gépeken beállítottuk a 3-as konfigot, így mindig volt helyünk a gépteremben ... :)
[/off]

Ja es ha nem derült volna még ki: a /dev/ports úgy működik, hogy ha megnyitod, és beseekelsz egy adott helyre, ott olvasol vagy irsz egy byteot, akkor a seek-nek megfelelő hardware portot irod/olvasod ...

Akit érdekel, és akinek PS/2 -es billentyűzete van, az próbálja ki:

bill.sh:


#!/bin/bash

echo -ne "\xED" | dd of=/dev/port bs=1 seek=96 &> /dev/null ; echo -ne "\x00" | dd of=/dev/port bs=1 seek=96 &> /dev/null


while [ true ]
do
   echo -ne "\xED" | dd of=/dev/port bs=1 seek=96 &> /dev/null; echo -ne "\x01" | dd of=/dev/port bs=1 seek=96 &> /dev/null
   sleep 0.2

   echo -ne "\xED" | dd of=/dev/port bs=1 seek=96 &> /dev/null; echo -ne "\x04" | dd of=/dev/port bs=1 seek=96 &> /dev/null
   sleep 0.2

   echo -ne "\xED" | dd of=/dev/port bs=1 seek=96 &> /dev/null; echo -ne "\x02" | dd of=/dev/port bs=1 seek=96 &> /dev/null
   sleep 0.2
done

Futófény a Num-, Caps-, és Scroll-
lock ledeid
;-) (pedig ezt assembly-ben akartam megcsinálni még régebben... )