Přímý přístup do videopaměti

Jack Vykrmen

Přímý přístup do videopaměti
« kdy: 10. 12. 2016, 17:11:12 »
Lze nějak na dnešních moderních počítačích, založených na intel procesorech a grafických kartách zapsat přímo bajt do videopaměti?
Jako že bych zapsal v nějakém assembleru něco jako

mov ax,FFh :P
mov (ta adresa), ax  :-[

a že by mi to na monitoru nakreslilo čárku.
Nebo tečku, to fakt nevím, proto se ptám, vysvětlete mi někdo prosím, jak to v takhle naprostém základu funguje.
« Poslední změna: 11. 12. 2016, 17:23:35 od Petr Krčmář »


JmJ

  • ****
  • 315
    • Zobrazit profil
Re:adresa ve videopaměti
« Odpověď #1 kdy: 10. 12. 2016, 18:14:16 »
Pokud pouzijes OS, ktery ti to dovoli, tak by to samozrejme jit melo. Nevim, jestli linux/widle tohle umoznuji. Hardware to samozrejme zvladne (doufam ;-)). Dlouho jsem tyhle veci nedelal, ale pokud existuje jeste neco jako byval VESA bios, tak by se videopamet mela mapovat na nejakou adresu pameti a pokud budes mit moznost do teto pameti psat, tak proste zapises a hotovo. Pixel po pixelu.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:adresa ve videopaměti
« Odpověď #2 kdy: 10. 12. 2016, 18:27:34 »
Rekl bych, ze s ohledem na to, ze ty videokarty se prepinaji do ruznych rezimu, to mapovani urcite silne zavisi na zvolenem rezimu a zapisovani obrazu pixel po pixelu bez pouziti ovladace nebude takova sranda. Doba CGA uz davno minula.

Martin Dráb

Re:adresa ve videopaměti
« Odpověď #3 kdy: 10. 12. 2016, 20:09:27 »
Jak již bylo řečeno, záleží na konkrétním grafickém režimu. Začátek grafické videopaměti (asi) pro VGA režimy je namapován na fyzickou adresu $A0000 ($A000:$0 v reálném režimu např.). Pro textové režimy to bylo $B8000. Ale jak říkám, musel být nastavený správný grafický režim. Pro grafické režimy, u nichž reprezentace obrazovky přesáhla 64 KB se zápis dost komplikoval, protože bylo nutné přepínat jednotlivé 64 KB bloky (bank switching). Proto bývalo dost oblíbené rozlišení 320x200 a 256 barev, zejména v dobách, kdy byl reálný režim procesoru rozumně dosažitelný.

Pokud svůj kód hodíte do ovladače jádra, WIndows vám samozřejmě "dovolí" (ve skutečnosti je to vlastně procesor) shat na přímo na HW, ale není to dobré dělat, protože o takových přístupech systém neví a velmi snadno může dojít k chybám souběhu s dost nepříjemnými následky. Krom toho se nedá říci, že by se tyto (asi VGA) režimy dnes zrovna používaly...

Dalo se (to už asi byla věc VESA, v těchto označeních se moc nevyznám) dosáhnout i vyšších rozlišení (s rozumným počtem barev) a namapovat obrazovku na souvislý blok fyzické paměti, ale nebyla to zrovna triviální operace (návod už bohužel nemám, už je to tak 12 let).

Trident

Re:adresa ve videopaměti
« Odpověď #4 kdy: 10. 12. 2016, 20:25:57 »
Da. Kazda karta musi tahat s sebou kompatibilni kouli na noze jinak nelze nazyvat pocitac IBM PC kompatibilni. Posledni verze VESA mely i moznost vyuziti 2D akcelerace karet. Bylo budto mozne vyuzit megapomale sluzby biosu a nebo zapisovat primo(dnes uz tuto emulaci stejne resi zas bios/firmware grafickych karet) tak jak pises. Pokud je karta ve VGA nebo VESA kompatibilnim rezimu tak to funguje. Rezim kompatibility umoznuji s ruznym mnozstvim bugu i nejnovejsi karty.
Mozne to je, ale nejpohodlnejsi je nahodit si DOS a zkouset to v emulaci.  To za nasich mladych let nebylo a tlacitko reset bylo tvym kamaradem:) Na opicarny ze si napises modul jadra bych se zatim vykvajznul. V pripade takovych erotickych myslenek ale doporucuji prvne se mrknout na obecne fb moduly.


Pako

Re:adresa ve videopaměti
« Odpověď #5 kdy: 10. 12. 2016, 21:47:53 »
Pokud stačí že budeš malovat jenom v okně programu, pak OpenGL. Není to assembler, ale je to základní nízkoúrovňový přistup ke grafické jednotce.

kvr kvr kvr

Re:adresa ve videopaměti
« Odpověď #6 kdy: 10. 12. 2016, 22:46:23 »
Pristup do framebufferu je možný přes /dev/fb0 (fb1, ...). Nejjednodušší je device otevřít a namapovat do vlastní virtuální paměti procesu.

Viz google, tutorial například https://www.raspberrypi.org/forums/viewtopic.php?t=30720 , případně myslím psal nedávno zde i Pavel Tisnovsky. Bylo na Raspberry, ale debugger je všude stejný (tedy principy a device).

Jenda

Re:adresa ve videopaměti
« Odpověď #7 kdy: 11. 12. 2016, 02:21:22 »
Můžu se zeptat k čemu takovou věc plánuješ využít?

Jack Vykrmen

Re:adresa ve videopaměti
« Odpověď #8 kdy: 11. 12. 2016, 10:55:36 »
Tak dík za odpovědi. Já celkem nemám problém pomocí win32 API "namalovat" do okna cokoliv, ale to jde přes tu vrstvu API vnořenou do programu v C++ (můj případ).
Mě šlo o to, zapsat přímo - naprosto primitivně  :P - nějaké číslo do té videopaměti, a hned vidět výsledek. Měl bych z toho dobrý pocit.   :D  Nejde jen o to, aby to obecně šlo- na nějakém prehistorickém PC, protože nemám pro to nějaké praktické odůvodnění. Ale právě jak to udělat na víceméně současném dvoujádru (nebo vícejádru) a win7. Asi by to chtělo toho pana Tišnovského. Protože on by to dovedl pochopit i tak nějak "lidsky", sám určitě ví, co to je ld (16384),a   :)

Jerry

Re:adresa ve videopaměti
« Odpověď #9 kdy: 11. 12. 2016, 11:18:06 »
poslední OS typu windows, který to podporoval bylo Windows XP. Pak už ne. Pak už MS nasadil
i vlastní kernel ovladač pro grafiku. Pokud to chceš dělat pod WinVista/7/10 pak jedině
prostřednitvím DirectX pro Vista/7 a UWP/DirectX aplikace pro Win10. Vyzkoušet to ale de pod VMWare atd. kde máš puštěný XPčka a starší OS. Podle standardu VESA nastavíš videomod
o daném rozlišení a pak zapisuješ do paměťových bank po 64KB a a přepínáš je od čísla 0 do max.
Přímý zápis do celé video ram bohužel nejde. dělá se to přes paměťové roviny.

kvr kvr kvr

Re:Přímý přístup do videopaměti
« Odpověď #10 kdy: 11. 12. 2016, 17:48:35 »
Na windos to bude těžší, ale taky: https://msdn.microsoft.com/en-us/library/windows/desktop/bb205896(v=vs.85).aspx

Co se přepínání banků týče, to se používalo u Vesa 1.2 tak před patnácti lety naposledy. Pokud se bavíme o Dosu a Biosu, tak všechny karty ze současného století už umí Vesa 2, která je 32-bit a namapuje celou videopaměť.

borekz

  • ****
  • 492
    • Zobrazit profil
    • E-mail
Re:Přímý přístup do videopaměti
« Odpověď #11 kdy: 11. 12. 2016, 18:12:57 »
V Linux to jde přes directfb, jak tu už nikdo zmínil (/dev/fb0). Ve Windows to šlo řes DirectDraw, naposledy asi ve Windows 9x/Me.

McFly

  • *****
  • 560
    • Zobrazit profil
    • E-mail
Re:adresa ve videopaměti
« Odpověď #12 kdy: 11. 12. 2016, 18:40:51 »
ld (16384),a   :)

To byly časy u assembleru ZX Spectra (já tedy měl jen Didaktik) ;-)

JmJ

  • ****
  • 315
    • Zobrazit profil
Re:Přímý přístup do videopaměti
« Odpověď #13 kdy: 12. 12. 2016, 08:47:15 »
Jen k tem bankum ve VESA 1.2 - obecne se melo za to, ze bank ma 64KiB, coz ale nemusi byt vzdy pravda. Myslim, ze treba karty matrox mely banky mensi. Pokud si to dobre pamatuju, tak velikost banku se dala nekde vycist a navic jeste slo mit preplnuty jiny bank pro cteni a jiny pro zapis.

Boo

Re:Přímý přístup do videopaměti
« Odpověď #14 kdy: 12. 12. 2016, 09:56:49 »
V linuxu a Xwin by melo fungovat neco takoveho

Kód: [Vybrat]
printf "\x00\xFF\xFF\x00" | dd bs=4 seek=$((100 * 1024 + 200)) >/dev/fb0

Zapise zluty pixel na pozici x=200, y=100 za predpokladu, ze mas sirku desktopu 1024 pixelu.