Création d'une librairie graphique

Neo -  
 Neo -
Bonjour,
Je crées en ce moment un OS en Assembleur et en C. Ce dernier est assez complexe, il gère le multitâche, les interruptions, pagine la mémoire, etc. Mais il est en mode texte, à la sauce DOS. Je souhaiterais créer une librairie graphique, telle GTK, afin de réaliser une interface graphique pour que d'autres programmeurs, moins expérimentés en programmation système, mais d'avantage en programmation logiciel, puissent réaliser, par exemple, un navigateur (même s'il faut également réaljser une librairie "web").
Je n'est jusqu'à présent rien trouvé de bien interessant. J'espère que vous pourrez m'aider. Je vous remercie d'avance pour vos reponses.
A voir également:

12 réponses

ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
Ceci pourrait t'aider : https://wiki.osdev.org/Drawing_In_Protected_Mode. Pour les contrôles, il suffit de stocker leurs infos (position, état, attributs, contenu) dans des structures (utilise des listes chainées).

PS : si tu comptes faire concurrence à Windows/Linux, va déjà falloir proposer un OS stable et complet. (Surtout au niveau drivers, c'est ça le plus dur.) Puis faudra pas mal de temps, sauf si t'as 5-6 personnes qui travaillent aussi sur le projet. Je ne dis pas ça pour te décourager, mais ne te fixe pas des objectifs bien au-dessus de ce que tu aurais le temps et le courage de faire ...
0
Neo
 
Tout d'abord merci pour ta réponse. J'avais bien en tête les listes chainées, mais ne savais pas comment dessiner des formes à l'écran. Je ne sais qu'exploiter ma carte graphique en mode texte, avec les attributs vidéos.
Sinon, je ne souhaites pas concurencer Linux. Je suis conscient du nombre de personne qui réalisent un tel système. Mon OS n'est pas aussi pointu, c'est un petit kernel monolithique couplé à une interface, pour le moment rudimentaire. Je le vois plutôt comme une occasion de comprendre comment foctionne un PC, et peut-être, à terme, apporter ma contribution à Linux.
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
Tes structures décrivant tes fenêtres peuvent aussi être gérées via listes chainées (une par processus). En fait, tu dois les employer à chaque fois que tu serais tenté d'utiliser un tableau de taille variable (pas possible tel-quel en C, heureusement car sinon ça serait malloc+copie+free).

Tu t'es basé sur un truc déjà existant ou t'as passé des jours à tout coder toi-même (juste pour savoir) ?
0
Neo
 
Je me suis documenté et inspiré de qques petits OS, MikeOS et Pépin. Mais bien sur, j'ai un peu amélioré le tout ! ;)
Mais sinon, c'est trois fois rien. Le système est en mode Shell, comme DOS. Il gère une dizaine de commandes...
0
Neo
 
Sinon petite question : l'adressage en mode texte se fait en placant un caractère (sur un octet) suivie de son attribut (sur un octet), et ce à partir de 0xB8000. Mais la méthode pour dessiner en 0xA0000 me semble confuse, pourrais-tu m'éclairer !?
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
D'après ce que j'ai compris, tu dois d'abord définir le mode vidéo en passant par le mode réel et puis seulement jouer avec la mémoire vidéo. Voilà un tuto qui m'a l'air assez complet : http://www.monstersoft.com/tutorial1/. Il n'y a malheureusement pas des tonnes de tutos là-dessus et c'est pas évident aux premiers abords ...
0
Neo
 
OK, merci encore. Effectivement, trouver des tutos sur ce sujet n'est pas chose facile, mais en français, c'est encore plus dur ! Dommage que a.michelizza n'ai pas abordé ce sujet, car je trouve ses tutos biens réalisés !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nicocorico Messages postés 846 Statut Membre 138
 
Attention aux valeurs employées : L'adresse segment vidéo commence à 0xB000, et offset 0 pour la 1ère page écran jusqu'à 0x7FFF, et offset 0x7FFF-0xFFFF pour la 2ème page écran...
0
Neo
 
Quel peut-être l'interêt de deux pages en mode texte ?
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
Avoir plusieurs consoles ... D'après mes souvenirs, sous Linux, c'est géré en copiant dans une zone "faite pour", afin d'éviter d'être trop dépendant de l'architecture.
0
Neo
 
Comment utiliser cette 2e page ? Ne peut-on également l'utiliser pour blitter l'image !?
0
nicocorico Messages postés 846 Statut Membre 138
 
Pour utiliser la 2ème page, il suffit d'écrire dedans puis de l'afficher tout simplement, et son intérêt est avant tout d'éviter les scintillements dûs à de nombreux changements...
Je cherche dans ma doc pour savoir comment on sélectionne, mes souvenirs sont un peu lointains !
Et si je me souviens bien, c'est plus qu'une sélection de la page qu'il est possible de faire, mais carrément la sélection de l'offset auquel la carte vidéo va commencer la lecture en mémoire, ce qui permet de faire du défilement...
Source -> La bible PC programmation système ed; 1994 - ça nous rajeunis pas -, encombrante version papier mais très complète, je te la conseille vivement...
0
nicocorico Messages postés 846 Statut Membre 138
 
Pour changer de page : Int $10, fonction $05 dans AH et dans AL le numéro de page...
La taille des pages dépend de la résolution.
Pas moyen ici de faire du défilement, je t'en dirais plus là-dessus si tu le souhaites.
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
En fait, tu as un noyau quoi. Comme Linux. Le noyau Linux ne comporte pas d'interface graphique, C'est le serveur X qui s'occupe de ça. Je te conseil donc d'aller voir comment est fait le serveur X, tu y piocheras peut être des idées.
En tout cas, bonne chance.
0
Neo
 
C'est un noyau très simple, qui, comme Linux, ne propose pas d'interface graphique native. Etant sous cet OS, je connais le serveur X, mais je n'ai pas trop l'intention de me lancer dans la création d'un véritable OS : il n'arrivera jamais à la cheville de Linux ! C'est plutôt une occasion de découvrir comment fonctionne un PC et un OS, partager ce savoir (aussi maigre soit-il), et éventuellement apporter ma modeste contribution au libre.
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Oui, j'avais bien compris. Je te suggérait juste d'aller voir comment était fait le serveur X, pour savoir comment gérer ta video. Si tu ne connais pas, il y a aussi MINIX dont tu pourrais t'inspirer.
0
nicocorico Messages postés 846 Statut Membre 138
 
Oui ça peut toujours être une bonne inspiration, d'autant plus qu'il sera nécessaire d'externaliser les fonctions d'affichage pour que les programmes puissent les utiliser, ce qui est la moindre des choses qu'un OS, même micro, doit proposer aux applications...
0
Titi La Fronde Messages postés 74 Statut Membre 4
 
je te souhaite bonne chance, tu pars dans un long boulot =)
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
(Je continue hors d'un commentaire, faites de même sinon on peut pas faire +1 et ça devient pénible à lire)

La mémoire flat c'est deux segments qui ont les mêmes début et longueur (0->4GB 32 bit) l'un code et l'autre données ainsi qu'un autre segment pour la pile (perso j'ai base/limit=0 mais je sais pas comment il gère les limites pour une pile + 32 bit + expand-down data). Mon code là : https://pastebin.com/MBS66MpJ. La première entrée (inutilisée par le proco) est utilisée pour stocker GDTR avant de le charger via LGDT.
0
Neo
 
La limite est à 0 car il l'interprète comme la limite inférieure du segment.
0
nicocorico Messages postés 846 Statut Membre 138
 
Ha oui ça y est j'y suis pour GDT, je ne m'en souvenais plus, c'est loin tout ça et j'en ai jamais eu l'usage, étant depuis longtemps sur des applications non-système.
Et je pense qu'il n'y a pas à s'embêter avec la limite de pile, en la fixant une fois pour toute à une valeur suffisante...
Dans ton code, une valeur par défault remplace sans doute la valeur nulle...
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
A mon avis la limite est ignorée et la base est le minimum (avant GPF - General Protection Fault) vu que c'est expand-down (logique pour une pile sous x86). Le pointeur est en effet défini après avoir modifié CR0 via mov esp, 0xNNNNNN (assez haut pour éviter de taper dans des données ou du code). [Il ne faut pas non plus oublier de définir SS mais c'est le même tarif pour les autres]
0
Neo
 
Pour la GDT, voir http://a.michelizza.free.fr/pmwiki.php?n=TutoOS.ProtectedMode (pour une fois que je peux donner un lien XD).
0
nicocorico Messages postés 846 Statut Membre 138
 
Ok, et maintenant revenons à nos moutons : Pour la prog système de la carte graphique sans bios, il faut s'adresser directement à elle via les ports, en entrant les bonnes valeurs au niveau des différents controleurs de la carte. Et là tout se complique, je vais chercher un site qui regroupe ces infos en français, j'ai trouvé qu'en anglais pour le moment, et ça correspond à plusieurs dizaines de pages... Je vois ça demain.
0
Neo
 
OK, MRC beaucoup. Si j'ai malheureusement bien compris, ça me fait encore un contrôleur de plus à programmer...
0
nicocorico Messages postés 846 Statut Membre 138
 
Oui, il n'y aura pas le choix...
Et je pense que la meilleure solution c'est de créer des routines graphiques qui travaille sur un buffer interne représentant l'écran puis de copier tout ou partie du buffer dans la mémoire vidéo ensuite.
C'est sûrement la solution la plus efficace et la garantie que les fonctions resserviront quel que soit le mode vidéo employé. En sachant qu'en mode X les pixels sont entrelaçés par groupe de 4 et que ça peut être encore différent dans d'autres modes, alors développer les routines pour le mode X sans être sûr que c'est définitif n'est pas très rationnel, autrement dit lourd, lent et non portable...
Et je crois avoir trouvé de quoi se passer du mode X et de ses contraintes via la norme VESA 2.0,
autorisant le fonctionnement en mode protégé et l'accès linéaire à la mémoire vidéo, et peut-être un mode 1024*768 24bits ! Je te laisse consulter ça, il y a même des exemples en C, que je maitrise mal :
https://www.drdobbs.com/architecture-and-design/examining-the-vesa-vbe-20-specification/184409592
et plus largement sur la norme vesa:
https://en.wikipedia.org/wiki/VESA_BIOS_Extensions#References
0
Neo
 
Petite question annexe : à l'adresse http://a.michelizza.free.fr/pmwiki.php?n=TutoOS.Task, on peut lire Nous avons vu plus haut que le descripteur de segment de pile est à l'offset 0x30 dans la GDT et qu'il définit un espace mémoire de 4k débutant à l'adresse 0x20000 ! D'autre part, la pile est définie dans le code source comme adressant l'ensemble de la mémoire ! Qqu'un a t-il une explication ?
0