                        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 plut“t
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 prot‚g‚ 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 difficult‚s avec l'organisation m‚moire du
PC je vais vous ‚claircir une ch'touille. Le mode natif dont
dispose tout processeur 80x86 (celui dans lequel il se trouve au
d‚marrage) est le mode R‚el : Votre machine est ici dans un
adressage (m‚moire) 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 m‚moire 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
m‚moire et y'a plein d'autres problŠmes 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 :) ) …
d‚cid‚ de d‚velloper le processeur x86 en le dotant d'un nouveau
systeme de gestion de m‚moire. Lorsque le 286 est sortie cela
n'‚tait pas encore au point mais le principe ‚tait lanc‚ : Plus de
m‚moire et pis machin 'titache (M'titache ..... y'a des cons
j'vous jure). Bref dŠs le 386 ‡a y'est y sont content y ont sorti
un machin rigolo … 100 patates (D'ailleurs 10 ans aprŠs c'est
toujours la mˆme 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 r‚ponse !!!ý



2 - Des R‚ponses !ý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

D‚ja premiŠre 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 m‚moire ke l'on
appelle ......... THE MODE PROTEGE ..... (Musique dramatique et
effet d'ambiance) Non ? si !ý



3 - DA Modez Protegezý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

Tr‚s sommairement voila de quoi il en retourne :ý

Il existe 2 types de modŠle m‚moire :ý

   - Le modŠle FLAT o— vous avez un espace adressable unique
   de 4 Go (utilis‚ pour le flat realmode)ý

   - Le modŠle "segment‚"ý

Le modŠle segment‚ est d‚riv‚ du modŠle FLAT voici comment cela 
fonctionne :ý
       
Lorsque vous adressez la m‚moire vous n'avez plus 1 Mo de limite
mais 4 Go (Wahouuuuuuu) - adresse 32 bits. Mais cela d'une facon
un peu sp‚ciale. Voila un pointeur en m‚moire :ý

     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
r‚f‚rencer un s‚l‚cteur. Un s‚l‚cteur est un nombre qui pointe sur
un descripteur de segment. ý

Un descripteur de segment k‚zako ? (D‚sol‚ mais je fait ca de tˆte 
alors si j'oublie des trucs c normal) ý

C'est une structure qui d‚finit dans un espace m‚moire virtuel de 
46 TeraOctet (32 bits d'adressage + 16384 selecteurs possibles):ý

    1 - Une adresse de base (dans la m‚moire 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'acc‚s fixe les autorisations de Lecture/Ecriture
sur le segment suivant votre nivo de privilŠge.ý
(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 r‚f‚rence le descripteur 240h or si on se reporte … notre table 
de descripteurs on peut s'apercevoir que le descripteur 240h
possŠde les attributs suivant:ý
                
    Base adress : 000A0000hý
    Limit       : 64 Koý
    Droits      : Lecture / ‚critureý

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

 
 Adresse physique                   Adresse segment‚ý
ÿ                |               |ý
    000AFFFFh    ³_fin_de_segm___³ 240 : 0000FFFFhý
                 ³               ³ý
    000A0000h    ³______base_____³ 240 : 00000000ý
                 ³               ³ý
                 ³    M‚moire    ³ý
                 ³               ³ý
                 ³               ³ý
                 ³               ³ý
                 ³               ³ý
    00000000h    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý


Le segment 240h me permet donc d'adresser la zone m‚moire de 
000A0000h … 000AFFFFh (64 ko de limit). ý
        
(Il faut noter que tout les descripteurs sont rang‚s dans 2 tables 
la GDT et la LDT. Il est possible de g‚rer jusqu'a 16384
s‚lecteurs. Dans la mesure o— je ne tiens pas a faire du flat
Realmode, n'en d‚plaise … certains, je n'expliquerais pas la
structure de ces tables (En plus c long j'ai pas que ca … foutre)) 

Les droits peuvent vous paraŒtre idiot mais ils sont l… dans un
but pr‚cis : 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 
m‚moire et bien un systeme Multi "Grosses" tƒches va allouez a
chaque programme des descripteurs pour son code et ses donn‚s.
Mais chaque programme n'a pas le droits aux mˆmes choses qu'un
autre. C'est l… que le fameux nivo de privilŠge entre en jeux :ý

On distingue 4 types de codes et donn‚es execut‚s par le systŠme:ý

   - Le Noyau (Kernel)ý
   - Routines et donn‚es systŠmesý
   - Services systŠme (une routine d'interruption par ex)ý
   - Applicationsý

Et bien chacun de ses ‚l‚ment … un niveau de privilŠge diff‚rent:ý
        
Ex: - Seul le noyau peut modifier la table des decripteursý
    - Une application ne peut ecrire dans le segment de donn‚es
    systemesý
    - etc...ý

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



4 - Compatibilit‚ 16/32 bitsý 
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

Le mode prot‚g‚ semble bien jolie mais y'a tout de mˆme comme un
leger probleme. Le systŠme d'exploitation DOS … ‚t‚ ‚crit pour le
mode r‚el, y'a donc pas moyen d'avoir acc‚s aux fonctions systŠmes
(essayez d'appeler l'int 21h en mode prot‚g‚ vous verrez c rigolo)

C'est alors que d‚barquŠrent 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 inconv‚nients du modep. On peut prendre le cas,
un peu sp‚cial, de DOS4GW (voir aussi PMODEW ou DOS32)ý
        
Ce dernier se trouve en m‚moire lorsque un programme DOS 32 bits
est lanc‚. Il va alors permettre un support quasi complet d'un
systŠme d'exploitation. Par exemple si votre prog fait appel …
l'int 21h Dos4g executera sa propre int 21h ecrite pour le mode
prot‚g‚. 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 r‚el, ‚xecuter l'int
et revenir en mode prot‚g‚ (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 + donn‚esý
                 
Ce qu'a fait le dos extender, c'est qu'il a cr‚e un selecteur pour 
le code et les donn‚es et il lui file les attributs suivant :ý

   Base address : 0ý
   Limit        : D‚pend 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 m‚moire contenant le noyau est totalement
d‚prot‚g‚, 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 derniŠre est appel‚e par l'int 31h et
met en oeuvre toute les fonctions n‚cessaire … 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 r‚elý
   - L'interruption en Mode prot‚g‚ý
                                   
Comment est fait la distinction :ý

En mode r‚el chaque int possŠde une adresse, toutes r‚pertori‚s
dans la table des vecteurs d'interruptions.ý

En mode prot‚g‚ cette table est remplac‚ par l'IDT (Interrupt
Descriptor Table) qui va contenir des descripteurs pour chaque
routine.ý
        
L'interruption en mode r‚el 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 r‚el.(Ex: les services
VESA doivent ˆtre appel‚ en mode r‚el)ý
        
L'interruption en mode prot‚g‚ est appel‚ comme en mode r‚el
Ainsi, par exemple, tout service materiel IRQ GUS/SB peut ˆtre 
d‚clench‚ en modep.ý

Ex :ý
ÄÄÄÄý

   NewIRQSB:ý
       pushadý
       push dsý

       mov ax,DGROUP        ; Si vous utilis‚ des donn‚esý
       mov ds,ax            ; Pensez … recharger le descripteurý
                            ; dans DSý
       ...ý
       ...ý

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

       pop dsý
       popadý

       iretd                ; iretd d‚pile 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 maniŠre 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ý
                             ; s‚gmentý
     int 21hý

     ...ý
     ...ý

Il est possible d'installer deux handlers pour la m‚me int : un 
en mode r‚el l'autre en modep (c ce k'on appel bimodal interrupt)
J'en ai jamais vu l'int‚ret mais dans ce cas il faut modifier le
fichier STUB.C qui sera ‚xecuter avant le chargement de DOS4G (en 
mode r‚el) 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 prot‚g‚ - normale - mais
qui doit aussi ˆtre appel‚ en mode r‚el, 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 tˆte, je d‚sactive le clavier
avant tout chargement sur disk, ‡a ‚vite bien des problŠmes ...)ý



7 - Les erreursý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

AHHHHHHHHH le domaine de pr‚dilection de Micro..ft (Pas de pub :))
        
A partir du 80386 le processeur est capable de g‚n‚rer 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 prot‚g‚ 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 
trŠs 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 plut“t fait
mourir de rire : (NdArraKiS: t'as pas les trucs de la Wired97!)ý

   - Effets 3d "r‚chauff‚"ý
   - Plantage une fois sur 2 pour des raisons inconnusý
   - Installation monstrueuse de plusieurs 10aines de fichiers.ý
   - D‚mos qui ne d‚marre pas !!!!!! (tr‚s 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 (D‚mo 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 .............)ý
