- 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
|
|
@ -8,7 +8,6 @@
|
||||||
SUBDIR = faq
|
SUBDIR = faq
|
||||||
SUBDIR+= handbook
|
SUBDIR+= handbook
|
||||||
SUBDIR+= porters-handbook
|
SUBDIR+= porters-handbook
|
||||||
SUBDIR+= ppp-primer
|
|
||||||
|
|
||||||
ROOT_SYMLINKS = faq handbook
|
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…
Add table
Add a link
Reference in a new issue