2009-07-22 3 views
19

Il y a environ 15 ans, j'avais l'habitude de m'amuser et d'ennuyer mon professeur CS en écrivant un mauvais code qui modifierait directement le texte sur le moniteur. Cela a été/est facilement fait en accédant à la mémoire vidéo à 0xB8000 sur compatible PC compatible VGA.Où est le tampon vidéo textmode s'il n'est pas à 0xB8000?

Avance rapide jusqu'à aujourd'hui, j'ai décidé d'essayer ma vieille astuce via un port de débogage qui me donne accès à la lecture de la mémoire physique. Pour ma satisfaction, il a encore travaillé sur la première plate-forme, je l'ai essayé. Puis, décourageant, j'ai découvert que cela ne fonctionne pas sur beaucoup d'autres systèmes. Il semble que les systèmes sur lesquels il ne fonctionne pas ont tous des graphismes UMA (à mémoire partagée). Donc, une question pour tous ceux qui écrivent le BIOS, les gars du système d'exploitation de bas niveau et les gourous du pilote vidéo - si je suis en mode texto 80x25 régulier sur un système compatible PC avec mémoire graphique partagée, en mode réel, et le contenu de 0xb8000 - 0xB8FFF sont tous 0xFF au lieu de me donner ce qui est sur l'écran, où est passé le tampon d'écran?

+0

Juste pour confirmer, vous êtes en vrai mode réel, et pas une console "DOS" fonctionnant sous Windows, correct? – David

+3

Réel, mode réel honnête à Dieu (c'est un écran de configuration du BIOS que je capture). –

Répondre

13

Ah, si c'est un écran BIOS alors tous les paris sont désactivés. Le fait que ce soit un BIOS sur une carte mère avec des graphismes intégrés penche encore plus en faveur de l'étrangeté de la vidéo.

Dans tous les cas, la fonctionnalité VGA "classique" est à tous égards émulée. Avec une carte vidéo externe, cela serait invisible pour le BIOS - il voit toujours une carte vidéo VGA. Mais un BIOS câblé à la carte vidéo n'aurait pas besoin de configurer la fausse couche VGA et l'ancienne carte mémoire de l'espace d'adresses de 20 bits juste pour coller du texte sur l'écran. Au lieu de cela, le BIOS peut s'interfacer directement avec la carte (via un mode propriétaire) jusqu'à ce que le système d'exploitation démarre réellement, et à ce moment-là il effectue lui-même le mappage de la mémoire.Ceci a un avantage majeur en ce que pour une carte qui partage la mémoire principale, vous n'obtiendrez pas un écran vide au démarrage si votre RAM est mal installée (au contraire le mode BIOS propritary des cartes vidéo pourrait utiliser un buffer normalement réservé à un autre usage, vous permettant d'entrer dans le BIOS et de voir 0 Mo de RAM installé)

+3

Oui - J'ai été informé par un collègue que Phoenix bios utilise le mode 12h. L'information vidéo est là à 0xA0000, mais c'est tous les pixels, pas de caractères ascii. Bummer. Bonne réponse, mais un bummer ;-) –

4

Les cartes CGA (carte graphique couleur) et MDA (carte d'affichage monochrome) utilisaient différentes régions. Un (couleur) est à 0xB8000; mais monochrome commence à 0xB0000. Rappelez-vous, vous pourriez avoir les deux affichages actifs sur la machine à la fois.

Voir DOS Memory Map (bien qu'il y ait une faute de frappe dans le décalage pour CGA - devrait être 8000h pas 0800h).

En ce qui VGA (Video Graphics Array) va, sa mémoire commence plus bas, à la limite 640K à 0xA0000 et continue pour 64K - mais il peut aller au-delà, que la carte pourrait avoir jusqu'à 256K. Certains sample code for programming VGA is here. Mais ce n'est pas si simple car il a plusieurs modes vidéo. Vous pourriez essayer here pour de l'aide.

Etes-vous sûr d'avoir VGA, et pas EGA ou XGA ou Super-VGA? Tous ont des sémantiques légèrement différentes ... Mais je suis sûr que n'importe lequel d'entre eux devrait mettre du texte à 0xB0000 ou 0xB8000. Qu'est-ce qui se passe quand vous tapez soit

MODE MONO 

ou

MODE CO80

- cela affecte l'affichage? Ceux-ci passeraient d'un mode texte de l'adaptateur à l'autre, sous DOS.

+0

J'ai scanné tout de 0xB0000 à 0xBFFFF - tout est indésirable (0xFF). La mémoire à 0xC0000 est le bios VGA comme prévu; cela me permet de savoir que ma méthode d'accès à la mémoire fonctionne, mais ne m'aide pas à saisir le contenu de l'écran ... –

0

Il se peut que la mémoire virtuelle soit activée à ce stade. Par exemple, J'essayais d'écrire dans le tampon vidéo dans la base de code iPXE et cela ne se reflétait pas sur l'écran. Après enquête, je réalisais que je devais appeler la fonction:

phys_to_virt(0xB8000); 

pour pouvoir écrire dans la mémoire tampon vidéo directement.

Questions connexes