- Remove stale files

Discussd with:	taras
This commit is contained in:
Gabor Kovesdan 2012-09-24 11:18:39 +00:00
parent c96a4769af
commit ed4c4311fa
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=39614
6 changed files with 0 additions and 3459 deletions
ru_RU.KOI8-R/books
Makefile
developers-handbook
ppp-primer

View file

@ -8,7 +8,6 @@
SUBDIR = faq
SUBDIR+= handbook
SUBDIR+= porters-handbook
SUBDIR+= ppp-primer
ROOT_SYMLINKS = faq handbook

View file

@ -1,410 +0,0 @@
<?xml version="1.0" encoding="koi8-r" standalone="no"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
$FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/developers-handbook/driverbasics/chapter.sgml,v 1.1 2001/01/10 08:45:03 andy Exp $
Original revision: 1.3
-->
<chapter id="driverbasics">
<title>Написание драйверов устройств для FreeBSD</title>
<para>Эту главу написал Мюррэй Стокели (Murray Stokely) на основе множества
источников, включая справочную страницу intro(4), созданную Джоргом
Вуншем (Joerg Wunsch).</para>
<sect1>
<title>Введение</title>
<para>Эта глава является кратким введением в процесс написания драйверов
устройств для FreeBSD. В этом контексте термин устройство используется
в основном для вещей, связанных с оборудованием, относящимся к системе,
таких, как диски, печатающие устройства или графические дисплеи с
клавиатурами. Драйвер устройства является программной компонентой
операционной системы, управляющей некоторым устройством. Имеются также
так называемые псевдо-устройства, в случае которых драйвер устройства
эмулирует поведение устройства программно, без наличия какой-либо
соответствующей аппаратуры. Драйверы устройств могут быть
вкомпилированы в систему статически или могут загружаться по требованию
при помощи механизма динамического компоновщика ядра `kld'.</para>
<para>Большинство устройств в Unix-подобной операционной системе доступны
через файлы устройств (device-nodes), иногда также называемые
специальными файлами. В иерархии файловой системы эти файлы обычно
находятся в каталоге <filename>/dev</filename>. Пока система devfs
полностью не интегрирована во FreeBSD, каждый файл устройства должен
создаваться статически и вне зависимости от наличия соответствующего
драйвера устройста. Большинство файлов устройств в системе создаются
при помощи команды <command>MAKEDEV</command>.</para>
<para>Драйверы устройств могут быть условно разделены на две категории;
драйверы символьных и сетевых устройств.</para>
</sect1>
<sect1>
<title>Механизм динамического компоновщика ядра - KLD</title>
<para>Интерфейс kld позволяет системным администраторам динамически
добавлять и убирать функциональность из работающей системы. Это
позволяет разработчикам драйверов устройств загружать собственные
изменения в работающее ядро без постоянных перезагрузок для
тестирования изменений.</para>
<para>Для работы с интерфейсом kld используются следующие команды
администратора:
<itemizedlist>
<listitem>
<simpara>
<command>kldload</command> - загружает новый модуль ядра
</simpara>
</listitem>
<listitem>
<simpara>
<command>kldunload</command> - выгружает модуль ядра
</simpara>
</listitem>
<listitem>
<simpara>
<command>kldstat</command> - выводит список загруженных в данный
момент модулей
</simpara>
</listitem>
</itemizedlist>
</para>
<para>Скелет модуля ядра</para>
<programlisting>
/*
* KLD Skeleton
* Inspired by Andrew Reiter's Daemonnews article
*/
#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 */
/*
* Load handler that deals with the loading and unloading of a KLD.
*/
static int
skel_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD: /* kldload */
uprintf("Skeleton KLD loaded.\n");
break;
case MOD_UNLOAD:
uprintf("Skeleton KLD unloaded.\n");
break;
default:
err = EINVAL;
break;
}
return(err);
}
/* Declare this module to the rest of the kernel */
DECLARE_MODULE(skeleton, skel_loader, SI_SUB_KLD, SI_ORDER_ANY);
</programlisting>
<sect2>
<title>Makefile</title>
<para>Во FreeBSD имеются заготовки для включения в make-файлы, которые
вы можете использовать для быстрой компиляции собственных дополнений
к ядру.</para>
<programlisting>
SRCS=skeleton.c
KMOD=skeleton
.include &lt;bsd.kmod.mk&gt;
</programlisting>
<para>Простой запуск команды <command>make</command> с этим make-файлом
приведет к созданию файла <filename>skeleton.ko</filename>, который
можно загрузить в вашу систему, набрав:
<screen>
&prompt.root kldload -v ./skeleton.ko
</screen>
</para>
</sect2>
</sect1>
<sect1>
<title>Обращение к драйверу устройства</title>
<para>Unix дает некоторый общий набор системных вызовов для использования
в пользовательских приложениях. Когда пользователь обращается к
файлу устройства, высокие уровни ядра перенаправляют эти обращения к
соответствующему драйверу устройства. Скрипт
<command>/dev/MAKEDEV</command> создает большинство файлов устройств в
вашей системе, однако если вы ведете разработку своего собственного
драйвера, то может появиться необходимость в создании собственных
файлов устройств при помощи команды <command>mknod</command>.</para>
<sect2>
<title>Создание статических файлов устройств</title>
<para>Для создания файла устройства команде <command>mknod</command>
требуется указать четыре аргумента. Вы должны указать имя этого
файла устройства, тип устройства, старшее число устройства и младшее
число устройства.</para>
</sect2>
<sect2>
<title>Динамические файлы устройств</title>
<para>Файловая система устройств, devfs, предоставляет доступ к
пространству имен устройств ядра из глобального пространства имен
файловой системы. Это устраняет потенциальную проблемы наличия
драйвера без статического файла устройства или файла устройства без
установленного драйвера устройства. Devfs все еще находится в
разработке, однако она уже достаточно хорошо работает.</para>
</sect2>
</sect1>
<sect1>
<title>Символьные устройства</title>
<para>Драйвер символьного устройства передает данные непосредственно в
или из процесса пользователя. Это самый распространенный тип драйвера
устройства и в дереве исходных текстов имеется достаточно простых
примеров таких драйверов.</para>
<para>В этом простом примере псевдо-устройство запоминает какие угодно
значения, которые вы в него записываете, и затем может выдавать их
назад при чтении из этого устройства.</para>
<programlisting>
/*
* Simple `echo' pseudo-device 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 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;
#define BUFFERSIZE 256
/* Function prototypes */
d_open_t echo_open;
d_close_t echo_close;
d_read_t echo_read;
d_write_t echo_write;
/* Character device entry points */
static struct cdevsw echo_cdevsw = {
echo_open,
echo_close,
echo_read,
echo_write,
noioctl,
nopoll,
nommap,
nostrategy,
"echo",
33, /* reserved for lkms - /usr/src/sys/conf/majors */
nodump,
nopsize,
D_TTY,
-1
};
typedef struct s_echo {
char msg[BUFFERSIZE];
int len;
} t_echo;
/* vars */
static dev_t sdev;
static int len;
static int count;
static t_echo *echomsg;
MALLOC_DECLARE(M_ECHOBUF);
MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
/*
* This function acts is called by the kld[un]load(2) system calls to
* determine what actions to take when a module is loaded or unloaded.
*/
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");
/* kmalloc memory for use by this driver */
/* malloc(256,M_ECHOBUF,M_WAITOK); */
MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK);
printf("Echo device loaded.\n");
break;
case MOD_UNLOAD:
destroy_dev(sdev);
FREE(echomsg,M_ECHOBUF);
printf("Echo device unloaded.\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("Opened device \"echo\" successfully.\n");
return(err);
}
int
echo_close(dev_t dev, int fflag, int devtype, struct proc *p)
{
uprintf("Closing device \"echo.\"\n");
return(0);
}
/*
* The read function just takes the buf that was saved via
* echo_write() and returns it to userland for accessing.
* uio(9)
*/
int
echo_read(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
int amt;
/* How big is this read operation? Either as big as the user wants,
or as big as the remaining data */
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 failed!\n");
}
return err;
}
/*
* echo_write takes in a character string and saves it
* to buf for later accessing.
*/
int
echo_write(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
/* Copy the string in from user memory to kernel memory */
err = copyin(uio->uio_iov->iov_base, echomsg->msg, MIN(uio->uio_iov->iov_len,BUFFERSIZE));
/* Now we need to null terminate */
*(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE)) = 0;
/* Record the length */
echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE);
if (err != 0) {
uprintf("Write failed: bad address!\n");
}
count++;
return(err);
}
DEV_MODULE(echo,echo_loader,NULL);
</programlisting>
<para>Перед тем, как устанавливать этот драйвер, в вашей файловой системе
вам нужно создать файл устройства при помощи команды, подобной
следующей:</para>
<screen>
&prompt.root mknod /dev/echo c 33 0
</screen>
<para>Когда этот драйвер загружен, вы можете выполнять следующие
действия:</para>
<screen>
&prompt.root echo -n "Test Data" > /dev/echo
&prompt.root cat /dev/echo
Test Data
</screen>
<para>Об устройствах, обслуживающих реальное оборудование, рассказывается
в следующей главе..</para>
<para>Дополнительные источники информации
<itemizedlist>
<listitem>
<simpara><ulink
url="http://www.daemonnews.org/200010/blueprints.html">Учебник
по программированию механизма динамического компоновщика ядра
(KLD)</ulink> - <ulink
url="http://www.daemonnews.org">Daemonnews</ulink>
Октябрь 2000
</simpara>
</listitem>
<listitem>
<simpara><ulink
url="http://www.daemonnews.org/200007/newbus-intro.html">Как
писать драйверы ядра в парадигме NEWBUS</ulink> - <ulink
url="http://www.daemonnews.org">Daemonnews</ulink> Июль 2000
</simpara>
</listitem>
</itemizedlist>
</para>
</sect1>
<sect1>
<title>Сетевые драйверы</title>
<para>В случае драйверов сетевых устройств файлы устройств для доступа к
ним не используются. Их выбор основан на другом механизме, работающем
в ядре, и не использующем вызов open(); об использование сетевых
устройств в общем случае рассказано в описании системного вызова
socket(2).</para>
<para>Почитайте справочную информацию о вызове ifnet(), устройстве
loopback, почитайте драйверы Билла Пола (Bill Paul), и так
далее..</para>
</sect1>
</chapter>

View file

@ -1,340 +0,0 @@
<?xml version="1.0" encoding="koi8-r" standalone="no"?>
<!--
The FreeBSD Russian Documentation Project
The FreeBSD SMP Next Generation Project
$FreeBSD$
$FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/developers-handbook/locking/chapter.sgml,v 1.1 2001/02/19 06:44:22 andy Exp $
Original revision: 1.2
-->
<chapter id="locking">
<title>úÁÍÅÞÁÎÉÑ ÐÏ ÂÌÏËÉÒÏ×ËÅ</title>
<para><emphasis>üÔÁ ÇÌÁ×Á ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÐÒÏÅËÔÏÍ FreeBSD SMP Next
Generation Project
<email>freebsd-smp@FreeBSD.org</email>.</emphasis></para>
<para>üÔÏÔ ÄÏËÕÍÅÎÔ ÏÐÉÓÙ×ÁÅÔ ÍÅÈÁÎÉÚÍ ÂÌÏËÉÒÏ×ËÉ, ÉÓÐÏÌØÚÕÅÍÙÊ × ÑÄÒÅ
FreeBSD ÄÌÑ ÏÂÅÓÐÅÞÅÎÉÑ ÜÆÆÅËÔÉ×ÎÏÊ ÐÏÄÄÅÒÖËÉ ÎÅÓËÏÌØËÉÈ ÐÒÏÃÅÓÓÏÒÏ× ×
ÑÄÒÅ. âÌÏËÉÒÏ×ËÕ ÍÏÖÎÏ ÒÁÓÓÍÁÔÒÉ×ÁÔØ Ó ÎÅÓËÏÌØËÉÈ ÔÏÞÅË ÚÒÅÎÉÑ.
óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ ÍÏÇÕÔ ÂÙÔØ ÚÁÝÉÝÅÎÙ Ó ÐÏÍÏÝØÀ ÂÌÏËÉÒÏ×ÏË mutex ÉÌÉ
&man.lockmgr.9;. îÅÓËÏÌØËÏ ÐÅÒÅÍÅÎÎÙÈ ÚÁÝÉÝÅÎÙ ÐÒÏÓÔÏ × ÓÉÌÕ ÁÔÏÍÁÒÎÏÓÔÉ
ÉÓÐÏÌØÚÕÅÍÙÈ ÄÌÑ ÄÏÓÔÕÐÁ Ë ÎÉÍ ÏÐÅÒÁÃÉÊ.</para>
<sect1>
<title>íØÀÔÅËÓÙ</title>
<para>íØÀÔÅËÓ (mutex) - ÜÔÏ ÐÒÏÓÔÏ ÂÌÏËÉÒÏ×ËÁ, ÉÓÐÏÌØÚÕÅÍÁÑ ÄÌÑ
ÒÅÁÌÉÚÁÃÉÉ ÇÁÒÁÎÔÉÒÏ×ÁÎÎÏÊ ÉÓËÌÀÞÉÔÅÌØÎÏÓÔÉ. ÷ ÞÁÓÔÎÏÓÔÉ, × ËÁÖÄÙÊ
ÍÏÍÅÎÔ ×ÒÅÍÅÎÉ ÍØÀÔÅËÓÏÍ ÍÏÖÅÔ ×ÌÁÄÅÔØ ÔÏÌØËÏ ÏÄÉÎ ÏÂßÅËÔ. åÓÌÉ
ËÁËÏÊ-ÔÏ ÏÂßÅËÔ ÈÏÞÅÔ ÐÏÌÕÞÉÔØ ÍØÀÔÅËÓ, ËÏÔÏÒÙÊ ÕÖÅ ËÔÏ-ÔÏ ÚÁÎÑÌ, ÏÎ
ÄÏÌÖÅÎ ÄÏÖÄÁÔØÓÑ ÍÏÍÅÎÔÁ ÅÇÏ ÏÓ×ÏÂÏÖÄÅÎÉÑ. ÷ ÑÄÒÅ FreeBSD ×ÌÁÄÅÌØÃÁÍÉ
ÍØÀÔÅËÓÏ× Ñ×ÌÑÀÔÓÑ ÐÒÏÃÅÓÓÙ.</para>
<para>íØÀÔÅËÓÙ ÍÏÇÕÔ ÂÙÔØ ÚÁÔÒÅÂÏ×ÁÎÙ ÒÅËÕÒÓÉ×ÎÏ, ÎÏ ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ, ÞÔÏ
ÏÎÉ ÚÁÎÉÍÁÀÔÓÑ ÎÁ ËÏÒÏÔËÏÅ ×ÒÅÍÑ. ÷ ÞÁÓÔÎÏÓÔÉ, ×ÌÁÄÅÌØÃÕ ÍØÀÔÅËÓÁ
ÎÅÌØÚÑ ×ÙÄÅÒÖÉ×ÁÔØ ÐÁÕÚÕ. åÓÌÉ ×ÁÍ ÎÕÖÎÏ ×ÙÐÏÌÎÉÔØ ÂÌÏËÉÒÏ×ËÕ ÎÁ ×ÒÅÍÑ
ÐÁÕÚÙ, ÉÓÐÏÌØÚÕÊÔÅ ÂÌÏËÉÒÏ×ËÕ ÞÅÒÅÚ &man.lockmgr.9;.</para>
<para>ëÁÖÄÙÊ ÍØÀÔÅËÓ ÉÍÅÅÔ ÎÅÓËÏÌØËÏ ÐÒÅÄÓÔÁ×ÌÑÀÝÉÈ ÉÎÔÅÒÅÓ
ÈÁÒÁËÔÅÒÉÓÔÉË:</para>
<variablelist>
<varlistentry>
<term>éÍÑ ÐÅÒÅÍÅÎÎÏÊ</term>
<listitem>
<para>éÍÑ ÐÅÒÅÍÅÎÎÏÊ <type>struct mtx</type> × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ
ÑÄÒÁ.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>ìÏÇÉÞÅÓËÏÅ ÉÍÑ</term>
<listitem>
<para>éÍÑ ÍØÀÔÅËÓÁ, ÎÁÚÎÁÞÅÎÎÏÅ ÅÍÕ ÞÅÒÅÚ
<function>mtx_init</function>. üÔÏ ÉÍÑ ×Ù×ÏÄÉÔÓÑ × ÓÏÏÂÝÅÎÉÑÈ
ÔÒÁÓÓÉÒÏ×ËÉ KTR É ÄÉÁÇÎÏÓÔÉÞÅÓËÉÈ ÐÒÅÄÕÐÒÅÖÄÁÀÝÉÈ É ÏÛÉÂÏÞÎÙÈ
ÓÏÏÂÝÅÎÉÑÈ É ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÉÄÅÎÔÉÆÉËÁÃÉÉ ÍØÀÔÅËÓÏ× ×
ÏÔÌÁÄÏÞÎÏÍ ËÏÄÅ.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>ôÉÐ</term>
<listitem>
<para>ôÉÐ ÍØÀÔÅËÓÁ × ÔÅÒÍÉÎÁÈ ÆÌÁÇÏ× <constant>MTX_*</constant>.
úÎÁÞÅÎÉÅ ËÁÖÄÏÇÏ ÆÌÁÇÁ Ó×ÑÚÁÎÏ Ó ÅÇÏ ÓÍÙÓÌÏÍ ÔÁË, ËÁË ÜÔÏ ÏÐÉÓÁÎÏ
× &man.mutex.9;.</para>
<variablelist>
<varlistentry>
<term><constant>MTX_DEF</constant></term>
<listitem>
<para>Sleep-ÍØÀÔÅËÓ</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_SPIN</constant></term>
<listitem>
<para>Spin-ÍØÀÔÅËÓ</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_COLD</constant></term>
<listitem>
<para>üÔÏÔ ÍØÀÔÅËÓ ÉÎÉÃÉÁÌÉÚÉÒÕÅÔÓÑ ÏÞÅÎØ ÒÁÎÏ. ðÏÜÔÏÍÕ ÏÎ
ÄÏÌÖÅÎ ÂÙÔØ ÏÂßÑ×ÌÅÎ ÞÅÒÅÚ ÆÕÎËÃÉÉ
<function>MUTEX_DECLARE</function>, Á ÆÌÁÇ
<constant>MTX_COLD</constant> ÄÏÌÖÅÎ ÂÙÔØ ÐÅÒÅÄÁÎ × ÆÕÎËÃÉÀ
<function>mtx_init</function>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_TOPHALF</constant></term>
<listitem>
<para>üÔÏÔ spin-ÍØÀÔÅËÓ ÎÅ ÚÁÐÒÅÝÁÅÔ ÐÒÅÒÙ×ÁÎÉÑ.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><constant>MTX_NORECURSE</constant></term>
<listitem>
<para>üÔÏÔ ÍØÀÔÅËÓ ÎÅ ÒÁÚÒÅÛÁÅÔÓÑ ÂÌÏËÉÒÏ×ÁÔØ
ÒÅËÕÒÓÉ×ÎÏ.</para>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>úÁÝÉÔÙ</term>
<listitem>
<para>óÐÉÓÏË ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ ÉÌÉ ÞÌÅÎÏ× ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ, ËÏÔÏÒÙÅ
ÚÁÝÉÝÁÅÔ ÜÔÏÔ ÍØÀÔÅËÓ. äÌÑ ÞÌÅÎÏ× ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ ÉÑÍ ÂÕÄÅÔ ×
ÆÏÒÍÅ
<structname/ÉÍÑ ÓÔÒÕËÔÕÒÙ/.<structfield/ÉÍÑ ÞÌÅÎÁ
ÓÔÒÕËÔÕÒÙ/.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>úÁ×ÉÓÉÍÙÅ ÆÕÎËÃÉÉ</term>
<listitem>
<para>æÕÎËÃÉÉ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ×ÙÚ×ÁÔØ, ÅÓÌÉ ÜÔÏÔ ÍØÀÔÅËÓ
ÚÁÎÑÔ.</para>
</listitem>
</varlistentry>
</variablelist>
<table frame="all" colsep="1" rowsep="1" pgwide="1">
<title>óÐÉÓÏË ÍØÀÔÅËÓÏ×</title>
<tgroup cols="5">
<thead>
<row>
<entry>éÍÑ ÐÅÒÅÍÅÎÎÏÊ</entry>
<entry>ìÏÇÉÞÅÓËÏÅ ÉÍÑ</entry>
<entry>ôÉÐ</entry>
<entry>úÁÝÉÔÙ</entry>
<entry>úÁ×ÉÓÉÍÙÅ ÆÕÎËÃÉÉ</entry>
</row>
</thead>
<!-- âÌÏËÉÒÏ×ËÁ ÐÌÁÎÉÒÏ×ÝÉËÁ ÚÁÄÁÞ -->
<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 - × <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>âÌÏËÉÒÏ×ËÉ ÍÅÎÅÄÖÅÒÁ ÂÌÏËÉÒÏ×ÏË</title>
<para>âÌÏËÉÒÏ×ËÉ, ËÏÔÏÒÙÅ ÄÁÀÔÓÑ ÞÅÒÅÚ ÉÎÔÅÒÆÅÊÓ &man.lockmgr.9;,
Ñ×ÌÑÀÔÓÑ ÂÌÏËÉÒÏ×ËÁÍÉ ÍÅÎÅÄÖÅÒÁ ÂÌÏËÉÒÏ×ÏË. üÔÉ ÂÌÏËÉÒÏ×ËÉ Ñ×ÌÑÀÔÓÑ
ÂÌÏËÉÒÏ×ËÁÍÉ ÎÁ ÞÔÅÎÉÅ/ÚÁÐÉÓØ É ÉÍÉ ÍÏÇÕÔ ×ÌÁÄÅÔØ ÐÒÏÃÅÓÓÙ × ÓÏÓÔÏÑÎÉÉ
ÏÖÉÄÁÎÉÑ.</para>
<table>
<title>óÐÉÓÏË ÂÌÏËÉÒÏ×ÏË &man.lockmgr.9;</title>
<tgroup cols="2">
<thead>
<row>
<entry>éÍÑ ÐÅÒÅÍÅÎÎÏÊ</entry>
<entry>úÁÝÉÔÙ</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>áÔÏÍÁÒÎÏ ÚÁÝÉÝÅÎÎÙÅ ÐÅÒÅÍÅÎÎÙÅ</title>
<para>ðÅÒÅÍÅÎÎÏÊ, ÚÁÝÉÝÅÎÎÏÊ ÁÔÏÍÁÒÎÏ, Ñ×ÌÑÅÔÓÑ ÏÓÏÂÁÑ ÐÅÒÅÍÅÎÎÁÑ,
ËÏÔÏÒÁÑ ÎÅ ÚÁÝÉÝÁÅÔÓÑ Ñ×ÎÏÊ ÂÌÏËÉÒÏ×ËÏÊ. ÷ÍÅÓÔÏ ÜÔÏÇÏ ÄÌÑ ÄÏÓÔÕÐÁ Ë
ÄÁÎÎÙÍ ÐÅÒÅÍÅÎÎÙÈ ÉÓÐÏÌØÚÕÀÔÓÑ ÓÐÅÃÉÁÌØÎÙÅ ÁÔÏÍÁÒÎÙÅ ÏÐÅÒÁÃÉÉ, ËÁË
ÏÐÉÓÁÎÏ × &man.atomic.9;. ìÉÛØ ÎÅÓËÏÌØËÏ ÐÅÒÅÍÅÎÎÙÈ ÉÓÐÏÌØÚÕÀÔÓÑ ÔÁËÉÍ
ÏÂÒÁÚÏÍ, ÈÏÔÑ ÄÒÕÇÉÅ ÐÒÉÍÉÔÉ×Ù ÓÉÎÈÒÏÎÉÚÁÃÉÉ, ÔÁËÉÅ ËÁË ÍØÀÔÅËÓÙ,
ÒÅÁÌÉÚÏ×ÁÎÙ Ó ÁÔÏÍÁÒÎÏ ÚÁÝÉÝÅÎÎÙÍÉ ÐÅÒÅÍÅÎÎÙÍÉ.</para>
<itemizedlist>
<listitem>
<para><varname>astpending</varname></para>
</listitem>
<listitem>
<para><structname/mtx/.<structfield/mtx_lock/</para>
</listitem>
</itemizedlist>
</sect1>
</chapter>

View file

@ -1,222 +0,0 @@
<?xml version="1.0" encoding="koi8-r" standalone="no"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
$FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/developers-handbook/pci/chapter.sgml,v 1.1 2001/02/19 06:50:23 andy Exp $
Original revision: 1.1
-->
<chapter id="pci">
<title>õÓÔÒÏÊÓÔ×Á PCI</title>
<para>üÔÁ ÇÌÁ×Á ÐÏÓ×ÑÝÅÎÁ ÍÅÈÁÎÉÚÍÁÍ FreeBSD ÐÏ ÎÁÐÉÓÁÎÉÀ ÄÒÁÊ×ÅÒÏ×
ÕÓÔÒÏÊÓÔ×, ÒÁÂÏÔÁÀÝÉÈ ÎÁ ÛÉÎÅ PCI.</para>
<sect1><title>ïÂÎÁÒÕÖÅÎÉÅ É ÐÏÄËÌÀÞÅÎÉÅ</title>
<para>úÄÅÓØ ÎÁÈÏÄÉÔÓÑ ÉÎÆÏÒÍÁÃÉÑ Ï ÔÏÍ, ËÁË ËÏÄ ÛÉÎÙ PCI ÐÒÏÈÏÄÉÔ ÐÏ
ÎÅÐÏÄËÌÀÞÅÎÎÙÍ ÕÓÔÒÏÊÓÔ×ÁÍ É ÒÁÓÐÏÚÎÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÚÁÇÒÕÖÅÎÎÏÇÏ ÄÒÁÊ×ÅÒÁ
kld ×ÙÐÏÌÎÉÔØ ÐÏÄËÌÀÞÅÎÉÅ Ë ËÁËÏÍÕ-ÌÉÂÏ ÉÚ ÎÉÈ.</para>
<programlisting>
/*
* Simple KLD to play with the PCI functions.
*
* 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! */
/* Function prototypes */
d_open_t mypci_open;
d_close_t mypci_close;
d_read_t mypci_read;
d_write_t mypci_write;
/* Character device entry points */
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
};
/* vars */
static dev_t sdev;
/* We're more interested in probe/attach than with
open/close/read/write at this point */
int
mypci_open(dev_t dev, int oflags, int devtype, struct proc *p)
{
int err = 0;
uprintf("Opened device \"mypci\" successfully.\n");
return(err);
}
int
mypci_close(dev_t dev, int fflag, int devtype, struct proc *p)
{
int err=0;
uprintf("Closing device \"mypci.\"\n");
return(err);
}
int
mypci_read(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
uprintf("mypci read!\n");
return err;
}
int
mypci_write(dev_t dev, struct uio *uio, int ioflag)
{
int err = 0;
uprintf("mypci write!\n");
return(err);
}
/* PCI Support Functions */
/*
* Return identification string if this is device is ours.
*/
static int
mypci_probe(device_t dev)
{
uprintf("MyPCI Probe\n"
"Vendor ID : 0x%x\n"
"Device ID : 0x%x\n",pci_get_vendor(dev),pci_get_device(dev));
if (pci_get_vendor(dev) == 0x11c1) {
uprintf("We've got the Winmodem, probe successful!\n");
return 0;
}
return ENXIO;
}
/* Attach function is only called if the probe is successful */
static int
mypci_attach(device_t dev)
{
uprintf("MyPCI Attach for : deviceID : 0x%x\n",pci_get_vendor(dev));
sdev = make_dev(<literal>&</literal>mypci_cdevsw,
0,
UID_ROOT,
GID_WHEEL,
0600,
"mypci");
uprintf("Mypci device loaded.\n");
return ENXIO;
}
/* Detach device. */
static int
mypci_detach(device_t dev)
{
uprintf("Mypci detach!\n");
return 0;
}
/* Called during system shutdown after sync. */
static int
mypci_shutdown(device_t dev)
{
uprintf("Mypci shutdown!\n");
return 0;
}
/*
* Device suspend routine.
*/
static int
mypci_suspend(device_t dev)
{
uprintf("Mypci suspend!\n");
return 0;
}
/*
* Device resume routine.
*/
static int
mypci_resume(device_t dev)
{
uprintf("Mypci resume!\n");
return 0;
}
static device_method_t mypci_methods[] = {
/* Device interface */
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 = {
"mypci",
mypci_methods,
0,
/* sizeof(struct mypci_softc), */
};
static devclass_t mypci_devclass;
DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);
</programlisting>
<para>äÏÐÏÌÎÉÔÅÌØÎÁÑ ÉÎÆÏÒÍÁÃÉÑ
<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>
</chapter>

View file

@ -1,28 +0,0 @@
#
# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/ppp-primer/Makefile,v 1.2 2001/07/25 10:17:01 phantom Exp $
# $FreeBSD$
# Original revision: 1.1
#
# Build the PPP Primer
#
MAINTAINER=athome@ukrpost.net
DOC?= book
FORMATS?= html-split html
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
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

File diff suppressed because it is too large Load diff