Utilisation des fichiers de commandes pour maîtriser l'édition des liens
Il est important de remarquer qu'un kit 68040 ne possède pas de système
d'exploitation mais un "simple" moniteur résident en EPROM. Ce moniteur permet
tout juste de charger un programme en mémoire et de lancer sont exécution.
Lancer l'exécution d'un programme n'est pas aussi simple qu'il n'y parait. Sur
une station de travail la complexité du chargement et du lancement du programme
en mémoire est masquée par le système d'exploitation. Sur un kit 68040
c'est le programmeur qui doit charger et lancer en mémoire ses programmes. Un simple
go a l'adresse d'implantation en mémoire de la fonction main() ne suffit
pas. L'exécution du sous/programme main doit être faite sous le contrôle d'un programme
appelé startup. Le startup doit effectuer l'interface logiciel entre le
système cible
et le programme utilisateur. Pour un kit 68040 le startup
écrit en assembleur
reste simple: il doit au minimum initialiser les registres de piles, appeler le sous-programme main et redonner la main au moniteur du kit. Mais vous pouvez aussi initialiser
de la mémoire (un vecteur d'interruption par exemple) ou configurer des circuits
périphériques (pia, ptm,...):
début Initialisation logiciel (mémoire, registres,...)
Initialisation matériel (circuit d'entrées/sorties,...)
Appel du programme utilisateur (fonction main)
Retour au moniteur
L'utilisation d'un startup est donc obligatoire. Elle nécessite
d'assembler et de compiler séparément les modules en assembleur et en langage C pour effectuer proprement
l'éditions
des liens
Étude d'un exemple simple sur kit68000
Les sources des fichiers qui suivent sont dans le répertoire
$kits68k/exemple/LinkCom.
Algorithme du startup minimum:
début Initialisation du registre de pile
Appel de la fonction main
Retour au moniteur
end
Ce qui donne en assembleur (fichier startup40.s):
-
SECT startup00
; Déclaration de la section
-
; Déclarations des symboles externes:
-
XREF _main
; nom de la fonction principale
-
; Déclarations des symboles publics:
-
XDEF exitkit
; S/P d'appel du moniteur
-
; Début du startup
entry
-
MOVE.L #20000H,A7 ; init pile utilisateur
-
JSR _main
; appel du sous/programme principal utilisateur
- exitkit TRAP #15
; retour au moniteur du kit
- DC.W $63
Explication:
La directive SECT permet de nommer une section de code ou de données.
La directive XREF permet de faire référence à un symbole déclaré dans un autre module.
Ici le symbole externe est _main qui est le nom objet donné après compilation du fichier .c
contenant la fonction main().
La directive XDEF permet de rendre accessible à un autre module un symbole
local ici exitkit.
Ainsi un autre module pourra faire référence a ce symbole.
Assemblage du fichier startup40.s:
Il suffit de lancer la commande a68:
a68 startup00
Ce qui a pour effet de générer un module objet startup00.o en code opératoire
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 générer un module objet test.o en code opératoire 68000
translatable.
Edition des liens :
Avant d'effectuer l'éditions des liens il faut imaginer l'emplacement des différentes
sections de code, de données et de constantes dans la mémoire du kit cible: début
de la mémoire utilisateur sur kit 68000
=================================================================
000800h début de la section startup
.
. / Initialisation du registre de pile
. Code du Startup - Appel de la fonction main
. \ Retour au moniteur
.
. fin de la section de startup
-----------------------------------------------------------------
. début de la section prog (code utilisateur)
.
. Elle contient le code du fichier test.c et en
. particulier le code de la fonction main ainsi que
. les éventuels appels aux routines des librairies
. standards.
.
. fin de la section prog du code utilisateur
---------------------------------------------
. Puis suivent les sections const et data qui contiennent
. les constantes et les données de la section code utilisateur.
-----------------------------------------------------------------
. Et enfin les autres sections: lib, libc, libm ,...
.
. Code des fonctions des librairies standards appelées . par le code utilisateur.
-----------------------------------------------------------------
.
.
01FFFFh
=================================================================
fin de la mémoire utilisateur sur kit 68000
Pour obtenir un mapping mémoire identique a celui montre ci-dessus on doit donner des
directives a l'éditeur des liens (commande l68) par l'intermédiaire d'un fichier de commande
souvent appèle LinkCom.k.
La commande l68 va chercher les directives d'édition des liens dans un fichier qui porte
une extension en .k et qui doit être dans le répertoire local de travail. Si ce fichier
est absent, la commande l68 va chercher un fichier de commande par défaut.
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 /usr/hp64000/lib/68000/libm.a
LOAD /usr/hp64000/lib/68000/libc.a
LOAD /usr/hp64000/lib/68000/lib.a
END
Description du fichier test.k :
La directive CHIP précise le type du processeur.
La directive ORDER permet de spécifier l'ordre de placement en mémoire
des différentes sections de code,
de constantes et de donnees. Donc ici toutes les section de code nommées startup00 des modules objets
seront placées en mémoire avant toutes les autres sections. La section suivante sera prog, ect...
La directive SECT permet de preciser l'adresse de début d'une section. SECT startup00 = $800 fait commencer
la section startup00 a partir de l'adresse 800 hexa. Les autres sections (prog, const, lib,...) serront placees
apres la section startup comme le précise la directive ORDER.
La directive LOAD précise un module objet (en .o) ou une librairie (en .a) qui doit etre charge. Le
module objet contient des sections de code opératoire translatable d'un ensemble de routines et de
données.
Une librairie n'est qu'un fichier archive qui contient un ensemble de fichiers objets.
Execution de l'edition des liens :
Il suffit de lancer la commande l68:
l68 test
Ce qui a pour effet de générer un fichier téléchargable test.s29. Avant de tester le programme
regardez le fichier test.map pour
vérifier que les adresses d'implantation des sections sont
dans la mémoire utilisateur.
Les entrées/sorties sur kit68040.