[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