PARTE 1
Per le modalità VGA vecchi, c'è un indirizzo fisso di scrivere l'area di memoria (legacy) del display. Per le modalità di testo questa area inizia da 0x000B8000. Per le modalità grafiche inizia a 0x000A0000.
Per le modalità video ad alta risoluzione (ad esempio quelle impostate dall'interfaccia VESA/VBE) ciò non funziona perché la dimensione dell'area di memoria di visualizzazione legacy è limitata a 64 KiB e la maggior parte delle modalità video ad alta risoluzione richiede molto di più spazio (ad es. 1024 * 768 * 32-bpp = 2,25 MiB). Per evitare che ci siano 2 metodi diversi supportati da VBE.
Il primo metodo è denominato "commutazione banca", in cui solo una parte della memoria di visualizzazione della scheda video viene mappata nell'area legacy in qualsiasi momento (ed è possibile modificare quale parte viene mappata). Questo può essere piuttosto disordinato - ad esempio, per disegnare un pixel potrebbe essere necessario calcolare su quale banco si trova il pixel, quindi passare a quel banco, quindi calcolare quale scostamento nel banco. Per peggiorare le cose, per alcune modalità video (es. Modalità video 24-bpp dove ci sono 3 byte per pixel) solo la prima parte dei dati di un pixel potrebbe essere in un banco e la seconda parte dei dati dello stesso pixel è in una banca diversa . Il vantaggio principale di questo è che funziona con l'indirizzamento della modalità reale, poiché l'area della memoria di visualizzazione precedente è inferiore a 0x00100000.
Il secondo metodo è denominato "FrameBuffer lineare" (o semplicemente "LFB"), in cui è possibile accedere all'intera area di memoria del display della scheda video senza alcuna commutazione disordinata. Devi chiedere all'interfaccia VESA/VBE dove si trova questa area (ed è tipicamente nel "buco PCI" da qualche parte tra 0xC0000000 e 0xFFF00000). Ciò significa che non puoi accedervi in modalità reale e devi utilizzare la modalità protetta o la modalità lunga o "modalità irreale".
Per trovare l'indirizzo di un pixel quando si utilizza una modalità LFB, si dovrebbe fare qualcosa come "pixel_address = display_memory_address + y * bytes_per_line + x * bytes_per_pixel". "Bytes_per_line" deriva dall'interfaccia VESA/VBE (e potrebbe non essere uguale a "horizontal_resolution * bytes_per_line" perché può esserci un padding tra le linee orizzontali).
Per "banca acceso" modi VBE/VESA, diventa qualcosa di più simile:
pixel_offset = y * bytes_per_line + x * bytes_per_pixel;
bank_number = pixel_offset/bank_size;
pixel_starting_address_within_bank = pixel_offset % bank_size;
Per alcune modalità VGA vecchi (ad esempio il 256 colori "modalità 0x13") è molto simile a LFB, ad eccezione non c'è padding tra le righe e puoi fare "pixel_address = display_memory_address + (y * horizontal_resolution + x) * bytes_per_pixel". Per le modalità di testo è praticamente la stessa cosa, tranne che 2 byte determinano ciascun carattere e il suo attributo, ad es. "char_address = display_memory_address + (y * horizontal_resolution + x) * 2". Per le altre vecchie modalità VGA (modalità monocromatica/2 colori, 4 colori e 16 colori) la memoria della scheda video è organizzata in modo completamente diverso. È diviso in "piani" in cui ogni piano contiene un bit del pixel e (ad esempio) per aggiornare un pixel in una modalità a 16 colori è necessario scrivere su 4 piani separati. Per motivi di prestazioni, l'hardware VGA supporta diverse modalità di scrittura e diverse modalità di lettura e può essere complicato (troppo complicato da descrivere adeguatamente qui).
PARTE 2
Per le porte di I/O (il 80x86, "PC compatibili"), c'è 3 categorie generali. Il primo è costituito da dispositivi legacy "di fatto standard" che utilizzano porte I/O fisse. Questo include cose come chip PIC, controller DMA ISA, controller PS/2, chip PIT, porte seriali/parallele, ecc. Quasi tutto ciò che descrive come programmare ognuno di questi dispositivi ti dirà quali porte I/O utilizza il dispositivo.
La categoria successiva è dispositivi legacy/ISA, in cui le porte I/O utilizzate dai dispositivi sono determinate dai jumper sulla scheda stessa e non esiste un modo corretto per determinare quali porte I/O utilizzano dal software. Per evitare questo, l'utente finale deve dire al sistema operativo quali porte I/O utilizzano ogni dispositivo. Per fortuna questa roba croccante è diventata obsoleta (anche se questo non significa necessariamente che nessuno la stia usando).
La terza categoria è "plug & play", dove esiste un metodo per chiedere al dispositivo quali porte I/O utilizza (e nella maggior parte dei casi, cambiare le porte I/O utilizzate dal dispositivo). Un esempio di questo è PCI, dove c'è uno "spazio di configurazione PCI" che ti dice molte informazioni su ogni dispositivo PCI. Per queste categorie, non c'è modo in cui nessuno possa determinare quali dispositivi useranno le porte I/O senza eseguirle in fase di runtime, e la modifica di alcune impostazioni del BIOS può causare a tutti/tutti questi dispositivi la modifica delle porte I/O.
Si noti inoltre che una CPU Intel è solo una CPU. Nulla impedisce a quelle CPU di essere utilizzate in qualcosa che è radicalmente diverso da un computer "compatibile con PC". I manuali della CPU Intel non ti diranno mai nulla sull'hardware che esiste al di fuori della CPU stessa (incluso il chipset oi dispositivi).
Parte 3
Probabilmente il miglior posto dove andare per ulteriori informazioni (che è destinato per OS sviluppatori/hobbisti) è http://osdev.org/ (la loro wiki e forum di loro).
Wow, grazie per le grandi risposte, tutti. Tutte le risposte fornite sembrano essere probabilmente utili. – user336462
Hai considerato uno Sharpie? Scivolano abbastanza facilmente sulla maggior parte dei display CRT e LED. –