Page suivantePage pr�c�denteTable des mati�res

5. Conventions d'appel

5.1 Linux

Edition de liens avec GCC

C'est la solution la plus pratique. Consultez la documentation de gcc et prenez exemple sur les sources du noyau Linux (fichiers .S qui sont utilis�s avec gas, non pas as86).

Les arguments 32 bits sont empil�s dans la pile vers le bas dans l'ordre inverse de l'ordre syntaxique (c'est-�-dire qu'on acc�de aux arguments ou les d�pile dans l'ordre syntaxique), au-dessus de l'adresse de retour 32 bits. %ebp, %esi, %edi, %ebx doivent �tre conserv�s par l'appel�, les autres registres peuvent �tre d�truits; %eax doit contenir le r�sultat, ou %edx:%eax pour des r�sultats sur 64 bits.

Pile virgule flottante: je ne suis pas s�r, mais je pense que le r�sultat se trouve dans st(0), la pile �tant � la discr�tion de l'appel�.

Notez que GCC poss�de certaines options pour modifier les conventions d'appel en r�servant certains registres, en mettant les arguments dans des registres, en supposant que l'on ne poss�de pas de FPU, etc. Consultez les pages .info concernant le i386.

Il faut prendre garde � d�clarer l'attribut cdecl pour une fonction qui suit la convention standard GCC (je ne sais pas exactement ce que cela produit avec des conventions modifi�es). Consultez la documentation GCC dans la section: C Extensions::Extended Asm::

Probl�mes ELF et a.out

Certains compilateurs C ajoutent un underscore avant tout symbole, alors que d'autres ne le font pas.

En particulier, la version GCC a.out effectue ce genre d'ajouts, alors que la version ELF ne le fait pas.

Si vous �tes confront� � ce probl�me, regardez comment des paquetages existants traitent le probl�mes. Par exemple, r�cup�rer une ancienne arborescence des sources de Linux, Elk, les qthreads ou OCAML...

Vous pouvez �galement red�finir le renommage implicite de C en assembleur en ajoutant les instructions suivantes:


 void truc asm("machin") (void);

pour s'assurer que la fonction C truc sera r�ellement appel�e machin en assembleur.

Remarquez que l'outil objcopy, du paquetage binutils, devrait vous permettre de transformer vos fichiers objets a.out en objets ELF et peut-�tre inversement dans certains cas. D'une mani�re plus g�n�rale, il vous permet d'effectuer de nombreuses conversions de formats de fichiers.

Appels syst�mes directs

Il n'est absolument pas recommand� d'effectuer de tels appels par ce que leurs conventions peuvent changer de temps en temps, ou d'un type de noyau � un autre (cf L4Linux), de plus, ce n'est pas portable, difficile � �crire, redondant avec l'effort entrepris par libc, et enfin, cela emp�che les corrections et les extensions effectu�es � travers la libc, comme par exemple avec le programme zlibc qui r�alise une d�compression � la vol�e de fichiers compress�s avec gzip. La mani�re standard et recommend�e d'effectuer des appels syst�mes est et restera de passer par la libc.

Les objets partag�s devraient r�duire l'occupation m�moire des programmes, et si vous souhaitez absolument avoir de petits ex�cutables, utilisez #! avec un interpr�teur qui contiendra tout ce que vous ne voulez pas mettre dans vos binaires.

Maintenant, si pour certaines raisons, vous ne souhaitez pas effectuer une �dition des liens avec la libc, r�cup�rez-la et essayez de comprendre comment elle fonctionne! Apr�s tout, vous pr�tendez bien la remplacer non?

Vous pouvez aussi regarder comment eforth 1.0c le fait.

Les sources de Linux sont fort utiles, en particulier le fichier d'en-t�te asm/unistd.h qui d�crit comment sont effectu�s les appels syst�me...

Le principe g�n�ral est d'utiliser l'instruction int $0x80 avec le num�ro de l'appel syst�me __NR_machin (regarder dans asm/unistd.h) dans %eax, et les param�tres (jusqu'� cinq) dans %ebx, %ecx, %edx, %esi, %edi. Le r�sultat est renvoy� dans %eax avec un r�sultat n�gatif �tant l'erreur dont l'oppos� est tranf�r� par la libc dans errno. La pile utilisateur n'est pas modific�e donc n'avez pas besoin d'en avoir une correcte lors de l'appel.

Entr�es/sorties sous Linux

Si vous souhaitez effectuer des entr�es/sorties directement sous Linux, soit il s'agit de quelque chose de tr�s simple qui n'a pas besoin de sp�cificit�s du syst�me et dans ce cas l�, consultez le mini-HOWTO IO-Port-Programming, ou alors vous devez cr�er un nouveau gestionnaire de p�riph�rique et vous devriez alors lire quelques documents sur les m�andres du noyau, le d�veloppement de gestionnaires de p�riph�riques, les modules du noyau, etc. Vous trouverez d'excellents HOWTO ou autres documents du projet LDP.

Plus particuli�rement, si vous souhaitez r�aliser des programmes graphiques, rejoignez le projet GGI: http://synergy.caltech.edu/~ggi/http://sunserver1.rz.uni-duesseldorf.de/~becka/doc/scrdrv.html

Dans tous les cas, vous devriez plut�t utiliser l'assembleur en ligne de GCC avec les macros provenant des fichiers linux/asm/*.h que d'�crire des sources en assembleur pur.

Acc�der aux gestionnaires 16 bits avec Linux/i386

De telles choses sont th�oriquement possibles (preuve: voir comment DOSEMU permet � des programmes d'acc�der au port s�rie), et j'ai entendu des rumeurs que certaines personnes le font (avec le gestionnaire PCI? Acc�s aux cartes VESA? PnP ISA? Je ne sais pas). Si vous avez de plus amples pr�cisions � ce sujet, soyez les bienvenus. Le bon endroit � regarder est les sources du noyau, les sources de DOSEMU (et des autres programmes se trouvant dans le r�pertoire DOSEMU), ainsi que les sources d'autres programmes bas niveaux (peut-�tre GGI s'il g�re les cartes VESA).

En fait, vous devez utiliser soit le mode prot�g� 16 bits, soit le mode vm86.

Le premier est plus simple � configurer mais il ne fonctionne qu'avec du code ayant un comportement propre qui n'effectue pas d'arithm�tique de segments ou d'adressage absolu de segment (en particulier pour l'adressage du segment 0), � moins que par chance tous les segments utilis�s peuvent �tre configur� � l'avance dans le LDT.

La seconde possiblit� permet d'�tre plus "compatibles" avec les environnements 16 bits mais il n�cessite une gestion bien plus compliqu�e.

Dans les deux cas, avant de sauter sur le code 16 bits, vous devez:

Encore une fois, lisez attentivement les codes sources situ�s dans le r�pertoire de DOSEMU et consorts, en particulier ces mini-�mulateurs permettant de faire tourner des programmes ELKS et/ou des .COM assez simples sous Linux/i386.

5.2 DOS

La plupart des �mulateurs DOS sont livr�s avec certaines interfaces d'acc�s aux services DOS. Lisez leur documentation � ce sujet, mais bien souvent, ils ne font que simuler int $0x21 et ainsi de suite, donc c'est comme si vous �tiez en mode r�el (je doute qu'ils aient de possibilit�s de fonctionner avec des op�randes 32 bits: ils ne font que r�fl�chir l'interruption dans le mode r�el ou dans le gestionnaire vm86).

Certaines documentations concernant DPMI (ou ses variantes peuvent) �tre trouv�es sur ftp://x2ftp.oulu.fi/pub/msdos/programming/

DJGPP est livr� avec son propre sous-ensemble, d�riv�, ou remplacement (limit�) de la glibc.

Il est possible d'effectuer une compilation crois�e de Linux vers DOS. Consultez le r�pertoire devel/msdos/ de votre miroir FTP de sunsite.unc.edu. Voir �galement le dos-extender MOSS du projet Flux d'utah.

D'autres documentations et FAQ sont plus consacr�s � DOS. Nous d�conseillons le d�veloppement sous DOS.

5.3 Windauberies...

Heu, ce document ne traite que de libre logiciel. T�l�phonez-moi lorsque Windaube le deviendra ou du moins ses outils de d�veloppement!

En fait, apr�s tout, cela existe: Cygnus Solutions a d�velopp� la biblioth�que cygwin32.dll pour que les programmes GNU puissent fonctionner sur les machines MicroMerdiques. Donc, vous pouvez utiliser GCC, GAS et tous les outils GNU ainsi que bon nombre d'applications Unix. Consultez leur site Web. Je (Far�) ne souhaite pas m'�tendre sur la programmation sous Windaube, mais je suis s�r que vous trouverez tout un tas d'informations partout...

5.4 Votre propre syst�me d'exploitation

Le contr�le sur le syst�me �tant ce qui attire de nombreux programmeurs vers l'assembleur, une pr�misse ou un corollaire naturel de son utilisation est la volont� de d�velopper son propre syst�me d'exploitation. Remarquons tout d'abord que tout syst�me permettant son auto-d�veloppement pourrait �tre qualifi� de syst�me d'exploitation, combien m�me tournerait-il au-dessus d'un autre syst�me sur lequel il se d�chargerait de la gestion du multit�che (Linux sur Mach) ou des entr�es/sorties (OpenGenera sur Digital Unix), etc. Donc, pour simplifier le d�bogage, vous pouvez souhaiter d�velopper votre syst�me d'exploitation comme �tant un processus fonctionnant sous Linux (au prix d'un certain ralentissement), puis, utiliser le Flux OS kit (qui permet l'utilisation des drivers Linux et BSD dans votre propre syst�me d'exploitation) pour le rendre ind�pendant. Lorsque votre syst�me est stable, il est toujours temps d'�crire vos propres gestionnaires de mat�riels si c'est vraiment votre passion.

Ce HowTo ne couvrira pas des sujets comme le code de chargement du syst�me, le passage en mode 32 bits, la gestion des interruptions, les bases concernant les horreurs des processeurs Intel (mode prot�g�, V86/R86), la d�finition de votre format d'objets ou de vos conventions d'appel. L'endroit o� vous pourrez trouver le plus d'informations concernant tous ces sujets est le code source de syst�me d�j� existants.

Un grand nombre de pointeurs se trouvent dans la page: http://www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html


Page suivantePage pr�c�denteTable des mati�res

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:15