                        Watcom Tutoriol
                        



Pourquoi fait-je cela ? parce que j'me fais chier !

Mon but n'est pas ici de faire un cours de C mais plutt
d'expliquer sommairement le fonctionnement d'un Programme DOS 32
bits. C'est con, mais perso j'ai eu un peu de mal  trouver des
infos sur le Mode protg des 80386, 486 , et autres Tethatiums
like. (C vrai que j'avais pas Internet  l'poque, mais bon ...)



1 -  What is da principe ?


Si vous avez quelques difficults avec l'organisation mmoire du
PC je vais vous claircir une ch'touille. Le mode natif dont
dispose tout processeur 80x86 (celui dans lequel il se trouve au
dmarrage) est le mode Rel : Votre machine est ici dans un
adressage (mmoire) segment. Une adresse est compos d'un segment
et d'un offset :

ex: DS:SI

Les registres de segments (ES, DS, SS, CS, FS, GS) et d'offset
(SI, DI, IP, SP, BP) sont tout des registres 16 bits mais avec une
particularit :

Une adresse en mmoire se code sur 20 bits :

          Ŀ   Ŀ
          Registre Segment : Registre Offset
             
  bits    19               3   15              0

C'est donc bien mais pas top : on peut acceder jusqu'a 1 Mo de
mmoire et y'a plein d'autres problmes tous plus chiant les un
que les autres...
        
A partir du 80286 un type d'Intel qui gueulait plus fort que les
autres (Et qui avait aussi plus de pouvoir que les autres :) ) 
dcid de dvelloper le processeur x86 en le dotant d'un nouveau
systeme de gestion de mmoire. Lorsque le 286 est sortie cela
n'tait pas encore au point mais le principe tait lanc : Plus de
mmoire et pis machin 'titache (M'titache ..... y'a des cons
j'vous jure). Bref ds le 386 a y'est y sont content y ont sorti
un machin rigolo  100 patates (D'ailleurs 10 ans aprs c'est
toujours la mme chose) mais comment ke ca marche ??? est-ce que
les registres deviennent bleus ? est-ce que ca fera toujours Bip
quand on fera Reset ??????????????????????

==>  Tant de questions qui restaient sans rponse !!!



2 - Des Rponses !


Dja premire constatation: les registres de votre bidule silicon
favorie (Non pas le bidule qui fait du 115 E, l'autre) ont chang:

les registres d'accumulateurs et d'offset passent  32 bits :

        EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP

Ba c cool mais pourquoi ?

Bicause il y a un nouveau mode de gestion de mmoire ke l'on
appelle ......... THE MODE PROTEGE ..... (Musique dramatique et
effet d'ambiance) Non ? si !



3 - DA Modez Protegez


Trs sommairement voila de quoi il en retourne :

Il existe 2 types de modle mmoire :

   - Le modle FLAT o vous avez un espace adressable unique
   de 4 Go (utilis pour le flat realmode)

   - Le modle "segment"

Le modle segment est driv du modle FLAT voici comment cela 
fonctionne :
       
Lorsque vous adressez la mmoire vous n'avez plus 1 Mo de limite
mais 4 Go (Wahouuuuuuu) - adresse 32 bits. Mais cela d'une facon
un peu spciale. Voila un pointeur en mmoire :

     DS:ESI

DS contient un nombre zoli et rigolo tandis que ESI contient un
nombre cod sur 32 bits

Bon sang mais pourquoi ???????????????????!!!!!!!!!!!!

Le nombre contenu dans le registre de segment bah en fait il va
rfrencer un slcteur. Un slcteur est un nombre qui pointe sur
un descripteur de segment. 

Un descripteur de segment kzako ? (Dsol mais je fait ca de tte 
alors si j'oublie des trucs c normal) 

C'est une structure qui dfinit dans un espace mmoire virtuel de 
46 TeraOctet (32 bits d'adressage + 16384 selecteurs possibles):

    1 - Une adresse de base (dans la mmoire physique 4Go)
    2 - Une limite
    3 - Des droits d'acces
                        
 L'adresse de base donne l'adresse Physique  laquelle commence
le segment.
 La limite est la taille du segment.
 Les droits d'accs fixe les autorisations de Lecture/Ecriture
sur le segment suivant votre nivo de privilge.
(On vera plus tard comment modifier ses valeurs)

Si vous ne pigez pas un traitre mot de tout cela, voici un petit
exemple:

    DS = 240h
    ESI = 00000000

DS rfrence le descripteur 240h or si on se reporte  notre table 
de descripteurs on peut s'apercevoir que le descripteur 240h
possde les attributs suivant:
                
    Base adress : 000A0000h
    Limit       : 64 Ko
    Droits      : Lecture / criture

Cela veut dire que l'adresse pointe par DS:ESI (240:00000000) est 
physiquement en 000A0000h !

 
 Adresse physique                   Adresse segment
                |               |
    000AFFFFh    _fin_de_segm___ 240 : 0000FFFFh
                                
    000A0000h    ______base_____ 240 : 00000000
                                
                     Mmoire    
                                
                                
                                
                                
    00000000h    


Le segment 240h me permet donc d'adresser la zone mmoire de 
000A0000h  000AFFFFh (64 ko de limit). 
        
(Il faut noter que tout les descripteurs sont rangs dans 2 tables 
la GDT et la LDT. Il est possible de grer jusqu'a 16384
slecteurs. Dans la mesure o je ne tiens pas a faire du flat
Realmode, n'en dplaise  certains, je n'expliquerais pas la
structure de ces tables (En plus c long j'ai pas que ca  foutre)) 

Les droits peuvent vous paratre idiot mais ils sont l dans un
but prcis : Souvenez vous le gars de chez intel qui voulait faire
du multitache, et ben la paf bingo. 
Imaginez que vous vouliez faire tourner plusieurs programmes en 
mmoire et bien un systeme Multi "Grosses" tches va allouez a
chaque programme des descripteurs pour son code et ses donns.
Mais chaque programme n'a pas le droits aux mmes choses qu'un
autre. C'est l que le fameux nivo de privilge entre en jeux :

On distingue 4 types de codes et donnes executs par le systme:

   - Le Noyau (Kernel)
   - Routines et donnes systmes
   - Services systme (une routine d'interruption par ex)
   - Applications

Et bien chacun de ses lment  un niveau de privilge diffrent:
        
Ex: - Seul le noyau peut modifier la table des decripteurs
    - Une application ne peut ecrire dans le segment de donnes
    systemes
    - etc...

Bien entendu des mecs se cassent les couilles pour faire un truc 
peu prs potable ki marche, et voila que des gros bourrins cassent
tout (cf Windaube 95)



4 - Compatibilit 16/32 bits 


Le mode protg semble bien jolie mais y'a tout de mme comme un
leger probleme. Le systme d'exploitation DOS  t crit pour le
mode rel, y'a donc pas moyen d'avoir accs aux fonctions systmes
(essayez d'appeler l'int 21h en mode protg vous verrez c rigolo)

C'est alors que dbarqurent les DOS - EXTENDERS (non de zeus mais
qu'est-ce ????)

Un Dos extender permet de faire tourner un programme 32 bits sous
DOS en vitant les inconvnients du modep. On peut prendre le cas,
un peu spcial, de DOS4GW (voir aussi PMODEW ou DOS32)
        
Ce dernier se trouve en mmoire lorsque un programme DOS 32 bits
est lanc. Il va alors permettre un support quasi complet d'un
systme d'exploitation. Par exemple si votre prog fait appel 
l'int 21h Dos4g executera sa propre int 21h ecrite pour le mode
protg. Cependant certaines int ne peuvent tre xecuter en Modep
(Ex: Les fonctions BIOS pout des raisons videntes) dans ce cas la
dos4g va refaire passer le processeur en mode rel, xecuter l'int
et revenir en mode protg (C un peu lourd mais bien utile)



5 - Le DPMI


Au lancement d'un programme, DOS4GW (ou PMODEW) initialise les
segments de la facon suivante:

   ES = DS = SS (?) = CS (?) = segment de code + donnes
                 
Ce qu'a fait le dos extender, c'est qu'il a cre un selecteur pour 
le code et les donnes et il lui file les attributs suivant :

   Base address : 0
   Limit        : Dpend de la taille de votre programme
   Droits       : Tous (Lecture / Ecriture)

Ce qui est bien joli mais un petit peu dangereux quand on fait pas
gaffe : Toute la zone de mmoire contenant le noyau est totalement
dprotg, il vous est donc possible d'craser ce que bon vous
semble (huh huh c rigolo ca fait tout casser .....) 
        
Cependant c bien joli mais comment fait on pour modifier la taille
de ces segments, ou comment allouez de nouveaux selecteurs ???

Vous pouvez le faire en bidouillant la table des descripteurs 
(Franchement faut vraiment se faire chier  ce niveau) ou alors
passer par l'interface DPMI (Dos Protected Mode Interface) qui est
 votre disposition. Cette dernire est appele par l'int 31h et
met en oeuvre toute les fonctions ncessaire  la manipulation de
segments et autres choses en modep (voir n'importe quel programme
genre DOSINT pour les references de l'int 31h)



6 - Interruptions


Il existe 2 types d'interruptions avec un Dos extender :

   - L'interruption en Mode rel
   - L'interruption en Mode protg
                                   
Comment est fait la distinction :

En mode rel chaque int possde une adresse, toutes rpertoris
dans la table des vecteurs d'interruptions.

En mode protg cette table est remplac par l'IDT (Interrupt
Descriptor Table) qui va contenir des descripteurs pour chaque
routine.
        
L'interruption en mode rel ne peut tre appel qu'explicitement.
Pour cela il faut passer par un service de l'int 31h servant  
simuler un appel d'interruption en mode rel.(Ex: les services
VESA doivent tre appel en mode rel)
        
L'interruption en mode protg est appel comme en mode rel
Ainsi, par exemple, tout service materiel IRQ GUS/SB peut tre 
dclench en modep.

Ex :


   NewIRQSB:
       pushad
       push ds

       mov ax,DGROUP        ; Si vous utilis des donnes
       mov ds,ax            ; Pensez  recharger le descripteur
                            ; dans DS
       ...
       ...

       mov al,20h           ; Acquitte le 8259
       out 20h,al

       pop ds
       popad

       iretd                ; iretd dpile les flags et l'adresse
                            ; de retour far CS:EIP


Ces handlers doivent tre install par l'int 21h. Le dos extender
utilisera ses propres routines pour remplir l'IDT. Les fonctions
35h et 25h fonctionnent de manire transparente comme sous DOS.

                
     mov ah,35h
     mov al,[Intnum]
     int 21h
                                
     mov [AncIntSel],es      ; Sauvegarde le selecteur et
     mov [AncIntOff],ebx     ; L'offset de l'ancienne routine
                
     mov ah,25h              ; Installe la nouvelle
     mov al,[Intnum]
     push cs                 ; DS contient le selecteur
     pop ds                  ; pour le code DS = CS
     mov edx,offset NewIRQSB ; EDX = offset de la routine dans le
                             ; sgment
     int 21h

     ...
     ...

Il est possible d'installer deux handlers pour la mme int : un 
en mode rel l'autre en modep (c ce k'on appel bimodal interrupt)
J'en ai jamais vu l'intret mais dans ce cas il faut modifier le
fichier STUB.C qui sera xecuter avant le chargement de DOS4G (en 
mode rel) Pour plus d'info la dessus voir les FAQS du watcom.

(NdArraKis: Je pense que ce doit tre utile pour le cas d'un
handler Keyboard qui sera appel en mode protg - normale - mais
qui doit aussi tre appel en mode rel, par exemple lors de
l'appui sur une touche durant le chargement sur disk...D'ailleurs,
si vous avez des infos sur ce point, je suis preneur...
Pour le Mag, je ne suis pas cass la tte, je dsactive le clavier
avant tout chargement sur disk, a vite bien des problmes ...)



7 - Les erreurs


AHHHHHHHHH le domaine de prdilection de Micro..ft (Pas de pub :))
        
A partir du 80386 le processeur est capable de gnrer des
exceptions. Une exception intervient lorsque vous faite quelque
chose que le processeur ne peut ou ne veut pas faire. 
        
Ex : Danser tous nu "oune doche treche, qui c'est qui va se taper
     Maria ?" ou encore faire croire que windaube marche bien et
     que tout va pour le mieux dans le meilleur des mondes (Vous
     pouvez pas savoir  quel point ca l'emmerde)
                          
C'est ce qu'il va se passer si vous tentez de lire un segment ou
vous n'avez aucun droit en lecture, opcode inconnu, etc ......



8 - Ouf


   Voila sommairement les bases du fonctionnement d'un prog DOS 32
bits. Bien entendu le mode protg du 80386 est hachement plus
compliqu mais ces quelques notions devraient suffir pour que vous
compreniez ce que vous faites.

   Si le fonctionnement du CPU vous interesse, je vous conseille 
trs fortement un document 386INTEL.TXT que vous trouverez sur
tout bon x2ftp.oulu.fi et autre ftp.cdrom.com . Ce fichier est la
doc technik du processeur 386, avis aux amateurs....

                                                          EgoN 
                               (Voir le coup de geule qui suit)

        
        
        
        
Note : peut tre que certains trouvent ca rigolo de parler de
trucs "pipo" et estiment tre des brutes de programmation (chose
que je ne revendique pas personnellement) mais pour l'instant les
rares compos francaises que j'ai vu dernierement m'ont plutt fait
mourir de rire : (NdArraKiS: t'as pas les trucs de la Wired97!)

   - Effets 3d "rchauff"
   - Plantage une fois sur 2 pour des raisons inconnus
   - Installation monstrueuse de plusieurs 10aines de fichiers.
   - Dmos qui ne dmarre pas !!!!!! (trs fort)
   - Impossible de sortir par ESC parcequ'y faut absolument
     se la taper en entier !!!!! (atroce .....)

Pour faire des bidules en 3d qui tournent et qui bougent y'a du
monde vazy que j'te fait du gouraud machin du lissage bidule ...
        
Pour citer un exemple les auteurs de "MOMENT 2" auraient pu
s'abstenir ou au moins faire un petit effort :
(NdArraKiS: ouais, mais il regrette, pis t'y connais rien, il
utilise le DAFB (Dmo Assist par Fichier Batchs)  =:) )

Downloader 600 ko (ZIPPE !!!!) pour des merdes pareils ca me fout 
les boules alors que des types font des trucs hyper sensationnel 
en 30 Ko !!!!!!!!!

J'suis pas un hyper bon coder mais la franchement c'est n'importe
quoi !!! Bon j'vous laisse chuis aigris ..........
        
                           EgoN (qui va se jeter du RdC 
                                 si personne ne fait rien .......
                                 AAAAHHHHHHH .............)
