Adding first french translation of developper handbook

This commit is contained in:
Sebastien Gioria 2002-02-14 14:25:03 +00:00
parent e248c08a95
commit d0c90506a7
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=12185
10 changed files with 4514 additions and 0 deletions

View file

@ -0,0 +1,35 @@
#
# The FreeBSD Documentation Project
# The FreeBSD French Documentation Project
#
# Compilation du Manuel du Developpeur de FreeBSD
#
#
#
# $FreeBSD$
# Original revision: 1.25
#
#
MAINTAINER=gioria@FreeBSD.org
DOC?= book
FORMATS?= html-split
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
#
# SRCS lists the individual SGML files that make up the document. Changes
# to any of these files will force a rebuild
#
# SGML content
SRCS= book.sgml
# Entities
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,547 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: book.sgml,v 1.1 2002-02-14 14:25:01 gioria Exp $
$FreeBSD$
Original revision: 1.15
-->
<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V3.1-Based Extension//EN" [
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN"> %man;
<!ENTITY % urls PUBLIC "-//FreeBSD//ENTITIES Common Document URL Entities//FR"> %urls;
<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//FR"> %bookinfo;
<!ENTITY % translators PUBLIC "-//FreeBSD//ENTITIES DocBook Translator Entities//FR"> %translators;
<!ENTITY % chapters SYSTEM "chapters.ent"> %chapters;
<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN"> %authors
<!ENTITY % mailing-lists SYSTEM "../../share/sgml/mailing-lists.ent"> %mailing-lists;
<!-- French Build only -->
<!-- <!ENTITY % authors SYSTEM "../../../en_US.ISO_8859-1/books/handbook/authors.ent" > %authors; -->
<!ENTITY rel.current CDATA "3.3">
]>
<book lang="fr">
<bookinfo>
<title>Livre de chevet du d&#233;veloppeur FreeBSD</title>
<corpauthor>Le groupe du projet de documentation FreeBSD</corpauthor>
<pubdate>Ao&ucirc;t 2000</pubdate>
<copyright>
<year>2000</year>
<year>2001</year>
<holder>Le groupe du projet de documentation FreeBSD</holder>
</copyright>
&bookinfo.legalnotice;
<abstract>
<para>Bienvenue dans le livre de chevet du d&eacute;veloppeur</para>
&trans.a.praca;
<para>N.d.T.: La version fran&ccedil;aise est publi&eacute;e sur le
<ulink url="&url.base;/">serveur World Wide Web du groupe de
traduction en langue fran&ccedil;aise de la documentation de
FreeBSD</ulink>.</para>
<para>N.d.T.: Contactez la &a.fr-doc si vous voulez collaborer
&agrave; la traduction.</para>
<para>La traduction de ce manuel est &ldquo;en cours&rdquo;. Dans la
table des mati&egrave;res ci-dessous:
<itemizedlist>
<listitem>
<para>Les chapitres marqu&eacute;s de deux ast&eacute;risques
sont en cours de traduction.</para>
</listitem>
<listitem>
<para>Les chapitres marqu&eacute;s de trois ast&eacute;risques
sont &agrave; traduire.</para>
</listitem>
<listitem>
<para>L'ast&eacute;risque simple est r&eacute;serv&eacute; aux
chapitres et sections en cours de r&eacute;daction dans la
version U.S.</para>
</listitem>
</itemizedlist>
</para>
</abstract>
</bookinfo>
<part id="introduction">
<title>Introduction</title>
<chapter id="developmentplatform">
<title>D&#233;velopper sous FreeBSD</title>
<para>Ce document a pour but de d&eacute;crire FreeBSD comme une plateforme
de d&eacute;veloppement, la vision de BSD, un survol de l'architecture, l'agencement
de /usr/src, l'histoire, etc.</para>
<para>Merci d'adopter FreeBSD comme votre plateforme
de développement ! Nous esp&eacute;rons qu'elle ne vous laissera pas tomber.</para>
</chapter>
<chapter id="bsdvision">
<title>La vision BSD</title>
<para></para>
</chapter>
<chapter id="archoverview">
<title>Survol de l'architecture</title>
<para></para>
</chapter>
<chapter id="sourcelayout">
<title>L'agencement de /usr/src</title>
<para>Le code source complet de FreeBSD est disponible depuis notre
base CVS publique. Le code source est normalement install&eacute; sous
<filename class=directory>/usr/src</filename> qui contient les
sous-r&eacute;pertoires suivants.</para>
<para>
<informaltable frame="none">
<tgroup cols="2">
<thead>
<row>
<entry>R&eacute;pertoire</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><filename class=directory>bin/</filename></entry>
<entry>Sources des fichiers de
<filename>/bin</filename></entry>
</row>
<row>
<entry><filename class=directory>contrib/</filename></entry>
<entry>Sources des fichiers des logiciels fournis ("contributed").</entry>
</row>
<row>
<entry><filename class=directory>crypto/</filename></entry>
<entry>Sources du DES</entry>
</row>
<row>
<entry><filename class=directory>etc/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/etc</filename></entry>
</row>
<row>
<entry><filename class=directory>games/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/usr/games</filename></entry>
</row>
<row>
<entry><filename class=directory>gnu/</filename></entry>
<entry>Utilitaires sous licence publique GNU</entry>
</row>
<row>
<entry><filename class=directory>include/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/usr/include</filename></entry>
</row>
<row>
<entry><filename
class=directory>kerberosIV/</filename></entry>
<entry>Sources de Kerbereros version IV</entry>
</row>
<row>
<entry><filename
class=directory>kerberos5/</filename></entry>
<entry>Sources de Kerbereros version 5</entry>
</row>
<row>
<entry><filename class=directory>lib/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/usr/lib</filename></entry>
</row>
<row>
<entry><filename class=directory>libexec/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/usr/libexec</filename></entry>
</row>
<row>
<entry><filename
class=directory>release/</filename></entry>
<entry>Fichiers requis pour la production d'une version
stable de FreeBSD</entry>
</row>
<row>
<entry><filename class=directory>sbin/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/sbin</filename></entry>
</row>
<row>
<entry><filename class=directory>secure/</filename></entry>
<entry>Sources de FreeSec</entry>
</row>
<row>
<entry><filename class=directory>share/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/sbin</filename></entry>
</row>
<row>
<entry><filename class=directory>sys/</filename></entry>
<entry>Fichiers source du noyau</entry>
</row>
<row>
<entry><filename class=directory>tools/</filename></entry>
<entry>Outils utilis&eacute;s pour la maintenance et les tests de
FreeBSD</entry>
</row>
<row>
<entry><filename
class=directory>usr.bin/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/usr/bin</filename></entry>
</row>
<row>
<entry><filename
class=directory>usr.sbin/</filename></entry>
<entry>Sources des fichiers de <filename
class=directory>/usr/sbin</filename></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</chapter>
</part>
<part id="Basics">
<title>Les fondamentaux</title>
&chap.tools;
&chap.secure;
</part>
<part id="kernel">
<title>Le noyau</title>
<chapter id="kernelhistory">
<title>Histoire du noyau Unix</title>
<para>Un peu d'histoire sur le noyau Unix/BSD, les appels syst&egrave;me, comment
fonctionnent les processus, bloquer, planifier, les threads (noyau),
le basculement de contexte, les signaux, les interruptions, les modules, etc.</para>
<para></para>
</chapter>
&chap.locking;
</part>
<part id="memory">
<title>M&#233;moire et m&#233;moire virtuelle</title>
<chapter id="virtualmemory">
<title>La m&#233;moire virtuelle</title>
<para>MV, gestion par page, gestion sur disque, allouer de la m&eacute;moire, tester les
fuites de m&eacute;moires, mmap, vnodes, etc.</para>
<para></para>
</chapter>
</part>
<part id="iosystem">
<title>Syst&#232;me E/S (Entr&#233;es/Sorties)</title>
<chapter id="ufs">
<title>UFS</title>
<para>UFS, FFS, Ext2FS, JFS, inodes, m&eacute;moire tampon, mettre à jour les donn&eacute;es d'un disque,
verrouillage, metadata, soft-updates, LFS, portalfs, procfs,
vnodes, partage de m&eacute;moire, objets en mémoire, TLBs, mettre en cache</para>
</chapter>
</part>
<part id="ipc">
<title>Communication InterProcessus (IPC)</title>
<chapter id="signals">
<title>Les signaux</title>
<para>Signaux, tubes, s&eacute;maphores, files de message, segments de m&eacute;moire partagée,
ports, prises, portes</para>
</chapter>
</part>
<part id="networking">
<title>Le r&#233;seau</title>
<chapter id="sockets">
<title>Les prises</title>
<para>Prises, bpf, IP, TCP, UDP, ICMP, OSI, ponts,
pare-feux, translation d'adresses (NAT), s&eacute;paration de r&eacute;seaux, etc</para>
</chapter>
</part>
<part id="networkfs">
<title>Syst&#232;mes de fichiers en r&#233;seau</title>
<chapter id="afs">
<title>AFS</title>
<para>AFS, NFS, SANs etc]</para>
</chapter>
</part>
<part id="terminal">
<title>Gestion du terminal</title>
<chapter id="syscons">
<title>Syscons</title>
<para>Syscons, tty, PCVT, console en liaison s&eacute;rie, &eacute;conomiseurs d'écran,
etc</para>
</chapter>
</part>
<part id="sound">
<title>Le son</title>
<chapter id="oss">
<title>OSS</title>
<para>OSS, formes d'ondes, etc</para>
</chapter>
</part>
<part id="devicedrivers">
<title>Pilotes de p&#233;riph&#233;rique</title>
&chap.driverbasics;
&chap.pci;
&chap.scsi;
&chap.usb;
<chapter id="newbus">
<title>NewBus</title>
<para>Ce chap&icirc;tre traitera de l'architecture NewBus de FreeBSD.</para>
</chapter>
</part>
<part id="architectures">
<title>Architectures</title>
<chapter id="ia32">
<title>IA-32</title>
<para>Traite des sp&eacute;cificit&eacute;s de l'architecture x86 sous FreeBSD.</para>
</chapter>
<chapter id="alpha">
<title>Alpha</title>
<para>Traite des sp&eacute;cificit&eacute;s de l'architecture Alpha sous FreeBSD.</para>
<para>Explication des erreurs d'alignements, comment les r&eacute;parer,
comment les ignorer.</para>
<para>Exemple de code assembleur pour FreeBSD/alpha.</para>
</chapter>
<chapter id="ia64">
<title>IA-64</title>
<para>Traite des sp&eacute;cificit&eacute;s de l'architecture IA-64 sous FreeBSD.</para>
</chapter>
</part>
<part id="debuggingpart">
<title>D&#233;verminage</title>
<chapter id="truss">
<title>Truss</title>
<para>diverses descriptions sur les m&eacute;thodes de déverminage de certains aspects
du syst&egrave;me utilisant truss, ktrace, gdb, kgdb, etc</para>
</chapter>
</part>
<part id="compatibility">
<title>Les couches de compatibilit&#233;</title>
<chapter id="linux">
<title>Linux</title>
<para>Linux, SVR4, etc</para>
</chapter>
</part>
<part id="appendices">
<title>Bibligraphie</title>
<bibliography>
<biblioentry id="COD" xreflabel="1">
<authorgroup>
<author>
<firstname>Dave</firstname>
<othername role="MI">A</othername>
<surname>Patterson</surname>
</author>
<author>
<firstname>John</firstname>
<othername role="MI">L</othername>
<surname>Hennessy</surname>
</author>
</authorgroup>
<copyright><year>1998</year><holder>Morgan Kaufmann Publishers,
Inc.</holder></copyright>
<isbn>1-55860-428-6</isbn>
<publisher>
<publishername>Morgan Kaufmann Publishers, Inc.</publishername>
</publisher>
<title>Computer Organization and Design</title>
<subtitle>The Hardware / Software Interface</subtitle>
<pagenums>1-2</pagenums>
</biblioentry>
<biblioentry xreflabel="2">
<authorgroup>
<author>
<firstname>W.</firstname>
<othername role="Middle">Richard</othername>
<surname>Stevens</surname>
</author>
</authorgroup>
<copyright><year>1993</year><holder>Addison Wesley Longman,
Inc.</holder></copyright>
<isbn>0-201-56317-7</isbn>
<publisher>
<publishername>Addison Wesley Longman, Inc.</publishername>
</publisher>
<title>Advanced Programming in the Unix Environment</title>
<pagenums>1-2</pagenums>
</biblioentry>
<biblioentry xreflabel="3">
<authorgroup>
<author>
<firstname>Marshall</firstname>
<othername role="Middle">Kirk</othername>
<surname>McKusick</surname>
</author>
<author>
<firstname>Keith</firstname>
<surname>Bostic</surname>
</author>
<author>
<firstname>Michael</firstname>
<othername role="MI">J</othername>
<surname>Karels</surname>
</author>
<author>
<firstname>John</firstname>
<othername role="MI">S</othername>
<surname>Quarterman</surname>
</author>
</authorgroup>
<copyright><year>1996</year><holder>Addison-Wesley Publishing Company,
Inc.</holder></copyright>
<isbn>0-201-54979-4</isbn>
<publisher>
<publishername>Addison-Wesley Publishing Company, Inc.</publishername>
</publisher>
<title>The Design and Implementation of the 4.4 BSD Operating System</title>
<pagenums>1-2</pagenums>
</biblioentry>
<biblioentry id="Phrack" xreflabel="4">
<authorgroup>
<author>
<firstname>Aleph</firstname>
<surname>One</surname>
</author>
</authorgroup>
<title>Phrack 49; "Smashing the Stack for Fun and Profit"</title>
</biblioentry>
<biblioentry id="StackGuard" xreflabel="5">
<authorgroup>
<author>
<firstname>Chrispin</firstname>
<surname>Cowan</surname>
</author>
<author>
<firstname>Calton</firstname>
<surname>Pu</surname>
</author>
<author>
<firstname>Dave</firstname>
<surname>Maier</surname>
</author>
</authorgroup>
<title>StackGuard; Automatic Adaptive Detection and Prevention of
Buffer-Overflow Attacks</title>
</biblioentry>
<biblioentry id="OpenBSD" xreflabel="6">
<authorgroup>
<author>
<firstname>Todd</firstname>
<surname>Miller</surname>
</author>
<author>
<firstname>Theo</firstname>
<surname>de Raadt</surname>
</author>
</authorgroup>
<title>strlcpy and strlcat -- consistent, safe string copy and
concatenation.</title>
</biblioentry>
</bibliography>
</part>
</book>

View file

@ -0,0 +1,64 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: chapters.ent,v 1.1 2002-02-14 14:25:01 gioria Exp $
Original revision: 1.4
Creates entities for each chapter in the FreeBSD Developer's
Handbook. Each entity is named chap.foo, where foo is the value
of the id attribute on that chapter, and corresponds to the name of
the directory in which that chapter's .sgml file is stored.
Chapters should be listed in the order in which they are referenced.
$FreeBSD$
-->
<!-- Part one -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part two -->
<!ENTITY chap.tools SYSTEM "tools/chapter.sgml">
<!ENTITY chap.secure SYSTEM "secure/chapter.sgml">
<!-- Part three -->
<!-- No significant material yet, still in book.sgml -->
<!ENTITY chap.locking SYSTEM "locking/chapter.sgml">
<!-- Part four -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part five -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part six -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part seven -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part eight -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part nine -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part ten -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part eleven -->
<!ENTITY chap.driverbasics SYSTEM "driverbasics/chapter.sgml">
<!ENTITY chap.pci SYSTEM "pci/chapter.sgml">
<!ENTITY chap.scsi SYSTEM "scsi/chapter.sgml">
<!ENTITY chap.usb SYSTEM "usb/chapter.sgml">
<!-- Part twelve -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part thirteen -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part fourteen -->
<!-- No significant material yet, still in book.sgml -->
<!-- Part fifteen (appendices) -->
<!ENTITY chap.bibliography SYSTEM "bibliography/chapter.sgml">

View file

@ -0,0 +1,383 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: chapter.sgml,v 1.1 2002-02-14 14:25:02 gioria Exp $
Original revision: 1.5
$FreeBSD$
-->
<chapter id="driverbasics">
<title>Ecrire des pilotes de p&#233;riph&#233;riques pour FreeBSD</title>
<para>Ce chap&icirc;tre a &eacute;t&eacute; &eacute;crit par &.murray avec des s&eacute;lections
depuis une vari&eacute;t&eacute; de codes source inclus dans la page de manuel d'intro(4) de Joerg
Wunsch.</para>
<sect1>
<title>Introduction</title>
<para>Ce chap&icirc;tre fournit une br&ecirc;ve introduction sur l'&eacute;criture
de pilotes de p&eacute;riph&eacute;riques pourFreeBSD.
Un p&eacute;riph&eacute;rique, dans ce contexte, est un terme utilis&eacute;
le plus souvent pour tout ce qui est li&eacute; au mat&eacute;riel et qui d&eacute;pend
du syst&egrave;me, comme les disques, imprimantes, ou un &eacute;cran avec son clavier.
Un pilote de p&eacute;riph&eacute;rique est un composant logiciel du syst&egrave;me
d'exploitation qui contr&ocirc;le un p&eacute;riph&eacute;rique sp&eacute;cifique. Il y a aussi
ce que l'on apelle les pseudo-p&eacute;riph&eacute;riques ("pseudo-devices") o&ugrave; un pilote
de p&eacute;riph&eacute;rique &eacute;mule le comportement d'un p&eacute;riph&eacute;rique dans un logiciel sans
mat&eacute;riel particulier sous-jacent. Les pilotes de p&eacute;riph&eacute;riques peuvent &ecirc;tre compil&eacute;s
dans le yst&egrave;me statiquement ou charg&eacute; &agrave; la demande via l'&eacute;diteur de liens dynamique du
noyau `kld'.</para>
<para>La plupart des p&eacute;riph&eacute;riques dans un syst&egrave;me d'exploitation de type Unix
sont accessibles au travers de fichiers sp&eacute;ciaux de p&eacute;riph&eacute;rique (device-nodes), appel&eacute;s parfois
fichiers sp&eacute;ciaux. Ces fichiers sont habituellement stock&eacute;s dans le r&eacute;pertoire
<filename>/dev</filename> de la hi&eacute;rarchie du syst&egrave;me de fichiers. Jusqu'&agrave; ce que
devfs soit totalement int&eacute;gr&eacute; dans FreeBSD, chaque fichier sp&eacute;cial de p&eacute;riph&eacute;rique doit &ecirc;tre
cr&eacute;&eacute; statiquement et ind&eacute;pendamment de l'existence du pilote de p&eacute;riph&eacute;rique associ&eacute;.
La plupart des fichiers sp&eacute;ciaux de p&eacute;riph&eacute;rique du syst&egrave;me sont cr&eacute;&eacute;s en ex&eacute;cutant <command>MAKEDEV</command>.</para>
<para>Les pilotes de p&eacute;riph&eacute;rique peuvent &ecirc;tre en gros s&eacute;par&eacute;s en deux cat&eacute;gories;
les pilotes de p&eacute;riph&eacute;rique en mode caract&egrave;re et les pilotes de p&eacute;riph&eacute;riques r&eacute;seau.</para>
</sect1>
<sect1>
<title>L'&#233;diteur de liens dynamiques du noyau - KLD</title>
<!-- Traduction &agrave; v&eacute;rifier
Dynamic Kernel Linker Facility - KLD</title> -->
<para>L'interface kld permet aux administrateurs syst&egrave;me d'ajouter
et d'enlever dynamiquement une fonctionnalit&eacute; &agrave; un syst&egrave;me en marche.
Cela permet aux d&eacute;veloppeurs de pilote de p&eacute;riph&eacute;rique de charger leurs nouveaux changements
dans le noyau en fonctionnement sans red&eacute;marrer constamment pour tester ces derniers.
</para>
<para>L'interface kld est utilis&eacute; au travers des commandes d'administrateur suivantes :
<itemizedlist>
<listitem><simpara><command>kldload</command> - charge un nouveau module dans le noyau</simpara></listitem>
<listitem><simpara><command>kldunload</command> - d&eacute;charge un module du noyau</simpara></listitem>
<listitem><simpara><command>kldstat</command> - liste les modules charg&eacute;s dans le noyau</simpara></listitem>
</itemizedlist>
</para>
<para>Structure squelettique d'un module de noyau</para>
<programlisting>/*
* Squelette KLD
* Inspir&eacute; de l'article d'Andrew Reiter paru sur Daemonnews
*/
#include &lt;sys/types.h&gt;
#include &lt;sys/module.h&gt;
#include &lt;sys/systm.h&gt; /* uprintf */
#include &lt;sys/errno.h&gt;
#include &lt;sys/param.h&gt; /* defines utilise dans kernel.h */
#include &lt;sys/kernel.h&gt; /* types utilise dans le module d'initialisation */
/*
* charge le gestionnaire quit traite du chargement et d&eacute;chargement d'un KLD.
*/
static int
skel_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD: /* kldload */
<!-- D&eacute;sol&eacute;, les accents n'existent pas dans la console alors je ne les ai pas mis l&agrave; non plus
-->
uprintf("Skeleton KLD charge.\n");
break;
case MOD_UNLOAD:
uprintf("Skeleton KLD decharge.\n");
break;
default:
err = EINVAL;
break;
}
return(err);
}
/* Declare ce module au reste du noyau */
DECLARE_MODULE(skeleton, skel_loader, SI_SUB_KLD, SI_ORDER_ANY);</programlisting>
<sect2>
<title>Makefile</title>
<para>FreeBSD fournit un fichier d'inclusion "makefile" que vous pouvez utiliser pour
compiler rapidement votre ajout au noyau.</para>
<programlisting>SRCS=skeleton.c
KMOD=skeleton
.include &lt;bsd.kmod.mk&gt;</programlisting>
<para>Lancer simplement la commande <command>make</command> avec ce fichier Makefile
cr&eacute;era un fichier <filename>skeleton.ko</filename> qui peut
&ecirc;tre charg&eacute; dans votre syst&egrave;me en tapant :
<screen> &prompt.root
kldload -v ./skeleton.ko
</screen>
</para>
</sect2>
</sect1>
<sect1>
<title>Acc&#233;der au pilote d'un p&#233;riph&#233;rique</title>
<para>Unix fournit un ensemble d'appels syt&egrave;me communs utilisable par
les applications de l'utilisateur. Les couches sup&eacute;rieures du noyau renvoient
ces appels au pilote de p&eacute;riph&eacute;rique correspondant quand un utilisateur
acc&egrave;de au fichier sp&eacute;cial de p&eacute;riph&eacute;rique. Le script <command>/dev/MAKEDEV</command>
cr&eacute;e la plupart des fichiers sp&eacute;ciaux de p&eacute;riph&eacute;rique pour votre syst&egrave;me mais si vous
faites votre propre d&eacute;veloppement de pilote, il peut &ecirc;tre n&eacute;cessaire de cr&eacute;er
vos propres fichiers sp&eacute;ciaux de p&eacute;riph&eacute;rique avec la commande <command>mknod</command>
</para>
<sect2>
<title>Cr&#233;er des fichiers sp&#233;ciaux de p&#233;riph&#233;riques statiques</title>
<para>La commande <command>mknod</command> n&eacute;cessite quatre
arguments pou cr&eacute;er un fichier sp&eacute;cial de p&eacute;riph&eacute;rique. Vous devez sp&eacute;cifier le nom
de ce fichier sp&eacute;cial de p&eacute;riph&eacute;rique, le type de p&eacute;riph&eacute;rique, le num&eacute;ro majeur
et le num&eacute;ro mineur du p&eacute;riph&eacute;rique.</para>
</sect2>
<sect2>
<title>Les fichiers sp&#233;ciaux de p&#233;riph&#233;rique dynamiques</title>
<para>Le p&eacute;riph&eacute;rique syst&egrave;me de fichiers, ou devfs, fournit l'acc&egrave;s &agrave;
l'espace des noms des p&eacute;riph&eacute;riques du noyau dans l'espace du syst&egrave;me de fichiers global.
Ceci &eacute;limine les probl&egrave;mes de pilote sans fichier sp&eacute;cial statique, ou de fichier sp&eacute;cial sans pilote install&eacute;.
Devfs est toujours un travail en cours mais il fonctionne d&eacute;j&agrave; assez bien.</para>
</sect2>
</sect1>
<sect1>
<title>Les p&#233;riph&#233;riques caract&#232;res</title>
<para>Un pilote de p&eacute;riph&eacute;rique caract&egrave;re est un pilote qui tranf&egrave;re les donn&eacute;es
directement au processus utilisateur ou vers celui-ci. Il s'agit du plus commun
des types de pilote de p&eacute;riph&eacute;rique et il y en a plein d'exemples simples dans
l'arbre des sources.</para>
<para>Cet exemple simple de pseudo-p&eacute;riph&eacute;rique enregistre toutes les valeurs
que vous lui avez &eacute;crites et peut vous les renvoyer quand vous les lui
demandez.</para>
<programlisting>/*
* un simple pseudo-p&eacute;riph&eacute;rique `echo' KLD
*
* Murray Stokely
*/
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#include &lt;sys/types.h&gt;
#include &lt;sys/module.h&gt;
#include &lt;sys/systm.h&gt; /* uprintf */
#include &lt;sys/errno.h&gt;
#include &lt;sys/param.h&gt; /* defines utilises dans kernel.h */
#include &lt;sys/kernel.h&gt; /* types utilises dans me module d'initialisation */
#include &lt;sys/conf.h&gt; /* cdevsw struct */
#include &lt;sys/uio.h&gt; /* uio struct */
#include &lt;sys/malloc.h&gt;
#define BUFFERSIZE 256
/* Prototypes des fonctions */
d_open_t echo_open;
d_close_t echo_close;
d_read_t echo_read;
d_write_t echo_write;
/* Points d'entr&eacute;e du p&eacute;riph&eacute;rique Caract&egrave;re */
static struct cdevsw echo_cdevsw = {
echo_open,
echo_close,
echo_read,
echo_write,
noioctl,
nopoll,
nommap,
nostrategy,
"echo",
33, /* reserve pour lkms - /usr/src/sys/conf/majors */
nodump,
nopsize,
D_TTY,
-1
};
typedef struct s_echo {
char msg[BUFFERSIZE];
int len;
} t_echo;
/* variables */
static dev_t sdev;
static int len;
static int count;
static t_echo *echomsg;
MALLOC_DECLARE(M_ECHOBUF);
MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "cache pour le module echo");
/*
* Cette fonction est appele par les appels systeme kld[un]load(2) pour
* determiner quelles actions doivent etre faites quand le
* module est charge ou decharge
*/
static int
echo_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD: /* kldload */
sdev = make_dev(<literal>&</literal>echo_cdevsw,
0,
UID_ROOT,
GID_WHEEL,
0600,
"echo");
/* aloocation de m&eacute;moire noyau pour l'utilisation de ce module */
/* malloc(256,M_ECHOBUF,M_WAITOK); */
MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK);
printf("Peripherique Echo charge.\n");
break;
case MOD_UNLOAD:
destroy_dev(sdev);
FREE(echomsg,M_ECHOBUF);
printf("Peripherique Echo decharge.\n");
break;
default:
err = EINVAL;
break;
}
return(err);
}
int
echo_open(dev_t dev, int oflags, int devtype, struct proc *p)
{
int err = 0;
uprintf("Peripherique \"echo\" ouvert avec succes.\n");
return(err);
}
int
echo_close(dev_t dev, int fflag, int devtype, struct proc *p)
{
uprintf("Fermeture du peripherique \"echo.\"\n");
return(0);
}
/*
* La fonction read prend juste comme parametre
* le cache qui a ete sauve par l'appel &agrave; echo_write()
* et le retourne a l'utilisateur pour acces.
* uio(9)
*/
int
echo_read(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
int amt;
/* De quelle taille est cette operation read ? Aussi grande que l'utilisateur le veut,
ou aussi grande que les donnees restantes */
amt = MIN(uio->uio_resid, (echomsg->len - uio->uio_offset > 0) ? echomsg->len - uio->uio_offset : 0);
if ((err = uiomove(echomsg->msg + uio->uio_offset,amt,uio)) != 0) {
uprintf("uiomove echoue!\n");
}
return err;
}
/*
* echo_write prend un caractere en entree et le sauve
* dans le cache pour une utilisation ulterieure.
*/
int
echo_write(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
/* Copie la chaine d'entree de la memoire de l'utilisateur a la memoire du noyau*/
err = copyin(uio->uio_iov->iov_base, echomsg->msg, MIN(uio->uio_iov->iov_len,BUFFERSIZE));
/* Maintenant nous avons besoin de terminer la chaine par NULL */
*(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE)) = 0;
/* Enregistre la taille */
echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE);
if (err != 0) {
uprintf("Ecriture echouee: mauvaise adresse!\n");
}
count++;
return(err);
}
DEV_MODULE(echo,echo_loader,NULL);</programlisting>
<para>Pour installer ce pilote, vous devrez d'abord cr&eacute;er un fichier sp&eacute;cial dans
votre syst&egrave;me de fichiers avec une commande comme : </para>
<screen>
&prompt.root mknod /dev/echo c 33 0
</screen>
<para>Avec ce pilote charg&eacute;, vous devriez maintenant &ecirc;tr capable de taper
quelque chose comme :</para>
<screen>
&prompt.root echo -n "Test Donnees" > /dev/echo
&prompt.root cat /dev/echo
Test Donnees
</screen>
<para>P&eacute;riph&eacute;riques r&eacute;els dans le chap&icirc;tre suivant.</para>
<para>Informations additionnelles
<itemizedlist>
<listitem><simpara><ulink
url="http://www.daemonnews.org/200010/blueprints.html">Dynamic
Kernel Linker (KLD) Facility Programming Tutorial</ulink> -
<ulink url="http://www.daemonnews.org">Daemonnews</ulink> October 2000</simpara></listitem>
<listitem><simpara><ulink
url="http://www.daemonnews.org/200007/newbus-intro.html">How
to Write Kernel Drivers with NEWBUS</ulink> - <ulink
url="http://www.daemonnews.org">Daemonnews</ulink> July
2000</simpara></listitem>
</itemizedlist>
</para>
</sect1>
<sect1>
<title>Pilotes R&#233;seau</title>
<para>Les pilotes pour p&eacute;riph&eacute;rique r&eacute;seau n'utilisent pas les fichiers sp&eacute;ciaux pour
pouvoir &ecirc;tre acessibles. Leur s&eacute;lection est bas&eacute;e sur d'autres d&eacute;cisions
faites &agrave; l'int&eacute;rieur du noyau et plut&ocirc;t que d'appeler open(), l'utilisation
d'un p&eacute;riph&eacute;rique r&eacute;seau se fait g&eacute;n&eacute;ralement en se servant de l'appel syst&egrave;me
socket(2).</para>
<para>man ifnet(), p&eacute;riph&eacute;rique "en boucle", drivers de Bill Paul,
etc..</para>
</sect1>
</chapter>

View file

@ -0,0 +1,335 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
The FreeBSD SMP Next Generation Project
$Id: chapter.sgml,v 1.1 2002-02-14 14:25:02 gioria Exp $
Original revision: 1.2
$FreeBSD$
-->
<chapter id="locking">
<title>Notes sur le verrouillage</title>
<para><emphasis>Ce chap&icirc;tre est maintenu par The FreeBSD SMP Next
Generation Project
<email>freebsd-smp@FreeBSD.org</email>.</emphasis></para>
<para>Ce document souligne le verrouillage utilis&eacute; dans le noyau FreeBSD
pour permettre d'utiliser du vrai multi-processeur &agrave; l'int&eacute;rieur du noyau.
Le verrouillage peut &ecirc;tre r&eacute;alis&eacute; par diff&eacute;rents moyens.
Les structures de donn&eacute;es puvent &ecirc;tre prot&eacute;g&eacute;es par des mutex ou &man.lockmgr.9; verrous.
Quelques variables sont prot&eacute;g&eacute;es simplement par l'utilisation continuelle d'op&eacute;rations
atomiques pour y acc&eacute;der.
</para>
<sect1>
<title>Les mutex</title>
<para>Un mutex est simplement un verrou utilis&eacute; pour garantir exclusion mutuelle.
Sp&eacute;cifiquement, un mutex ne peut appartenir qu'&agrave; une entit&eacute; &agrave; la fois.
Si une autre entit&eacute; d&eacute;sire obtenir un mutex d&eacute;j&agrave; pris
, elle doit attendre jusqu'&agrave; ce que le mutex soit relach&eacute;. Dans le noyau
FreeBSD, les mutex appartiennent aux processus.</para>
<para>Les mutex peuvent &ecirc;tre acquis r&eacute;cursivement, mais ils sont conçus
pour n'&ecirc;tre pris que pendant une courte p&eacute;riode. Sp&eacute;cifiquement, le d&eacute;tenteur
ne doit pas se suspendre pendant qu'il retient un mutex. Si vous avez besoin de
maintenir un verrouillage pendant une suspension, utilisez un &man.lockmgr.9; verrou ("lock").</para>
<para>Chaque mutex a plusieurs int&eacute;r&ecirc;ts :</para>
<variablelist>
<varlistentry>
<term>Nom de la variable</term>
<listitem>
<para>Nom de la variable <type>struct mtx</type> dans
le code source du noyau.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Nom logique</term>
<listitem>
<para>Le nom du mutex lui est assign&eacute; par
<function>mtx_init</function>. Ce nom est affich&eacute; dans
les messages de trace KTR, t&eacute;moigne des erreurs et avertissements et est
utilis&eacute; pour distinguer les mutex dans les traces.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Type</term>
<listitem>
<para>Le type du mutex en termes de constantes nomm&eacute;es
<constant>MTX_*</constant>. La signification de chaque
constante nomm&eacute;e est document&eacute;e dans &man.mutex.9;.</para>
<variablelist>
<varlistentry>
<term><constant>MTX_DEF</constant></term>
<listitem>
<para>Un mutex endormi</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_SPIN</constant></term>
<listitem>
<para>Un mutex tournant</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_COLD</constant></term>
<listitem>
<para>Ce mutex est initialis&eacute; tr&egrave;s tard. Toutefois, il
doit &ecirc;tre d&eacute;clar&eacute; via
<function>MUTEX_DECLARE</function>, et la constante nomm&eacute;e
<constant>MTX_COLD</constant> doit &ecirc;tre pass&eacute;e &agrave;
<function>mtx_init</function>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_TOPHALF</constant></term>
<listitem>
<para>Ce mutex tournant ne d&eacute;sactive pas les
interruptions.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_NORECURSE</constant></term>
<listitem>
<para>Ce mutex n'a pas la permission d'&ecirc;tre recursif.</para>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>Prot&eacute;g&eacute;s</term>
<listitem>
<para>Une liste de structures de donn&eacute;es ou des membres de structure de donn&eacute;es
que cette entr&eacute;e prot&egrave;ge. Pour les membres de structures de donn&eacute;es,
le nom sera de la forme <structname/structure name/.<structfield/member name/.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Fonctions d&eacute;pendantes</term>
<listitem>
<para>Les fonctions qui peuvent seulement &ecirc;tre appel&eacute;es si ce mutex est
pris.</para>
</listitem>
</varlistentry>
</variablelist>
<table frame="all" colsep="1" rowsep="1" pgwide="1">
<title>Liste du mutex</title>
<tgroup cols="5">
<thead>
<row>
<entry>Nom de la variable</entry>
<entry>Nom logique</entry>
<entry>Type</entry>
<entry>Prot&eacute;g&eacute;s</entry>
<entry>Fonctions d&eacute;pendantes</entry>
</row>
</thead>
<!-- The scheduler lock -->
<tbody>
<row>
<entry>sched_lock</entry>
<entry><quote>sched lock</quote></entry>
<entry>
<constant>MTX_SPIN</constant> |
<constant>MTX_COLD</constant>
</entry>
<entry>
<varname>_gmonparam</varname>,
<varname>cnt.v_swtch</varname>,
<varname>cp_time</varname>,
<varname>curpriority</varname>,
<structname/mtx/.<structfield/mtx_blocked/,
<structname/mtx/.<structfield/mtx_contested/,
<structname/proc/.<structfield/p_contested/,
<structname/proc/.<structfield/p_blocked/,
<structname/proc/.<structfield/p_flag/
(<constant>P_PROFIL</constant> XXX,
<constant>P_INMEM</constant>,
<constant>P_SINTR</constant>,
<constant>P_TIMEOUT</constant>,
<constant>P_SWAPINREQ</constant> XXX,
<constant>P_INMEN</constant> XXX),
<structname/proc/.<structfield/p_nice/,
<structname/proc/.<structfield/p_procq/,
<structname/proc/.<structfield/p_blocked/,
<structname/proc/.<structfield/p_estcpu/,
<structname/proc/.<structfield/p_nativepri/,
<structname/proc/.<structfield/p_priority/,
<structname/proc/.<structfield/p_usrpri/,
<structname/proc/.<structfield/p_rtprio/,
<structname/proc/.<structfield/p_rqindex/,
<structname/proc/.<structfield/p_stats->p_prof/,
<structname/proc/.<structfield/p_stats->p_ru/,
<structname/proc/.<structfield/p_stat/,
<structname/proc/.<structfield/p_cpticks/
<structname/proc/.<structfield/p_iticks/,
<structname/proc/.<structfield/p_uticks/,
<structname/proc/.<structfield/p_sticks/,
<structname/proc/.<structfield/p_swtime/,
<structname/proc/.<structfield/p_slptime/,
<structname/proc/.<structfield/p_runtime/,
<structname/proc/.<structfield/p_pctcpu/,
<structname/proc/.<structfield/p_oncpu/,
<structname/proc/.<structfield/p_asleep/,
<structname/proc/.<structfield/p_wchan/,
<structname/proc/.<structfield/p_wmesg/,
<structname/proc/.<structfield/p_slpq/,
<structname/proc/.<structfield/p_vmspace/
(XXX - in <function>statclock</function>),
<varname>pscnt</varname>,
<varname>slpque</varname>,
<varname>itqueuebits</varname>,
<varname>itqueues</varname>,
<varname>rtqueuebits</varname>,
<varname>rtqueues</varname>,
<varname>queuebits</varname>,
<varname>queues</varname>,
<varname>idqueuebits</varname>,
<varname>idqueues</varname>,
<varname>switchtime</varname>,
</entry>
<entry>
<function>setrunqueue</function>,
<function>remrunqueue</function>,
<function>mi_switch</function>,
<function>chooseproc</function>,
<function>schedclock</function>,
<function>resetpriority</function>,
<function>updatepri</function>,
<function>maybe_resched</function>,
<function>cpu_switch</function>,
<function>cpu_throw</function>
</entry>
</row>
<!-- The vm86 pcb lock -->
<row>
<entry>vm86pcb_lock</entry>
<entry><quote>vm86pcb lock</quote></entry>
<entry>
<constant>MTX_DEF</constant> |
<constant>MTX_COLD</constant>
</entry>
<entry>
<varname>vm86pcb</varname>
</entry>
<entry>
<function>vm86_bioscall</function>
</entry>
</row>
<!-- Giant -->
<row>
<entry>Giant</entry>
<entry><quote>Giant</quote></entry>
<entry>
<constant>MTX_DEF</constant> |
<constant>MTX_COLD</constant>
</entry>
<entry>nearly everything</entry>
<entry>lots</entry>
</row>
<!-- The callout lock -->
<row>
<entry>callout_lock</entry>
<entry><quote>callout lock</quote></entry>
<entry>
<constant>MTX_SPIN</constant>
</entry>
<entry>
<varname>callfree</varname>,
<varname>callwheel</varname>,
<varname>nextsoftcheck</varname>,
<structname/proc/.<structfield/p_itcallout/,
<structname/proc/.<structfield/p_slpcallout/,
<varname>softticks</varname>,
<varname>ticks</varname>
</entry>
<entry>
</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1>
<title>Les verrous du gestionnaire de verrous (Lock Manager)</title>
<para>Les verrous qui sont fournis par l'interface &man.lockmgr.9;
sont les verrous du gestionnaire de verrous. Ces verrous sont des verrous
lecture-&eacute;criture et peuvent &ecirc;tre retenus par un process suspendu.
</para>
<table>
<title>&man.lockmgr.9; List de verrou</title>
<tgroup cols="2">
<thead>
<row>
<entry>Nom de la variable</entry>
<entry>Prot&eacute;g&eacute;s</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>allproc_lock</varname></entry>
<entry>
<varname>allproc</varname>
<varname>zombproc</varname>
<varname>pidhashtbl</varname>
<structname/proc/.<structfield/p_list/
<structname/proc/.<structfield/p_hash/
<varname>nextpid</varname>
</entry>
<entry><varname>proctree_lock</varname></entry>
<entry>
<structname/proc/.<structfield/p_children/
<structname/proc/.<structfield/p_sibling/
</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1>
<title>Variables prot&#233;g&#233;es atomiquement</title>
<para>Une variable prot&eacute;g&eacute;e atomiquement est une variable sp&eacute;ciale qui
n'est pas prot&eacute;g&eacute; par un verrou explicite. Toutefois, tous les acc&egrave;s de
donn&eacute;es aux variables utilisent des op&eacute;rations atomiques sp&eacute;ciales
comme d&eacute;crit dans &man.atomic.9;. Tr&egrave;s peu de variables sont trait&eacute;es
de cette façon, bien que les autres primitives de synchronisation comme
les mutex soient impl&eacute;ment&eacute;es avec des variables prot&eacute;g&eacute;es atomiquement.</para>
<itemizedlist>
<listitem>
<para><varname>astpending</varname></para>
</listitem>
<listitem>
<para><structname/mtx/.<structfield/mtx_lock/</para>
</listitem>
</itemizedlist>
</sect1>
</chapter>

View file

@ -0,0 +1,376 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: chapter.sgml,v 1.1 2002-02-14 14:25:02 gioria Exp $
Original revision: 1.3
$FreeBSD$
-->
<chapter id="pci">
<title>Les p&#233;riph&#233;riques PCI</title>
<para>Ce chap&icirc;tre traitera des m&eacute;canismes de FreeBSD pour
&eacute;crire un pilote de p&eacute;riph&eacute;rique pour un p&eacute;riph&eacute;rique sur
bus PCI.</para>
<sect1>
<title>Rechercher et rattacher</title>
<para>Informations ici sur comment le code du bus PCI fait un cycle
sur les p&eacute;riph&eacute;riques non rattach&eacute;s et voir si le nouvellement charg&eacute;
pilote de p&eacute;riph&eacute;rique chargeable dans le noyau (kld)
sera rattach&eacute; &agrave; l'un d'eux.</para>
<programlisting>/*
* Simple KLD pour jouer avec les fonctions PCI.
*
* Murray Stokely
*/
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#include &lt;sys/types.h&gt;
#include &lt;sys/module.h&gt;
#include &lt;sys/systm.h&gt; /* uprintf */
#include &lt;sys/errno.h&gt;
#include &lt;sys/param.h&gt; /* defines used in kernel.h */
#include &lt;sys/kernel.h&gt; /* types used in module initialization */
#include &lt;sys/conf.h&gt; /* cdevsw struct */
#include &lt;sys/uio.h&gt; /* uio struct */
#include &lt;sys/malloc.h&gt;
#include &lt;sys/bus.h&gt; /* structs, prototypes for pci bus stuff */
#include &lt;pci/pcivar.h&gt; /* For get_pci macros! */
/* Prototypes des fonctions */
d_open_t mypci_open;
d_close_t mypci_close;
d_read_t mypci_read;
d_write_t mypci_write;
/* Points d'entr&eacute;e du pilote de p&eacute;riph&eacute;rique caract&egrave;re */
static struct cdevsw mypci_cdevsw = {
mypci_open,
mypci_close,
mypci_read,
mypci_write,
noioctl,
nopoll,
nommap,
nostrategy,
"mypci",
36, /* reserved for lkms - /usr/src/sys/conf/majors */
nodump,
nopsize,
D_TTY,
-1
};
/* variables */
static dev_t sdev;
/* Nous sommes plus interresses dans la recherche/attachement
que dans l'ouverture/fermeture/lecture/ecriture a ce point */
int
mypci_open(dev_t dev, int oflags, int devtype, struct proc *p)
{
int err = 0;
uprintf("Peripherique \"monpci\" ouvert avec succes.\n");
return(err);
}
int
mypci_close(dev_t dev, int fflag, int devtype, struct proc *p)
{
int err=0;
uprintf("Peripherique \"monpci.\ "ferme\n");
return(err);
}
int
mypci_read(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
uprintf("lecture dans monpci!\n");
return err;
}
int
mypci_write(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
uprintf("Ecriture dans monpci!\n");
return(err);
}
/* PCI Support Functions */
/*
* Retourne la chaine d'identification si ce peripherique est le notre
*/
static int
mypci_probe(device_t dev)
{
uprintf("MonPCI Probe\n"
"ID Fabricant: 0x%x\n"
"ID Peripherique : 0x%x\n",pci_get_vendor(dev),pci_get_device(dev));
if (pci_get_vendor(dev) == 0x11c1) {
uprintf("Nous avons le WinModem, recherche reussi!\n");
return 0;
}
return ENXIO;
}
/* La fonction Attach n'est appel&eacute;e que si
la recherche est reussie*/
static int
mypci_attach(device_t dev)
{
uprintf("Rattachement de MonPCI pour: ID Peripherique: 0x%x\n",pci_get_vendor(dev));
sdev = make_dev(<literal>&</literal>mypci_cdevsw,
0,
UID_ROOT,
GID_WHEEL,
0600,
"monpci");
uprintf("Peripherique Monpci charge.\n");
return ENXIO;
}
/* Detach le peripherique. */
static int
mypci_detach(device_t dev)
{
uprintf("Monpci detache!\n");
return 0;
}
/* Appele lors de l'arret du systeme apres sync. */
static int
mypci_shutdown(device_t dev)
{
uprintf("Monpci arrete!\n");
return 0;
}
/*
* routine de suspension du peripherique
*/
static int
mypci_suspend(device_t dev)
{
uprintf("Monpci suspendu!\n");
return 0;
}
/*
* routine de reprise du peripherique
*/
static int
mypci_resume(device_t dev)
{
uprintf("Monpci resume!\n");
return 0;
}
static device_method_t mypci_methods[] = {
/* Interface Peripherique*/
DEVMETHOD(device_probe, mypci_probe),
DEVMETHOD(device_attach, mypci_attach),
DEVMETHOD(device_detach, mypci_detach),
DEVMETHOD(device_shutdown, mypci_shutdown),
DEVMETHOD(device_suspend, mypci_suspend),
DEVMETHOD(device_resume, mypci_resume),
{ 0, 0 }
};
static driver_t mypci_driver = {
"monpci",
mypci_methods,
0,
/* sizeof(struct mypci_softc), */
};
static devclass_t mypci_devclass;
DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);</programlisting>
<para>Informations compl&eacute;mentaires
<itemizedlist>
<listitem><simpara><ulink url="http://www.pcisig.org">PCI
Special Interest Group</ulink></simpara></listitem>
<listitem><simpara>PCI System Architecture, Fourth Edition by
Tom Shanley, et al.</simpara></listitem>
</itemizedlist>
</para>
</sect1>
<sect1>
<title>Les ressources du bus</title>
<para>FreeBSD fournit un m&eacute;canisme orient&eacute; objet pour demander
des ressources du bus parent. Pratiquement tous les p&eacute;riph&eacute;riques
seront un fils membre d'un type de bus (PCI, ISA, USB, SCSI, etc)
et ces p&eacute;riph&eacute;riques n&eacute;cessite des ressources issues de leur bus parent
(comme des segments de m&eacute;moire, des interruptions or des canaux DMA).</para>
<sect2>
<title>Registres d'adresse de base</title>
<para>Pour faire de particuli&egrave;rement utile avec un p&eacute;riph&eacute;rique PCI,
vous aurez besoin d'obtenir les <emphasis>registres d'adresse de base</emphasis>
(Base Address Registers ou BARs) de l'espace de configuration PCI.
Les d&eacute;tails sp&eacute;cifiques au PCI sur l'obtention du registre d'adresse de base
sont masqu&eacute;s dans la fonction <function>bus_alloc_resource()</function>.</para>
<para>Par exemple, un pilote typique aura sa fonction <function>attach()</function>
similaire &agrave; ceci : </para>
<programlisting> sc->bar0id = 0x10;
sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &amp;(sc->bar0id),
0, ~0, 1, RF_ACTIVE);
if (sc->bar0res == NULL) {
uprintf("Allocation memoire du registre PCI de base 0 echouee!\n");
error = ENXIO;
goto fail1;
}
sc->bar1id = 0x14;
sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &amp;(sc->bar1id),
0, ~0, 1, RF_ACTIVE);
if (sc->bar1res == NULL) {
uprintf("Allocation memoire du registre PCI de base 1 echouee!\n");
error = ENXIO;
goto fail2;
}
sc->bar0_bt = rman_get_bustag(sc->bar0res);
sc->bar0_bh = rman_get_bushandle(sc->bar0res);
sc->bar1_bt = rman_get_bustag(sc->bar1res);
sc->bar1_bh = rman_get_bushandle(sc->bar1res);
</programlisting>
<para>Des r&eacute;f&eacute;rences pour chaque registre d'adresse de base sont gard&eacute;es
dans la structure <structname>softc</structname> afin qu'elle puisse
&ecirc;tre utilis&eacute;e pour &eacute;crire dans le p&eacute;riph&eacute;rique plus tard.</para>
<para>Ces r&eacute;f&eacute;rences peuvent alors &ecirc;tre utilis&eacute;es pour lire ou &eacute;crire
dans les registres du p&eacute;riph&eacute;rique avec les fonctions <function>bus_space_*</function>.
Par exemple, un pilote peut contenir une fonction raccourci
pour lire dans un registre sp&eacute;cifique &agrave; une carte comme cela :
</para>
<programlisting>uint16_t
board_read(struct ni_softc *sc, uint16_t address) {
return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address);
}
</programlisting>
<para>De façon similaire, une autre peut &eacute;crire dans les registres avec : </para>
<programlisting>void
board_write(struct ni_softc *sc, uint16_t address, uint16_t value) {
bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value);
}
</programlisting>
<para>Ces fonctions existent en versions 8bit, 16bit et 32bit
et vous devriez utiliser
<function>bus_space_{read|write}_{1|2|4}</function>
en cons&eacute;quence.</para>
</sect2>
<sect2>
<title>Les interruptions</title>
<para>Les interruptions sont allou&eacute;s &agrave; partir du code orient&eacute; objet du
bus de façon similaire aux ressources m&eacute;moire. D'abord une ressource
IRQ doit &ecirc;tre allou&eacute;e &agrave; partir du bus parent, et alors le
gestionnaire d'interruption doit &ecirc;tre r&egrave;gl&eacute; pour traiter cet IRQ.</para>
<para>A nouveau, un exemple de fonction
<function>attach()</function> en dit plusqu'un long discours.</para>
<programlisting>/* Recupere la ressource IRQ */
sc->irqid = 0x0;
sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &amp;(sc->irqid),
0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);
if (sc->irqres == NULL) {
uprintf("Allocation IRQ echouee!\n");
error = ENXIO;
goto fail3;
}
/* Maitnenant nous choisissons notre gestionnaire d'interruption */
error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,
my_handler, sc, &amp;(sc->handler));
if (error) {
printf("Ne peut regler l'IRQ\n");
goto fail4;
}
sc->irq_bt = rman_get_bustag(sc->irqres);
sc->irq_bh = rman_get_bushandle(sc->irqres);
</programlisting>
</sect2>
<sect2>
<title>DMA</title>
<para>Sur les PC, les p&eacute;riph&eacute;riques qui veulent utiliser la gestion de
bus DMA doivent travailler avec des adresses physiques. C'est un probl&egrave;me
puisque FreeBSD utilise une m&eacute;moire virtuelle et travaille presque
exclusivement avec des adresses virtuelles. Heureusement, il y a une
fonction <function>vtophys()</function> pour nous aider.</para>
<programlisting>#include &lt;vm/vm.h&gt;
#include &lt;vm/pmap.h&gt;
#define vtophys(virtual_address) (...)
</programlisting>
<para>La solution est toutefois un peu diff&eacute;rente sur Alpha, et
ce que nous voulons r&eacute;ellement est une fonction appel&eacute;e
<function>vtobus()</function>.</para>
<programlisting>#if defined(__alpha__)
#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va)
#else
#define vtobus(va) vtophys(va)
#endif
</programlisting>
</sect2>
<sect2>
<title>D&#233;sallouer les resources</title>
<para>Il est tr&egrave;s important de d&eacute;sallouer toutes les ressources
qui furent allou&eacute;es pendant <function>attach()</function>.
Unsoin tout particulier doit &ecirc;tre pris pour d&eacute;sallouer
les bonnes choses m&ecirc;me lors d'un &eacute;chec afin que le syst&egrave;me reste
utilisable lorsque votre driver meurt.</para>
</sect2>
</sect1>
</chapter>

View file

@ -0,0 +1,16 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: chapter.sgml,v 1.1 2002-02-14 14:25:02 gioria Exp $
Original revision: 1.3
$FreeBSD$
-->
<chapter id="scsi">
<title>Contr&#244;leurs SCSI Common Access Method (CAM) **</title>
<sect1><title>En cours de traduction</title>
<para>En cours de traduction</para>
</sect1>
</chapter>

View file

@ -0,0 +1,425 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: chapter.sgml,v 1.1 2002-02-14 14:25:02 gioria Exp $
Original revision: 1.3
$FreeBSD$
-->
<chapter id="secure">
<title>Programmation s&#233;curis&#233;e</title>
<para>Ce chap&icirc;tre a &eacute;t&eacute; &eacute;crit par Murray Stokely.</para>
<sect1><title>Synopsis</title>
<para>Ce chap&icirc;tre d&eacute;crit quelques probl&egrave;mes de s&eacute;curit&eacute; qui
ont tourment&eacute; les programmeurs Unix depuis des dizaines d'ann&eacute;es
et quelques uns des nouveaux outils disponibles pour aider
les programmeurs &agrave; &eacute;viter l'&eacute;criture de code non s&eacute;curis&eacute;.
</para>
</sect1>
<sect1 id="secure-philosophy"><title>M&#233;thodologie de d&#233;veloppement
s&#233;curis&#233;</title>
<para>Ecrire des applications s&eacute;curis&eacute;es demande une tr&egrave;s minutieuse
et pessimiste vision de la vie. Les applications devrait fonctionner
avec le principe du <quote>privil&egrave;ge moindre</quote> de façon &agrave; ce
qu'aucun processus ne fonctionne avec plus que le strict minimum dont
il a besoin pour accomplir sa t&acirc;che. Le code pr&eacute;-test&eacute; devrait &ecirc;tre
r&eacute;utilis&eacute; autant que possible pour &eacute;viter les erreurs communes que
d'autres peuvent d&eacute;j&agrave; avoir r&eacute;par&eacute;es.</para>
<para>Un des pi&egrave;ges de l'environnement Unix est qu'il est facile
d'affecter la stabilit&eacute; de l'environnement.
Les applications ne devraient jamais avoir confiance dans la saisie
de l'utilisateur (sous toutes ses formes),
les ressources syst&egrave;me, la communication inter-processus, ou l'encha&icirc;nement
des &eacute;v&egrave;nements. Les processus Unix n'ex&eacute;cutent pas de mani&egrave;re synchrone
aussi, logiquement, les op&eacute;rations sont rarement atomiques.</para>
</sect1>
<sect1><title>D&#233;passement de capacit&#233;</title>
<para>Les d&eacute;passements de capacit&eacute; ("Buffer Overflows") existent depuis
les d&eacute;buts de l'architecture de Von-Neuman <xref linkend="COD">.
Ils gagn&egrave;rent une grande notori&eacute;t&eacute; en 1988 avec le ver pour Internet
de Morris. Malheureusement, la m&ecirc;me attaque basique reste effective
aujourd'hui. Des 17 rapports de s&eacute;curit&eacute; du CERT de 1999, 10
furent caus&eacute;s directement des bogues logiciels de d&eacute;passement de
capacit&eacute;. De loin la plus commune de types d'attaques par d&eacute;passement de
capacit&eacute; est bas&eacute;e sur la corruption de la pile.</para>
<para>La plupart des syst&egrave;mes informatiques modernes utilise une pile
pour passer les arguments aux proc&eacute;dures et stocker les variables locales
Une pile est une zone m&eacute;moire dernier entr&eacute;-premier sorti (Last In-First
Out : LIFO) dans la zone de m&eacute;moire haute de l'image d'un processus.
Quand un programme invoque une fonction une nouvelle structure pile est
cr&eacute;&eacute;e. Cette structure pile consiste dans les arguments pass&eacute;s &agrave; la
fonction aussi bien que dans une quantit&eacute; dynamique d'espace pour
la variable locale. Le pointeur de pile est un registre qui r&eacute;f&eacute;rence la
position courante du sommet de la pile. Etant donn&eacute; que cette valeur
change constamment au fur et &agrave; mesure que de nouvelles valeurs sont
ajout&eacute;es au sommet de la pile, beaucoup d'impl&eacute;mentations fournissent
aussi un pointeur de structure qui est positionn&eacute; dans le voisinage du
d&eacute;but de la structure pile de façon &agrave; ce que les variables locales soient
plus facilement adressables relativement &agrave; cette valeur.
<xref linkend="COD"> L'adresse de retour des appels de fonction est aussi
stock&eacute; dans la pile, et cela est la cause des d&eacute;couvertes des
d&eacute;passements de pile puisque faire d&eacute;border une variable locale dans une
fonction peut &eacute;craser l'adresse de retour de cette fonction, permettant
potentiellement &agrave; un utilisateur malveillant d'ex&eacute;cuter le code qu'il ou
elle d&eacute;sire.</para>
<para>Bien que les attaques bas&eacute;es sur les d&eacute;passements de pile soient
de loin les plus communes, il serait aussi possible de faire exploser
la pile avec une attaque du tas (malloc/free).</para>
<para>Le langage de programmation C ne r&eacute;alise pas de v&eacute;rifications
automatiques des limites sur les tableaux ou pointeurs comme d'autres
langages le font. De plus, la librairie standard du C est remplie d'une
poign&eacute;e de fonctions tr&egrave;s dangereuses.</para>
<informaltable>
<tgroup cols=2>
<tbody>
<row><entry><function>strcpy</function>(char *dest, const char
*src)</entry>
<entry><simpara>Peut faire d&eacute;border le tampon dest</simpara></entry>
</row>
<row><entry><function>strcat</function>(char *dest, const char
*src)</entry>
<entry><simpara>Peut faire d&eacute;border le tampon dest</simpara></entry>
</row>
<row><entry><function>getwd</function>(char *buf)</entry>
<entry><simpara>Peut faire d&eacute;border le tampon buf</simpara></entry>
</row>
<row><entry><function>gets</function>(char *s)</entry>
<entry><simpara>Peut faire d&eacute;border le tampon s</simpara></entry>
</row>
<row><entry><function>[vf]scanf</function>(const char *format,
...)</entry>
<entry><simpara>Peut faire d&eacute;border ses arguments.</simpara></entry>
</row>
<row><entry><function>realpath</function>(char *path, char
resolved_path[])</entry>
<entry><simpara>Peut faire d&eacute;border le tampon path</simpara></entry>
</row>
<row><entry><function>[v]sprintf</function>(char *str, const char
*format, ...)</entry>
<entry><simpara>Peut faire d&eacute;border le tampon str.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<sect2><title>Exemple de d&#233;passement de capacit&#233;</title>
<para>L'exemple de code suivant contient un d&eacute;passement de capacit&eacute;
conçu pour &eacute;craser l'adresse de retour et "sauter" l'instruction suivant
imm&eacute;diatement l'appel de la fonction. (Inspir&eacute;
par <xref linkend="Phrack">)</para>
<programlisting>#include <sgmltag>stdio.h</sgmltag>
void manipulate(char *buffer) {
char newbuffer[80];
strcpy(newbuffer,buffer);
}
int main() {
char ch,buffer[4096];
int i=0;
while ((buffer[i++] = getchar()) != '\n') {};
i=1;
manipulate(buffer);
i=2;
printf("La valeur de i est : %d\n",i);
return 0;
}</programlisting>
<para>Examinons quel serait l'aspect de l'image m&eacute;moire de ce processus
si nous avions entr&eacute; 160 espaces dans notre petit programme avant
d'appuyer sur <keycap>Entr&eacute;e</keycap>.</para>
<para>[XXX Sch&eacute;ma ici!]</para>
<para>Evidemment une entr&eacute;e plus malveillante pourrait &ecirc;tre imagin&eacute;e pour
ex&eacute;cuter des instructions d&eacute;j&agrave; compil&eacute;es (comme exec(/bin/sh)).</para>
</sect2>
<sect2><title>Eviter les d&#233;passements de capacit&#233;</title>
<para>La solution la plus simple au probl&egrave;me de d&eacute;bordement de pile
est de toujours utiliser de la m&eacute;moire restreinte en taille et
les fonctions de copie de cha&icirc;ne de caract&egrave;res. <function>strncpy</function>
et <function>strncat</function> font parties de la libraire standard du
C. Ces fonctions acceptent une valeur de longueur comme param&egrave;tre qui
qui ne devrait pas &ecirc;tre plus grande que la taille du tampon de
destination. Ces fonctions vont ensuite copier `taille' octets de la
source vers la destination. Toutefois, il y a un certain nombre de
probl&egrave;mes avec ces fonctions. Aucune fonction ne garantit une terminaison
par le caract&egrave;re NULL si la taille du tampon d'entr&eacute;e est aussi grand
que celui de destination. Le param&egrave;tre taille est aussi utilis&eacute; de façon
illogique entre <function>strncpy</function> et <function>strncat</function>
aussi il est facile pour les programmeurs d'&ecirc;tre d&eacute;rout&eacute;s sur leur
utilisation convenable. Il y a aussi une perte significative des
performances compar&eacute; &agrave; <function>strcpy</function> lorsque l'on copie
une courte cha&icirc;ne dans un grand tampon puisque <function>strncpy</function>
remplit de caract&egrave;res NULL jusqu'&agrave; la taille sp&eacute;cifi&eacute;e.</para>
<para>Dans OpenBSD, une autre impl&eacute;mentation de la copie de m&eacute;moire
a &eacute;t&eacute; cr&eacute;&eacute;e pour contourner ces probl&egrave;mes. Les fonctions <function>strlcpy</function>
et <function>strlcat</function> garantissent qu'elles termineront
toujours le tampon de destination par un caract&egrave;re NULL losque l'argument
de taille est diff&eacute;rent de z&eacute;ro. Pour plus d'informations sur ces
fonctions, voir <xref linkend="OpenBSD">. Les fonctions <function>strlcpy</function> et
<function>strlcat</function> d'OpenBSD ont &eacute;t&eacute; inclues dans FreeBSD
depuis la version 3.5.</para>
<sect3><title>V#233;rifications des limites en fonctionnement bas&eacute;es sur le compilateur</title>
<!--Compiler based run-time bounds -->
<para>Malheureusement il y a toujours un tr&egrave;s important assortiment de
code en utilisation publique qui copie aveugl&eacute;ment la m&eacute;moire sans
utiliser une des routines de copie limit&eacute;e dont nous venons juste de
discuter. Heureusement, il y a une autre solution. Plusieurs produits
compl&eacute;mentaires pour compilateur et librairies existent pour faire
de la v&eacute;rification de limites pendant le fonctionnement en C/C++.</para>
<para>StackGuard est un de ces produits qui est impl&eacute;ment&eacute; comme un
petit correctif ("patch") pour le g&eacute;n&eacute;rateur de code gcc. Extrait du
site Internet de StackGuard, http://immunix.org/stackguard.html :
<blockquote><para>"StackGuard d&eacute;tecte et fait &eacute;chouer les attaques
par d&eacute;bordement de pile en emp&ecirc;chant l'adresse de retour sur la pile
d'&ecirc;tre alt&eacute;r&eacute;e. StackGuard place un mot "canari"
<footnote><para>NDT : Jaune de pr&eacute;f&eacute;rence pour &ecirc;tre bien visible</para></footnote>
&agrave; c&ocirc;t&eacute; de l'adresse de retour quand la fontion est appel&eacute;e. Si le mot
"canari" a &eacute;t&eacute; alt&eacute;r&eacute; au retour de la fonction, alors une attaque par
d&eacute;bordement de pile a &eacute;t&eacute; tent&eacute;e et le programme r&eacute;pond en envoyant
une alerte d'intrusion dans la trace syst&egrave;me (syslog) et
s'arr&ecirc;te alors."</para></blockquote>
<blockquote><para>"StackGuard est impl&eacute;ment&eacute; comme un petit correctif
au g&eacute;n&eacute;rateur de code gcc, sp&eacute;cifiquement sur les routines
function_prolog() et function_epilog(). function_prolog() a &eacute;t&eacute;
am&eacute;lior&eacute; pour laisser des "canaris" sur la pile quand les fonctions
d&eacute;marrent, et function_epilog v&eacute;rifie l'int&eacute;grit&eacute; des "canaris" quand
la fonction se termine. Tout essai pour corrompre l'adresse de retour
est alors d&eacute;tect&eacute;e avant que la fonction ne retourne."</para></blockquote>
</para>
<para>Recompiler votre application avec StackGuard est un
moyen efficace pour stopper la plupart des attques par d&eacute;passement de
capacit&eacute;, mais cela peut toujours &ecirc;tre compromis.</para>
</sect3>
<sect3><title>V&#233;rifications des limites en fonctionnement bas&#233;es sur les librairies</title>
<para>Les m&eacute;canismes bas&eacute;s sur le compilateur sont totalement inutiles
pour logiciel seulement binaire que vous ne pouvez recompiler. Pour
ces situations, il existe un nombre de librairies qui re-impl&eacute;mente
les fonctions peu sûres de la librairie C
(<function>strcpy</function>, <function>fscanf</function>,
<function>getwd</function>, etc..) et assurent que ces
fonctions ne peuvent pas &eacute;crire plus loin que le pointeur de pile.</para>
<itemizedlist>
<listitem><simpara>libsafe</simpara></listitem>
<listitem><simpara>libverify</simpara></listitem>
<listitem><simpara>libparnoia</simpara></listitem>
</itemizedlist>
<para>Malheureusement ces d&eacute;fenses bas&eacute;es sur les librairies poss&egrave;dent
un certain nombre de d&eacute;fauts. Ces librairies prot&egrave;gent seulement d'un
tr&egrave;s petit ensemble de probl&egrave;mes li&eacute;s &agrave; la s&eacute;curit&eacute; et oublient de
r&eacute;parer le probl&egrave;me actuel. Ces d&eacute;fenses peuvent &eacute;chouer si
l'application a &eacute;t&eacute; compil&eacute;e avec -fomit-frame-pointer. De m&ecirc;me, les
variables d'environnement LD_PRELOAD et LD_LIBRARY_PATH peuvent &ecirc;tre
r&eacute;&eacute;crites/non d&eacute;finies par l'utilisateur.</para>
</sect3>
</sect2>
</sect1>
<sect1><title>Les probl&#232;mes li&#233;s &#224; SetUID</title>
<para>Il y a au moins 6 differents ID (identifiants) associ&eacute;s &agrave; un
processus donn&eacute;. A cause de cela, vous devez &ecirc;tre tr&egrave;s attentif avec
l'acc&egrave;s que votre processus poss&egrave;de &agrave; un instant donn&eacute;. En particulier,
toutes les applications ayant reçu des privil&egrave;ges par seteuid doivent
les abandonn&eacute;s d&egrave;s qu'ils ne sont plus n&eacute;cessaires.</para>
<para>L'identifiant de l'utilisateur r&eacute;el (real user ID) peut seulement
&ecirc;tre chang&eacute; par un processus super-utilisateur. Le programme <application>login</application>
met celui &agrave; jour quand un utilisateur se connecte et il est rarement
chang&eacute;.</para>
<para>L'identifiant de l'utilisateur effectif (effective user ID) est mis
&agrave; jour par les fonctions <function>exec()</function> si un programme
poss&egrave;de son bit seteuid plac&eacute;. Une application peut appeler
<function>seteuid()</function> &agrave; n'importe quel moment pour r&egrave;gler
l'identifiant de l'utilisateur effectif sur l'identifiant d'un
utilisateur r&eacute;el ou sur le "set-user-ID" sauv&eacute;.
Quand l'identifiant de l'utilisateur effectif est plac&eacute; par les
fonctions <function>exec()</function>, la valeur pr&eacute;c&eacute;dente est sauv&eacute;e
dans le "set-user-ID" sauv&eacute;.</para>
</sect1>
<sect1 id="chroot"><title>Limiter l'environnement de votre programme</title>
<para>La m&eacute;thode traditionnelle pour restreindre l'acc&egrave;s d'un processus
se fait avec l'appel syst&egrave;me <function>chroot()</function>. Cet appel
syst&egrave;me change le r&eacute;pertoire racine depuis lequel tous les autres chemins
sont r&eacute;f&eacute;renc&eacute;s pour un processus et ses fils. Pour que cet appel
r&eacute;ussisse, le processus doit avoir ex&eacute;cut&eacute; (recherch&eacute;)
la permission dans le r&eacute;pertoire r&eacute;f&eacute;renc&eacute;. Le nouvel environnement
environment ne prend pas effet que lorsque vous appelez <function>chdir()</function>
dans celui-ci.
Il doit &ecirc;tre aussi not&eacute; qu'un processus peut facilement s'&eacute;chapper
d'un environnement chroot s'il a les privil&egrave;ges du super-utilisateur.
Cela devrait &ecirc;tre accompli en cr&eacute;ant des fichiers sp&eacute;ciaux de
p&eacute;riph&eacute;rique pour la m&eacute;moire du noyau, en attachant un d&eacute;vermineur &agrave; un
processus depuis l'ext&eacute;rieur de sa "prison", ou par d'autres mani&egrave;res
cr&eacute;atrices.</para>
<para>Le comportement de l'appel syst&egrave;me <function>chroot()</function>
peut &ecirc;tre un peu contr&ocirc;l&eacute; avec la commande <command>sysctl</command> et
la variable kern.chroot_allow_open_directories.
Quand cette valeur est r&egrave;gl&eacute;e &agrave; 0, <function>chroot()</function> &eacute;chouera
avec EPERM s'il y a un r&eacute;pertoire d'ouvert. Si la variable est r&egrave;gl&eacute;e sur
la valeur par d&eacute;faut 1, alors <function>chroot()</function> &eacute;chouera
avec EPERM s'il y a un r&eacute;pertoire d'ouvert et que le processus est d&eacute;j&agrave;
sujet &agrave; un appel <function>chroot()</function>. Pour toute autre valeur, la
v&eacute;rification des r&eacute;pertoires ouverts sera totalement court-circuit&eacute;e.</para>
<sect2><title>La fonctionnalit&#233; "prison" de FreeBSD</title>
<para>Le concept de Prison ("Jail") &eacute;tend
<function>chroot()</function> en limitant les droits du
super-utilisateur pour cr&eacute;er un v&eacute;ritable `serveur virtuel'. Une fois
qu'une prison est mise en place, toute communication r&eacute;seau doit avoir lieu
au travers de l'adresse IP sp&eacute;cifi&eacute;e, et le droit du
"privil&egrave;ge super-utilisateur" dans cette prison est s&eacute;v&egrave;rement g&ecirc;n&eacute;.</para>
<para>Tant qu'il se trouve en prison, tout test avec les droits du
super-utilisateur dans le noyau au travers d'un appel &agrave;
<function>suser()</function> &eacute;chouera.
Toutefois, quelques appels &agrave; <function>suser()</function> ont &eacute;t&eacute;
chang&eacute;s par la nouvelle interface <function>suser_xxx()</function>.
Cette fonction est responsable de fournir ou de retirer les acc&egrave;s
aux droits du super-utilisateur pour les processus emprisonn&eacute;s.</para>
<para>Un processus super-utilisateur dans un environnement emprisonn&eacute;
a le pouvoir de : </para>
<itemizedlist>
<listitem><simpara>Manipuler les identitifications avec
<function>setuid</function>, <function>seteuid</function>,
<function>setgid</function>, <function>setegid</function>,
<function>setgroups</function>, <function>setreuid</function>,
<function>setregid</function>, <function>setlogin</function></simpara></listitem>
<listitem><simpara>R&egrave;gler les limites en ressources avec <function>setrlimit</function></simpara></listitem>
<listitem><simpara>Modifier quelques variables du noyau par sysctl
(kern.hostname)</simpara></listitem>
<listitem><simpara><function>chroot()</function></simpara></listitem>
<listitem><simpara>R&egrave;gler les param&egrave;tres d'un noeud virtuel (vnode):
<function>chflags</function>,
<function>fchflags</function></simpara></listitem>
<listitem><simpara>R&egrave;gler les attributs d'un noeud virtuel comme
les permissions d'un fichier, le propri&eacute;taire, le groupe, la taille,
la date d'acc&egrave;s, et la date de modification.</simpara></listitem>
<listitem><simpara>Se lier &agrave; des ports privil&eacute;gi&eacute;s sur Internet
(ports < 1024)</simpara></listitem>
</itemizedlist>
<para><function>Jail</function> est un outil tr&egrave;s utile pour ex&eacute;cuter
des applications dans un environnement s&eacute;curis&eacute; mais il a des
imperfections. Actuellement, les m&eacute;canismes IPC (Inter-Process
Communications) n'ont pas &eacute;t&eacute; convertis pour utiliser <function>suser_xxx</function>
aussi des applications comme MySQL ne peuvent &ecirc;tre ex&eacute;cut&eacute;e dans une prison.
L'acc&egrave;s super-utilisateur peut avoir un sens tr&egrave;s limit&eacute; dans une prison,
mais il n'y aucune façon de sp&eacute;cifier exactement ce que tr&egrave;s limit&eacute;
veut dire.</para>
</sect2>
<sect2><title>Les capacit&#232;s des processus POSIX.1e</title>
<para>Posix a r&eacute;alis&eacute; un document de travail qui ajoute l'audit
d'&eacute;v&egrave;nement, les listes de contr&ocirc;le d'acc&egrave;s, les privil&egrave;ges fins,
l'&eacute;tiquetage d'information, et le contr&ocirc;le d'acc&egrave;s mandat&eacute;.</para>
<para>Il s'agit d'un travail en cours et c'est l'objectif du projet <ulink
url="http://www.trustedbsd.org">TrustedBSD</ulink>. Une partie
du travail initial a &eacute;t&eacute; int&eacute;gr&eacute; dans FreeBSD-current
(cap_set_proc(3)).</para>
</sect2>
</sect1>
<sect1><title>La confiance</title>
<para>Une application ne devrait jamais supposer que tout est sain
dans l'environnement des utilisateurs. Cela inclut (mais n'est
certainement pas limit&eacute; &agrave;) : la saisie de l'utilisateur, les signaux,
les variables d'environnement, les ressources, les communication
inter-processus, les mmaps, le r&eacute;pertoire de travail du syst&egrave;me de
fichiers, les descripteurs de fichier, le nombre de fichiers ouverts,
etc.</para>
<para>Vous ne devriez jamais supposer que vous pouvez g&eacute;rer toutes les
formes de saisie invalide qu'un utilisateur peut entrer. Votre
application devrait plut&ocirc;t utiliser un filtrage positif pour
seulement permettre un sous-ensemble sp&eacute;cifique que vous jugez
sain. Une mauvaise validation des entr&eacute;es a &eacute;t&eacute; la cause de beaucoup
d&eacute;couvertes de bogues, sp&eacute;cialement avec les scripts CGI sur le web.
Pour les noms de fichier, vous devez &ecirc;tre tout particuli&egrave;rement attentif
aux chemins ("../", "/"), liens symboliques et caract&egrave;res d'&eacute;chappement
de l'interpr&eacute;teur de commandes.</para>
<para>Perl poss&egrave;de une caract&eacute;ristique t&egrave;s sympathique appel&eacute;e mode
"Taint" qui peut &ecirc;tre utilis&eacute;e pour emp&ecirc;cher les scripts d'utiliser
des donn&eacute;es externes au programme par un moyen non sûr. Ce mode v&eacute;rifiera
les arguments de la ligne de commandes, les variables d'environnement,
les informations localis&eacute;es (propres aux pays), les r&eacute;sultats de certains
appels syst&egrave;me (<function>readdir()</function>,
<function>readlink()</function>,
<function>getpwxxx()</function>) et toute entr&eacute;e de fichier.</para>
</sect1>
<sect1><title>Les conditions de course</title>
<para>Une condition de course est un comportement anormal caus&eacute; par
une d&eacute;pendance inattendue sur le s&eacute;quencement relatif des &eacute;v&egrave;nements. En
d'autres mots, un programmeur a suppos&eacute; &agrave; tort qu'un &eacute;v&egrave;nement
particulier se passerait avant un autre.</para>
<para>Quelques causes habituelles de conditions de course sont les
signaux, les v&eacute;rifications d'acc&egrave;s et les fichiers ouverts.
Les signaux sont des &eacute;v&egrave;nements asynchrones par nature aussi un soin
particulier doit &ecirc;tre pris pour les utiliser.
V&eacute;rifier les acc&egrave;s avec <function>access(2)</function> puis
<function>open(2)</function> n'est clairement pas atomique.
Les utilisateurs peuvent d&eacute;placer des fichiers entre les deux appels.
Les applications privil&eacute;gi&eacute;es devraient plut&ocirc;t faire un appel &agrave;
<function>seteuid()</function> puis appeler <function>open()</function>
directement. Dans le m&ecirc;me esprit, une application devrait toujours r&egrave;gler
un umask correct avant un appel &agrave; <function>open()</function> pour
pr&eacute;venir le besoin d'appels non valides &agrave; <function>chmod()</function>.</para>
</sect1>
</chapter>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,21 @@
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$Id: chapter.sgml,v 1.1 2002-02-14 14:25:03 gioria Exp $
Original revision: 1.1
$FreeBSD$
-->
<chapter id="usb">
<title>P&#233;riph&#233;riques USB ***</title>
<para><emphasis>Ce chap&icirc;tre a &eacute;t&eacute; &eacute;crit par &a.nhibma;. Les modifications pour le
manuel par &a.murray;.</emphasis></para>
<sect1>
<title>Introduction</title>
<para>Chap&icirc;tre &agrave; traduire.</para>
</sect1>
</chapter>