[SOS] Re: Entry Point avec LD.
Thomas Petazzoni
thomas.petazzoni at enix.org
Dim 12 Déc 11:09:39 CET 2004
Salut,
(Tout d'abord, l'adresse e-mail que tu as contacté est celle des
gestionnaire de la mailing-list SOS, pas la mailing list SOS elle même.
Pour ce genre de questions, la mailing-list de SOS est tout à fait
adaptée. Je t'encourage donc à t'y abonner et à y poster tes questions)
LfvrChris at aol.com wrote:
> -J'ai défini une fonction KernelMain() dans le kernel. Le kernel se lance
> correctement à partir du moment où la fonction KernelMain() est appelé par une
> autre fonction (Begin()).
> -Lorsque je tente de lancer le kernel en appelant directement la fonction
> KernelMain(), cela ne fonctionne pas, pourtant j'ai redéfini le point d'entrée
> (-e, _KernelMain). Lorsque je procède au désassemblage du code, je me rends
> compte que le point d'entrée de la fonction KernelMain() n'est pas à l'adresse
> attendue (0x0010002a au lieu de 0x00100000). Lorsque je passe par un appel
> intermédiaire en utilisant la fonction Begin() qui appelle la fonction
> KernelMain() cela fonctionne (voir le fichier KernelMap_Begin.txt).
> Je retrouve bien en effet la fonction Begin() à l'adresse attendue (0x00100000).
> Vous trouverez en annexe les fichiers désassemblés ainsi que les fichiers makefile.
> Encore une chose, je génère des fichiers binaires.
Tu n'as pas précisé de quelle manière tu entrais dans ton Kernel : par
un bootsecteur personnalisé, par Grub ? Si tu génères des fichiers
binaires, je pense qu'il s'agit d'un bootsecteur personnalisé.
L'option de LD n'est à mon avis utile que pour des sorties dans un
format binaire structuré comme le ELF. Un fichier ELF comporte un champ
contenant l'adresse du point d'entrée. Ici dans un fichier binaire brut,
il n'y a pas de tel champ, et la directive fixant le point d'entrée est
donc ignorée. La première fonction du code source se retrouve donc aux
premières adresses dans le fichie compilé.
Deux possibilités :
- Si tu utilises un bootsecteur personnalisé qui saute invariablement
à l'adresse 0x100000, il faut se débrouiller pour qu'à cette adresse il
y ai toujours le début de ton Kernel, ou une instruction de saut qui
saute au point d'entrée de ton Kernel.
- Si tu utilises Grub, alors il faut changer le champ entry_addr de la
structure Multiboot. Ce champ indique à quel endroit Grub doit démarrer
l'éxécution du noyau.
N'hésite pas à poser d'autres questions pour obtenir plus de précisions,
Bonne journée,
Thomas
--
PETAZZONI Thomas - thomas.petazzoni at enix.org
http://thomas.enix.org - Jabber: thomas.petazzoni at jabber.dk
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 256 bytes
Desc: OpenPGP digital signature
Url : http://the-doors.enix.org/pipermail/sos/attachments/20041212/b92f5548/signature.pgp
Plus d'informations sur la liste de diffusion Sos