				<section id="V-2-1">
					<title>La représentation interne de numéros de périphérique</title>
					<paragraph>Dans le noyau, le type <i>dev_t</i> (définit dans &lt;linux/types.h&gt;) est utilisé pour manipuler des numéros majeurs et mineurs de périphérique, et ce en même temps. Depuis la version 2.6.0 du noyau, <i>dev_t</i> est une valeur codée sur 32 bits avec 12 bits réservés pour le numéro majeur et 20 pour le numéro mineur. Bien entendu, votre code ne devrait jamais faire de suppositions sur l'organisation des numéros de périphérique. Il devrait plutôt utiliser une collection de macros définies dans &lt;linux/kdev_t.h&gt;. Pour obtenir les parties majeure et mineure d'un <i>dev_t</i>, utilisez ceci:</paragraph>
<code langage="C"><![CDATA[
MAJOR(dev_t dev); 
MINOR(dev_t dev);
]]>
</code>
					<paragraph>En revanche, vous avez les numéros majeur et mineur et que vous devez les transformer en <i>dev_t</i>, utiliser ceci:</paragraph>
<code langage="C"><![CDATA[
MKDEV(int major, int minor);
]]>
</code>
					<paragraph>Notez que le noyau 2.6 peut héberger un grand nombre de périphériques, alors que les versions précédentes de noyaux étaient limitées à 255 numéros majeurs et 225 mineurs. On estime que la plus grande zone sera suffisante pratiquement à chaque fois, mais le champs calculé est jonché d'estimations erronées de cette nature. Donc vous devrez vous attendre à ce que le format de <i>dev_t</i> puisse changer dans le futur. Si vous écrivez vos pilotes prudemment ces changements ne seront pas un problème de toute façon.</paragraph>
				</section>
				<section id="V-2-2">
					<title>Allocation et libération de numéros de périphérique</title>
					<paragraph>Une des premières choses que votre pilote aura besoin de faire pour établir un périphérique caractère est d'obtenir un ou plusieurs numéros pour travailler avec. La fonction nécessaire à cette tâche est <i>register_chrdev_region</i>, qui est déclarée dans &lt;linux/fs.h&gt; :</paragraph>
<code langage="C"><![CDATA[
int register_chrdev_region(dev_t first, unsigned int count, char *name);
]]></code>
					<paragraph>Ici, <i>first</i> est le numéro de périphérique de la région que vous aimeriez allouer. La partie mineure de <i>first</i> est souvent 0, mais il n'y a pas d'obligation à cela. <i>count</i> est le nombre total de numéros de périphériques contigüs dont vous avez besoin. Notez que, si <i>count</i> est grand, la zone que vous demandez pourrait empiéter sur le numéro de majeur suivant, mais tout marchera bien tant que le numéro que vous demandez est disponible. Enfin, <i>name</i> est le nom du périphérique qui devrait être associé avec ce numéro : il apparaîtra dans /proc/devices et sysfs.</paragraph>
					<paragraph>Comme la plupart des fonctions du noyau, la valeur de retour de register_chrdev_region sera 0 si l'allocation s'est déroulée avec succès. En cas d'erreur, un code erreur négatif sera retourné, et vous n'aurez pas accès à la région demandée.</paragraph>
					<paragraph><i>register_chrdev_region</i> fonctionne bien si vous savez à l'avance exactement quels numéros de périphériques vous voulez. Souvent vous ne saurez pas quel numéro majeur votre périphérique va utiliser; il y a un effort constant de la communauté des développeurs du noyau de passer à l'utilisation des numéros de périphériques alloués dynamiquement. Le noyau allouera joyeusement un numéro majeur pour vous à la volée, mais vous devez demander cette allocation en utilisant une autre fonction:</paragraph>
<code langage="C"><![CDATA[
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name); 
]]>
</code>
					<paragraph>Avec cette fonction, <i>dev</i> est un paramètre de sortie qui va, si l'action se déroule avec succès, représenter le premier nombre dans votre zone allouée. <i>firstminor</i> devrait être le premier numéro mineur à utiliser, qui est généralement 0. Les paramètres <i>count</i> et <i>name</i> ont la même fonction que ceux donnés dans <i>request_chrdev_region</i>.</paragraph>
					<paragraph>Sans vous soucier de la façon dont vous allouez vos numéros de périphériques, vous devriez les libérer quand ils ne sont plus utilisés. Les numéros de périphériques sont libérés avec :</paragraph>
<code langage="C"><![CDATA[
void unregister_chrdev_region(dev_t first, unsigned int count);
]]>
</code>
					<paragraph>L'appel de <i>unregister_chrdev_region</i> devrait être habituellement placé dans la fonction de nettoyage de votre module.</paragraph>
					<paragraph>Les fonctions précédentes allouent des numéros de périphérique pour l'utilisation de votre pilote, mais elles n'informent pas le noyau de vos prochaines actions avec ces numéros. Avant que l'espace-utilisateur d'un programme puisse accéder à l'un de ces numéros de périphériques, votre pilote doit les connecter à ses fonctions internes. <b>Ces dernières implémentent les opérations du périphérique.</b> Nous allons décrire rapidement comment cette connexion est accomplie, mais il y a quelques détours nécessaires à prendre en compte auparavant.</paragraph>
				</section>

