LABORATOIRE ARCHITECTURES ET SYSTEMES (5201)
Utilisation des fichiers de commandes pour maitriser l'edition des liens
Il est important de remarquer qu'un kit 68000 ou 68010 ne possede pas de systeme
d'exploitation mais un "simple" moniteur. Ce moniteur permet juste de charger
un programme en memoire et de lancer sont execution.
Lancer l'execution d'un programme n'est pas aussi simple qu'il n'y parait. Sur
une station de travail la complexite du chargement et du lancement du programme
en memoire est masquee par le systeme d'exploitation. Sur un kit 68000 ou 68010
c'est le programmeur qui a la charge de charger et de lancer en memoire le
programme. Un simple go a l'adresse d'implantation en memoire de la fonction
main ne suffit pas.
L'execution du sous/programme main doit etre faite sous le controle d'un programme
appele' startup. Le startup doit effectuer l'interface logiciel entre le syteme cible
et le programme utilisateur. Pour un kit 68000 ou 68010 le startup ecrit en assembleur
reste simple: il doit au minimun initialiser le registre de pile, appeler le sous-
programme main et redonner la main au moniteur du kit. Mais vous pouvez initialiser
de la memoire (un vecteur d'interruption par exemple) ou configurer des circuits
peripheriques:
debut
Initialisation logiciel (memoire, registres,...)
Initialisation materiel (circuit d'entrees/sorties,...)
Appel du programme utilisateur (fonction main)
Retour au moniteur
fin
L'utilisation d'un startup est donc obligatoire. Elle necessite d'assembler et de
compiler separement les modules en assembleur et en langage C pour effectuer une
l'editions des liens.
Etude d'un exemple simple sur kit68000
Les sources des fichiers qui suivent sont dans le repertoire $kits68k/exemple/LinkCom
Algorithme du startup minimum:
debut
Initialisation du registre de pile
Appel de la fonction main
Retour au moniteur
end
Ce qui donne en assembleur (fichier startup00.s):
* Declaration de la section
SECT startup00
* Declarations des symboles externes:
XREF _main ; nom de la fonction principale
* Declarations des symboles publics:
XDEF _exitkit ; S/P d'appel du moniteur
* Debut du startup
entry MOVE.L #20000H,A7 ; init pile utilisateur
JSR _main ; appel du sous/programme principal utilisateur
_exitkit TRAP #14 ; retour au moniteur du kit
END
Explication:
La directive SECT permet de nommer une section de code ou de donnees.
La directive XREF permet de faire reference a un symbole public (declare'
dans un autre module). Ici le symbole externe est _main qui est le nom
objet donne' apres compilation du fichier .c contenant la fonction
main().
La directive XDEF permet de rendre accessible un symbole local de ce module
a un autre module.
Assemblage du fichier startup00.s:
Il suffit de lancer la commande a68:
a68 startup00
Ce qui a pour effet de generer un module objet startup00.o en code operatoire
68000 translatable.
Compilation du fichier C d'exemple test.c:
Il suffit de lancer la commande c68:
c68 test
Ce qui a pour effet de generer un module objet test.o en code operatoire 68000
translatable.
Edition des liens :
Avant d'effectuer l'editions des liens il faut imaginer l'emplacement des differentes
sections de code, de donnees et de constantes dans la memoire du kit cible:
debut de la memoire utilisateur sur kit 68000
=================================================================
000800 (debut de la section de startup)
.
. / Initialisation du registre de pile
. Code du Startup - Appel de la fonction main
. \ Retour au moniteur
.
. (fin de la section de startup)
-----------------------------------------------------------------
. (debut de la section du code utilisateur)
.
. Elle contient le code du fichier test.c et en
. particulier le code de la fonction main ainsi que
. les eventuels appels aux routines des librairies
. standards.
.
. (fin de la section du code utilisateur)
---------------------------------------------
. Section des constantes et des donnees du
. code utilisateur.
-----------------------------------------------------------------
. Sections des librairies standards.
.
. Code des fonctions des librairies standards appelees
. par le code utilisateur.
-----------------------------------------------------------------
.
.
01FFFF
=================================================================
fin de la memoire utilisateur sur kit 68000
Pour obtenir un mapping memoire identique a celui montre ci-dessus il faut donner des
directives a l'editeur des liens (commande l68).
La commande l68 va chercher les directives d'edition des liens dans un fichier qui porte
une extension en .k et qui doit etre dans le repertoire local de travail. Si ce fichier
est absent, la commande l68 va chercher un fichier de commande par defaut.
Dans notre exemple le fichier de commande des liens est test.k:
CHIP 68000
ORDER startup00,prog,const,lib,libc,data,libdata,libcdata
SECT startup00 = $800
LOAD startup00.o
LOAD /nfs/srv3_d1/usr/hp64000/lib/68000/libm.a
LOAD /nfs/srv3_d1/usr/hp64000/lib/68000/libc.a
LOAD /nfs/srv3_d1/usr/hp64000/lib/68000/lib.a
END
Description du fichier test.k :
La directive CHIP precise le type du processeur a titre indicatif.
La directive LOAD impose les modules a linker. Par exemple le LOAD startup00.o permet a
l'editeur de liens de trouver la section startup00. Attention il n'y a pas de message d'erreur
si une section presente dans la directive ORDER n'est pas trouvee.
Chaque directive LOAD + nom de fichier precise un fichier qui peut etre soit un module objet
extension en .o soit une librairie extension en .o (une librairie est un fichier archive qui
contient le code operatoire translatable d'un ensemble de routines).
La diretive ORDER impose l'odre d'apparition en memoire des differentes sections de code, de
constantes et de donnees. Donc ici toutes les section de code nommees startup00 des modules objets
seront placees en memoire avant toutes les autres sections. La section suivante sera prog, ect...
La directive SECT startup00 = $800 fait commencer la section startup00 a partir de l'adresse 800 hexa.
Evidemment les autres sections suivront derriere la section startup00 commen indique par la directive
ORDER.
Execution de l'edition des liens :
Il suffit de lancer la commande l68:
l68 test
Ce qui a pour effet de generer un fichier telechargable test.s29. Avant de tester le programme
regardez le fichier test.map pour verifier que les adresses d'implantation des sections sont
dans la memoire utilisateur.
Les entrees/sorties sur kit68000 :
Il existe un module qui contient le code des fonctions standard C suivantes:
void exitkit (void); /* retour au moniteur */
char getchar (void); /* retourne le caractere saisie apres un return au clavier */
char getkey (void); /* retourne un caratere saisie au clavier */
char *gets (char*); /* retourne une chaine de carateres saisie au clavier */
void puts (char*); /* affiche la chaine de cararteres en parametre */
void putchar (char); /* affiche le caracter en parametre */
Le code source de ces fonctions est disponibles dans le fichier $kit68k/src/iokit00.s
Pour pouvoir utiliser ces fonctions il faut:
-inserer le fichier include suivant:
#include <iokit00.h>
(dans votre fichier .c)
-ajouter dans votre fichier .k a la ligne ORDER la section iokit00:
ORDER startup00, iokit00, ...
LOAD /user/info_lib/Kits68k.new/lib/iokit00.o