- Remove stale files
Discussd with: taras
This commit is contained in:
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
|
@ -8,7 +8,6 @@
|
|||
SUBDIR = faq
|
||||
SUBDIR+= handbook
|
||||
SUBDIR+= porters-handbook
|
||||
SUBDIR+= ppp-primer
|
||||
|
||||
ROOT_SYMLINKS = faq handbook
|
||||
|
||||
|
|
|
@ -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 <sys/types.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/systm.h> /* uprintf */
|
||||
#include <sys/errno.h>
|
||||
#include <sys/param.h> /* defines used in kernel.h */
|
||||
#include <sys/kernel.h> /* 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 <bsd.kmod.mk>
|
||||
</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 <sys/types.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/systm.h> /* uprintf */
|
||||
#include <sys/errno.h>
|
||||
#include <sys/param.h> /* defines used in kernel.h */
|
||||
#include <sys/kernel.h> /* types used in module initialization */
|
||||
#include <sys/conf.h> /* cdevsw struct */
|
||||
#include <sys/uio.h> /* uio struct */
|
||||
#include <sys/malloc.h>
|
||||
|
||||
#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>
|
|
@ -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>
|
|
@ -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 <sys/types.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/systm.h> /* uprintf */
|
||||
#include <sys/errno.h>
|
||||
#include <sys/param.h> /* defines used in kernel.h */
|
||||
#include <sys/kernel.h> /* types used in module initialization */
|
||||
#include <sys/conf.h> /* cdevsw struct */
|
||||
#include <sys/uio.h> /* uio struct */
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/bus.h> /* structs, prototypes for pci bus stuff */
|
||||
|
||||
#include <pci/pcivar.h> /* 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>
|
|
@ -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
Loading…
Reference in a new issue