git: 64e4abb4e0 - main - Remove obsolete Russian documentation files
Vladlen Popolitov <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.cvs.doc |
|---|---|
| Message-ID | <[email protected]> |
The branch main has been updated by vladlen: URL: https://cgit.FreeBSD.org/doc/commit/?id=64e4abb4e0dba3613d9bb9da7810bccc785b438f commit 64e4abb4e0dba3613d9bb9da7810bccc785b438f Author: Vladlen Popolitov <[email protected]> AuthorDate: 2025-10-29 16:24:22 +0000 Commit: Vladlen Popolitov <[email protected]> CommitDate: 2025-10-29 16:24:22 +0000 Remove obsolete Russian documentation files Delete ru/book/*/chapter.adoc files that are no longer required. Reviewed by: carlavilla Differential Revision: https://reviews.freebsd.org/D53435 --- .../books/arch-handbook/driverbasics/chapter.adoc | 512 ---------------- .../ru/books/arch-handbook/locking/chapter.adoc | 137 ----- .../ru/books/arch-handbook/sound/chapter.adoc | 432 ------------- .../developers-handbook/introduction/chapter.adoc | 140 ----- .../developers-handbook/kerneldebug/chapter.adoc | 678 --------------------- .../developers-handbook/policies/chapter.adoc | 196 ------ .../books/developers-handbook/secure/chapter.adoc | 190 ------ 7 files changed, 2285 deletions(-) diff --git a/documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc b/documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc deleted file mode 100644 index d845e849be..0000000000 --- a/documentation/content/ru/books/arch-handbook/driverbasics/chapter.adoc +++ /dev/null @@ -1,512 +0,0 @@ ---- -title: Ðлава 9. ÐапиÑание дÑайвеÑов ÑÑÑÑойÑÑв Ð´Ð»Ñ FreeBSD -authors: ---- - -[[driverbasics]] -= ÐапиÑание дÑайвеÑов ÑÑÑÑойÑÑв Ð´Ð»Ñ FreeBSD -:doctype: book -:toc: macro -:toclevels: 1 -:icons: font -:sectnums: -:sectnumlevels: 6 -:sectnumoffset: 9 -:partnums: -:source-highlighter: rouge -:experimental: - -ifdef::env-beastie[] -ifdef::backend-html5[] -:imagesdir: ../../../../images/{images-path} -endif::[] -ifndef::book[] -include::shared/authors.adoc[] -include::shared/mirrors.adoc[] -include::shared/releases.adoc[] -include::shared/attributes/attributes-{{% lang %}}.adoc[] -include::shared/{{% lang %}}/teams.adoc[] -include::shared/{{% lang %}}/mailing-lists.adoc[] -include::shared/{{% lang %}}/urls.adoc[] -toc::[] -endif::[] -ifdef::backend-pdf,backend-epub3[] -include::../../../../../shared/asciidoctor.adoc[] -endif::[] -endif::[] - -ifndef::env-beastie[] -toc::[] -include::../../../../../shared/asciidoctor.adoc[] -endif::[] - -ÐÑÑ Ð³Ð»Ð°Ð²Ñ Ð½Ð°Ð¿Ð¸Ñал {murray} на оÑнове множеÑÑва иÑÑоÑников, вклÑÑÐ°Ñ ÑпÑавоÑнÑÑ ÑÑÑаниÑÑ intro(4), коÑоÑÑÑ Ñоздал {joerg}. - -[[driverbasics-intro]] -== Ðведение - -ÐÑа глава ÑвлÑеÑÑÑ ÐºÑаÑким введением в пÑоÑеÑÑ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð´ÑайвеÑов ÑÑÑÑойÑÑв Ð´Ð»Ñ FreeBSD. Ð ÑÑом конÑекÑÑе ÑеÑмин ÑÑÑÑойÑÑво иÑполÑзÑеÑÑÑ Ð² оÑновном Ð´Ð»Ñ Ð²ÐµÑей, ÑвÑзаннÑÑ Ñ Ð¾Ð±Ð¾ÑÑдованием, оÑноÑÑÑимÑÑ Ðº ÑиÑÑеме, ÑÐ°ÐºÐ¸Ñ , как диÑки, пеÑаÑаÑÑие ÑÑÑÑойÑÑва или гÑаÑиÑеÑкие диÑплеи Ñ ÐºÐ»Ð°Ð²Ð¸Ð°ÑÑÑами. ÐÑÐ°Ð¹Ð²ÐµÑ ÑÑÑÑойÑÑва ÑвлÑеÑÑÑ Ð¿ÑогÑаммной компоненÑой опеÑаÑионной ÑиÑÑемÑ, ÑпÑавлÑÑÑей некоÑоÑÑм ÑÑÑÑойÑÑвом. ÐмеÑÑÑÑ Ñакже Ñак назÑваемÑе пÑевдР¾-ÑÑÑÑойÑÑва, в ÑлÑÑае коÑоÑÑÑ Ð´ÑÐ°Ð¹Ð²ÐµÑ ÑÑÑÑойÑÑва ÑмÑлиÑÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑÑÑойÑÑва пÑогÑаммно, без налиÑÐ¸Ñ ÐºÐ° кой-либо ÑооÑвеÑÑÑвÑÑÑей аппаÑаÑÑÑÑ. ÐÑайвеÑÑ ÑÑÑÑойÑÑв могÑÑ Ð±ÑÑÑ Ð²ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑÐ¾Ð²Ð°Ð½Ñ Ð² ÑиÑÑÐµÐ¼Ñ ÑÑаÑиÑеÑки или могÑÑ Ð·Ð°Ð³ÑÑжаÑÑÑÑ Ð¿Ð¾ ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñи помоÑи Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° динамиÑеÑкого компоновÑика ÑдÑа `kld`. - -ÐолÑÑинÑÑво ÑÑÑÑойÑÑв в Unix-подобной опеÑаÑионной ÑиÑÑеме доÑÑÑÐ¿Ð½Ñ ÑеÑез ÑÐ°Ð¹Ð»Ñ ÑÑÑÑойÑÑв (device-nodes), иногда Ñакже назÑваемÑе ÑпеÑиалÑнÑми Ñайлами. РиеÑаÑÑ Ð¸Ð¸ Ñайловой ÑиÑÑÐµÐ¼Ñ ÑÑи ÑÐ°Ð¹Ð»Ñ Ð¾Ð±ÑÑно Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² каÑалоге [.filename]#/dev#. РвеÑÑиÑÑ FreeBSD, более ÑÑаÑÑÑ , Ñем 5.0-RELEASE, в коÑоÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка man:devfs[5] не инÑегÑиÑована в ÑиÑÑемÑ, каждÑй Ñайл ÑÑÑÑойÑÑва должен ÑоздаваÑÑÑÑ ÑÑаÑиÑеÑки и вне завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑооÑвеÑÑÑвÑÑÑего дÑайвеÑа ÑÑÑÑойÑÑ Ð²Ð°. ÐолÑÑинÑÑво Ñайлов ÑÑÑÑойÑÑв в ÑиÑÑеме ÑоздаÑÑÑÑ Ð¿Ñи помоÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ `MAKEDEV`. - -ÐÑайвеÑÑ ÑÑÑÑойÑÑв могÑÑ Ð±ÑÑÑ ÑÑловно ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ Ð½Ð° две каÑегоÑии; дÑайвеÑÑ ÑимволÑнÑÑ Ð¸ ÑеÑевÑÑ ÑÑÑÑойÑÑв. - -[[driverbasics-kld]] -== ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼ динамиÑеÑкого компоновÑика ÑдÑа - KLD - -ÐнÑеÑÑÐµÐ¹Ñ kld позволÑÐµÑ ÑиÑÑемнÑм админиÑÑÑаÑоÑам динамиÑеÑки добавлÑÑÑ Ð¸ ÑбиÑаÑÑ ÑÑнкÑионалÑноÑÑÑ Ð¸Ð· ÑабоÑаÑÑей ÑиÑÑемÑ. ÐÑо позволÑÐµÑ ÑазÑабоÑÑикам дÑайвеÑов ÑÑÑÑойÑÑв загÑÑжаÑÑ ÑобÑÑвеннÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑабоÑаÑÑее ÑдÑо без поÑÑоÑннÑÑ Ð¿ÐµÑезагÑÑзок Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. - -ÐÐ»Ñ ÑабоÑÑ Ñ Ð¸Ð½ÑеÑÑейÑом kld иÑполÑзÑÑÑÑÑ ÑледÑÑÑие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿ÑивилегиÑованного Ñежима: - -* `kldload` - загÑÑÐ¶Ð°ÐµÑ Ð½Ð¾Ð²Ñй модÑÐ»Ñ ÑдÑа -* `kldunload` - вÑгÑÑÐ¶Ð°ÐµÑ Ð¼Ð¾Ð´ÑÐ»Ñ ÑдÑа -* `kldstat` - вÑÐ²Ð¾Ð´Ð¸Ñ ÑпиÑок загÑÑженнÑÑ Ð² даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼Ð¾Ð´Ñлей - -Ð¡ÐºÐµÐ»ÐµÑ Ð¼Ð¾Ð´ÑÐ»Ñ ÑдÑа - -[.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 */ - -static moduledata_t skel_mod = { - "skel", - skel_loader, - NULL -}; - -DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY); -.... - -=== Makefile - -Ðо FreeBSD имеÑÑÑÑ Ð·Ð°Ð³Ð¾Ñовки Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð² make-ÑайлÑ, коÑоÑÑе Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´Ð»Ñ Ð±ÑÑÑÑой компилÑÑии ÑобÑÑвеннÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ð¹ к ÑдÑÑ. - -[.programlisting] -.... -SRCS=skeleton.c -KMOD=skeleton - -.include <bsd.kmod.mk> -.... - -ÐÑоÑÑой запÑÑк ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ `make` Ñ ÑÑим make-Ñайлом пÑÐ¸Ð²ÐµÐ´ÐµÑ Ðº ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñайла [.filename]#skeleton.ko#, коÑоÑÑй можно загÑÑзиÑÑ Ð² ваÑÑ ÑиÑÑемÑ, набÑав: - -[source,shell] -.... -# kldload -v ./skeleton.ko -.... - -[[driverbasics-access]] -== ÐбÑаÑение к дÑайвеÑÑ ÑÑÑÑойÑÑва - -Unix Ð´Ð°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑй обÑий Ð½Ð°Ð±Ð¾Ñ ÑиÑÑемнÑÑ Ð²Ñзовов Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² полÑзоваÑелÑÑÐºÐ¸Ñ Ð¿ÑиложениÑÑ . Ðогда полÑзоваÑÐµÐ»Ñ Ð¾Ð±ÑаÑаеÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ ÑÑÑÑойÑÑва, вÑÑокие ÑÑовни ÑдÑа пеÑенапÑавлÑÑÑ ÑÑи обÑаÑÐµÐ½Ð¸Ñ Ðº ÑооÑвеÑÑÑвÑÑÑÐµÐ¼Ñ Ð´ÑайвеÑÑ ÑÑÑÑойÑÑва. СкÑÐ¸Ð¿Ñ `/dev/MAKEDEV` ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð±Ð¾Ð»ÑÑинÑÑво Ñайлов ÑÑÑÑойÑÑв в ваÑей ÑиÑÑеме, однако еÑли Ð²Ñ Ð²ÐµÐ´ÐµÑе ÑазÑабоÑÐºÑ Ñвоего ÑобÑÑвенного дÑайвеÑа, Ñо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð² Ñоздании ÑобÑÑвеннÑÑ Ñай лов ÑÑÑÑойÑÑв пÑи помоÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ `mknod`. - -=== Создание ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов ÑÑÑÑойÑÑв - -ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñайла ÑÑÑÑойÑÑва команде `mknod` ÑÑебÑеÑÑÑ ÑказаÑÑ ÑеÑÑÑе аÑгÑменÑа. ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑказаÑÑ Ð¸Ð¼Ñ Ñайла ÑÑÑÑойÑÑва, Ñип ÑÑÑÑойÑÑва, ÑÑаÑÑее ÑиÑло ÑÑÑÑойÑÑва и младÑее ÑиÑло ÑÑÑÑойÑÑва. - -=== ÐинамиÑеÑкие ÑÐ°Ð¹Ð»Ñ ÑÑÑÑойÑÑв - -Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑÑема ÑÑÑÑойÑÑв, devfs, пÑедоÑÑавлÑÐµÑ Ð´Ð¾ÑÑÑп к пÑоÑÑÑанÑÑÐ²Ñ Ð¸Ð¼ÐµÐ½ ÑÑÑÑойÑÑв ÑдÑа из глобалÑного пÑоÑÑÑанÑÑва имен Ñайловой ÑиÑÑемÑ. ÐÑо ÑÑÑÑанÑÐµÑ Ð¿Ð¾ÑенÑиалÑнÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð´ÑайвеÑа без ÑÑаÑиÑеÑкого Ñайла ÑÑÑÑойÑÑва или Ñайла ÑÑÑÑойÑÑва без ÑÑÑановленного дÑайвеÑа ÑÑÑÑойÑÑва. Devfs вÑе еÑе Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑазÑабоÑке, однако она Ñже доÑÑаÑоÑно Ñ Ð¾ÑоÑо ÑабоÑаеÑ. - -[[driverbasics-char]] -== СимволÑнÑе ÑÑÑÑойÑÑва - -ÐÑÐ°Ð¹Ð²ÐµÑ ÑимволÑного ÑÑÑÑойÑÑва пеÑÐµÐ´Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе непоÑÑедÑÑвенно в или из пÑоÑеÑÑа полÑзоваÑелÑ. ÐÑо ÑамÑй ÑаÑпÑоÑÑÑаненнÑй Ñип дÑайвеÑа ÑÑÑÑойÑÑва и в деÑеве иÑÑ Ð¾Ð´Ð½ÑÑ ÑекÑÑов имееÑÑÑ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑÑÑ Ð¿ÑимеÑов ÑÐ°ÐºÐ¸Ñ Ð´ÑайвеÑов. - -Ð ÑÑом пÑоÑÑом пÑимеÑе пÑевдо-ÑÑÑÑойÑÑво Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ ÐºÐ°ÐºÐ¸Ðµ Ñгодно знаÑениÑ, коÑоÑÑе Ð²Ñ Ð² него запиÑÑваеÑе, и заÑем Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð¸Ñ Ð½Ð°Ð·Ð°Ð´ пÑи ÑÑении из ÑÑого ÑÑÑÑойÑÑва. ÐÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð´Ð²Ðµ веÑÑии, одна Ð´Ð»Ñ FreeBSD 4.X, а дÑÑÐ³Ð°Ñ Ð´Ð»Ñ FreeBSD 5.X. - -.ÐÑÐ¸Ð¼ÐµÑ Ð´ÑайвеÑа пÑевдо-ÑÑÑÑойÑÑва Echo Ð´Ð»Ñ FreeBSD 4.X -[example] -==== -[.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 -}; - -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 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(echo_cdevsw, - 0, - UID_ROOT, - GID_WHEEL, - 0600, - "echo"); - /* kmalloc memory for use by this driver */ - 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); -.... - -==== - -.ÐÑÐ¸Ð¼ÐµÑ Ð´ÑайвеÑа пÑевдо-ÑÑÑÑойÑÑва Echo Ð´Ð»Ñ FreeBSD 5.X -[example] -==== -[.programlisting] -.... -/* - * Simple `echo' pseudo-device KLD - * - * Murray Stokely - * - * Converted to 5.X by Sren (Xride) Straarup - */ - -#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 -#define CDEV_MAJOR 33 - -/* Function prototypes */ -static d_open_t echo_open; -static d_close_t echo_close; -static d_read_t echo_read; -static d_write_t echo_write; - -/* Character device entry points */ -static struct cdevsw echo_cdevsw = { - .d_open = echo_open, - .d_close = echo_close, - .d_maj = CDEV_MAJOR, - .d_name = "echo", - .d_read = echo_read, - .d_write = echo_write -}; - -typedef struct s_echo { - char msg[BUFFERSIZE]; - int len; -} t_echo; - -/* vars */ -static dev_t echo_dev; -static int count; -static t_echo *echomsg; - -MALLOC_DECLARE(M_ECHOBUF); -MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module"); - -/* - * This function 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 */ - echo_dev = make_dev(echo_cdevsw, - 0, - UID_ROOT, - GID_WHEEL, - 0600, - "echo"); - /* kmalloc memory for use by this driver */ - MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK); - printf("Echo device loaded.\n"); - break; - case MOD_UNLOAD: - destroy_dev(echo_dev); - FREE(echomsg,M_ECHOBUF); - printf("Echo device unloaded.\n"); - break; - default: - err = EINVAL; - break; - } - return(err); -} - -static int -echo_open(dev_t dev, int oflags, int devtype, struct thread *p) -{ - int err = 0; - - uprintf("Opened device \"echo\" successfully.\n"); - return(err); -} - -static int -echo_close(dev_t dev, int fflag, int devtype, struct thread *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) - */ - -static 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. - */ - -static 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 - 1)); - - /* Now we need to null terminate, then record the length */ - *(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE - 1)) = 0; - 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); -.... - -==== - -ÐÐ»Ñ ÑÑÑановки ÑÑого дÑайвеÑа во FreeBSD 4.X ÑнаÑала вам нÑжно ÑоздаÑÑ Ñайл ÑÑÑÑойÑÑва в ваÑей Ñайловой ÑиÑÑеме по команде Ñипа ÑледÑÑÑей: - -[source,shell] -.... -# mknod /dev/echo c 33 0 -.... - -Ðогда ÑÑÐ¾Ñ Ð´ÑÐ°Ð¹Ð²ÐµÑ Ð·Ð°Ð³ÑÑжен, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе вÑполнÑÑÑ ÑледÑÑÑие дейÑÑвиÑ: - -[source,shell] -.... -# echo -n "Test Data" > /dev/echo -# cat /dev/echo -Test Data -.... - -УÑÑÑойÑÑва, обÑлÑживаÑÑие ÑеалÑное обоÑÑдование, опиÑÑваÑÑÑÑ Ð² ÑледÑÑÑей главе. - -ÐополниÑелÑнÑе иÑÑоÑники инÑоÑмаÑии - -* http://www.daemonnews.org/200010/blueprints.html[УÑебник по пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° динамиÑеÑкого компоновÑика ÑдÑа (KLD)] - http://www.daemonnews.org/[Daemonnews] ÐкÑÑбÑÑ 2000 -* http://www.daemonnews.org/200007/newbus-intro.html[Ðак пиÑаÑÑ Ð´ÑайвеÑÑ ÑдÑа в паÑадигме NEWBUS] - http://www.daemonnews.org/[Daemonnews] ÐÑÐ»Ñ 2000 - -[[driverbasics-block]] -== ÐлоÑнÑе ÑÑÑÑойÑÑва (коÑоÑÑÑ Ð±Ð¾Ð»ÑÑе неÑ) - -ÐÑÑгие UNIX(R)-ÑиÑÑÐµÐ¼Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ñо вÑоÑÑм Ñипом диÑковÑÑ ÑÑÑÑойÑÑв, Ñак назÑваемÑÑ ÑÑÑÑойÑÑв Ñ Ð±Ð»Ð¾Ñной оÑганизаÑией. ÐлоÑнÑе ÑÑÑÑойÑÑва ÑвлÑÑÑÑÑ Ð´Ð¸ÑковÑми ÑÑÑÑойÑÑвами, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑдÑо оÑганизÑÐµÑ ÐºÑÑиÑование. Такое кÑÑиÑование Ð´ÐµÐ»Ð°ÐµÑ Ð±Ð»Ð¾ÑнÑе ÑÑÑÑойÑÑва пÑакÑиÑеÑки беÑполезнÑми, или по кÑайней меÑе ненадÑжнÑми. ÐÑÑиÑование изменÑÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð¾Ð¿ÐµÑаÑий запиÑи, лиÑÐ°Ñ Ð¿Ñиложение возможноÑÑи ÑзнаÑÑ ÑеалÑное ÑодеÑÐ ¶Ð¸Ð¼Ð¾Ðµ диÑка в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени. ÐÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑказÑемое и надежное воÑÑÑановление даннÑÑ Ð½Ð° диÑке (Ñайл овÑе ÑиÑÑемÑ, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ пÑоÑее) поÑле ÑÐ±Ð¾Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм. Так как запиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ñложенной, Ñо Ð½ÐµÑ ÑпоÑоба ÑообÑиÑÑ Ð¿ÑиложениÑ, пÑи вÑполнении какой именно опеÑаÑии запиÑи ÑдÑо вÑÑÑеÑилоÑÑ Ñ Ð¾Ñибкой, ÑÑо Ñаким обÑазом оÑложнÑÐµÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ ÑелоÑÑноÑÑи даннÑÑ . Ðо ÑÑой пÑиÑине ÑеÑÑÑзнÑе пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ полагаÑÑÑÑ Ð½Ð° блоÑнÑе ÑÑÑÑойÑÑва, и, на Ñамом деле пÑакÑиÑеÑки во вÑÐµÑ Ð¿ÑиложениÑÑ , коÑоÑÑе ÑабоÑаÑÑ Ñ Ð´Ð¸Ñком напÑÑмÑÑ, имееÑÑÑ Ð±Ð¾Ð»ÑÑ Ð°Ñ Ð¿Ñоблема вÑбоÑа ÑÑÑÑойÑÑв Ñ Ð¿Ð¾ÑледоваÑелÑнÑм доÑÑÑпом (или "raw"), коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑÑÑ. Ðз-за Ñеа лизаÑии оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶! дого диÑка (Ñаздела) в два ÑÑÑÑойÑÑва Ñ ÑазнÑми ÑмÑÑлами, коÑоÑÐ°Ñ ÑÑложнÑÐµÑ ÑооÑвеÑÑÑвÑÑÑий код ÑдÑа, во FreeBSD поддеÑжка диÑковÑÑ ÑÑÑÑойÑÑв Ñ ÐºÑÑиÑованием бÑла оÑбÑоÑена в пÑоÑеÑÑе модеÑнизаÑии инÑÑаÑÑÑÑкÑÑÑÑ I/O-опеÑаÑий Ñ Ð´Ð¸Ñками. - -[[driverbasics-net]] -== СеÑевÑе дÑайвеÑÑ - -Ð ÑлÑÑае дÑайвеÑов ÑеÑевÑÑ ÑÑÑÑойÑÑв ÑÐ°Ð¹Ð»Ñ ÑÑÑÑойÑÑв Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ним не иÑполÑзÑÑÑÑÑ. ÐÑ Ð²ÑÐ±Ð¾Ñ Ð¾Ñнован на дÑÑгом Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ðµ, ÑабоÑаÑÑем в ÑдÑе, и не иÑполÑзÑÑÑем вÑзов open(); об иÑполÑзование ÑеÑевÑÑ ÑÑÑÑойÑÑв в обÑем ÑлÑÑае ÑаÑÑказано в опиÑании ÑиÑÑемного вÑзова socket(2). - -ÐоÑиÑайÑе ÑпÑавоÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ вÑзове ifnet(), ÑÑÑÑойÑÑве loopback, поÑиÑайÑе дÑайвеÑÑ Ðилла Ðола (Bill Paul), и Ñак далее.. diff --git a/documentation/content/ru/books/arch-handbook/locking/chapter.adoc b/documentation/content/ru/books/arch-handbook/locking/chapter.adoc deleted file mode 100644 index bdb37f8e29..0000000000 --- a/documentation/content/ru/books/arch-handbook/locking/chapter.adoc +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Ðлава 2. ÐамеÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ блокиÑовке -authors: ---- - -[[locking]] -= ÐамеÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ блокиÑовке -:doctype: book -:toc: macro -:toclevels: 1 -:icons: font -:sectnums: -:sectnumlevels: 6 -:sectnumoffset: 2 -:partnums: -:source-highlighter: rouge -:experimental: - -ifdef::env-beastie[] -ifdef::backend-html5[] -:imagesdir: ../../../../images/{images-path} -endif::[] -ifndef::book[] -include::shared/authors.adoc[] -include::shared/mirrors.adoc[] -include::shared/releases.adoc[] -include::shared/attributes/attributes-{{% lang %}}.adoc[] -include::shared/{{% lang %}}/teams.adoc[] -include::shared/{{% lang %}}/mailing-lists.adoc[] -include::shared/{{% lang %}}/urls.adoc[] -toc::[] -endif::[] -ifdef::backend-pdf,backend-epub3[] -include::../../../../../shared/asciidoctor.adoc[] -endif::[] -endif::[] - -ifndef::env-beastie[] -toc::[] -include::../../../../../shared/asciidoctor.adoc[] -endif::[] - -_ÐÑа глава поддеÑживаеÑÑÑ Ð¿ÑоекÑом FreeBSD SMP Next Generation Project. ÐомменÑаÑии и Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð½Ð°Ð¿ÑавлÑйÑе в link:{freebsd-smp}._ - -ÐÑÐ¾Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð¾Ð¿Ð¸ÑÑÐ²Ð°ÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ блокиÑовки, иÑполÑзÑемÑй в ÑдÑе FreeBSD Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑÑÑекÑивной поддеÑжки неÑколÑÐºÐ¸Ñ Ð¿ÑоÑеÑÑоÑов в ÑдÑе. ÐлокиÑÐ¾Ð²ÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑаÑÑмаÑÑиваÑÑ Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑоÑек зÑениÑ. СÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð·Ð°ÑиÑÐµÐ½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок mutex или man:lockmgr[9]. ÐеÑколÑко пеÑеменнÑÑ Ð·Ð°ÑиÑÐµÐ½Ñ Ð¿ÑоÑÑо в ÑÐ¸Ð»Ñ Ð°ÑомаÑноÑÑи иÑполÑзÑемÑÑ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ним опеÑаÑий. - -[[locking-mutexes]] -== ÐÑÑÑекÑÑ - -ÐÑÑÑÐµÐºÑ (mutex) - ÑÑо пÑоÑÑо блокиÑовка, иÑполÑзÑÐµÐ¼Ð°Ñ Ð´Ð»Ñ ÑеализаÑии гаÑанÑиÑованной иÑклÑÑиÑелÑноÑÑи. Ð ÑаÑÑноÑÑи, в каждÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени мÑÑÑекÑом Ð¼Ð¾Ð¶ÐµÑ Ð²Ð»Ð°Ð´ÐµÑÑ ÑолÑко один обÑекÑ. ÐÑли какой-Ñо обÑÐµÐºÑ Ñ Ð¾ÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¼ÑÑÑекÑ, коÑоÑÑй Ñже кÑо-Ñо занÑл, он должен дождаÑÑÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñа его оÑвобождениÑ. Ð ÑдÑе FreeBSD владелÑÑами мÑÑÑекÑов ÑвлÑÑÑÑÑ Ð¿ÑоÑеÑÑÑ. - -ÐÑÑÑекÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð·Ð°ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ñ ÑекÑÑÑивно, но пÑедполагаеÑÑÑ, ÑÑо они занимаÑÑÑÑ Ð½Ð° коÑоÑкое вÑемÑ. Ð ÑаÑÑноÑÑи, владелÑÑÑ Ð¼ÑÑÑекÑа нелÑÐ·Ñ Ð²ÑдеÑживаÑÑ Ð¿Ð°ÑзÑ. ÐÑли вам нÑжно вÑполниÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð½Ð° вÑÐµÐ¼Ñ Ð¿Ð°ÑзÑ, иÑполÑзÑйÑе блокиÑÐ¾Ð²ÐºÑ ÑеÑез man:lockmgr[9]. - -ÐаждÑй мÑÑÑÐµÐºÑ Ð¸Ð¼ÐµÐµÑ Ð½ÐµÑколÑко пÑедÑÑавлÑÑÑÐ¸Ñ Ð¸Ð½ÑеÑÐµÑ Ñ Ð°ÑакÑеÑиÑÑик: - -ÐÐ¼Ñ Ð¿ÐµÑеменной:: -ÐÐ¼Ñ Ð¿ÐµÑеменной [type]#struct mtx# в иÑÑ Ð¾Ð´Ð½ÑÑ ÑекÑÑÐ°Ñ ÑдÑа. - -ÐогиÑеÑкое имÑ:: -ÐÐ¼Ñ Ð¼ÑÑÑекÑа, назнаÑенное ÐµÐ¼Ñ ÑеÑез `mtx_init`. ÐÑо Ð¸Ð¼Ñ Ð²ÑводиÑÑÑ Ð² ÑообÑениÑÑ ÑÑаÑÑиÑовки KTR и диагноÑÑиÑеÑÐºÐ¸Ñ Ð¿ÑедÑпÑеждаÑÑÐ¸Ñ Ð¸ оÑибоÑнÑÑ ÑообÑениÑÑ Ð¸ иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑии мÑÑÑекÑов в оÑладоÑном коде. - -Тип:: -Тип мÑÑÑекÑа в ÑеÑÐ¼Ð¸Ð½Ð°Ñ Ñлагов [constant]#MTX_*#. ÐнаÑение каждого Ñлага ÑвÑзано Ñ ÐµÐ³Ð¾ ÑмÑÑлом Ñак, как ÑÑо опиÑано в man:mutex[9]. - -[constant]#MTX_DEF#::: -Sleep-мÑÑÑÐµÐºÑ - -[constant]#MTX_SPIN#::: -Spin-мÑÑÑÐµÐºÑ - -[constant]#MTX_RECURSE#::: -ÐÑÐ¾Ð¼Ñ Ð¼ÑÑÑекÑÑ ÑазÑеÑаеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ ÑекÑÑÑивно. - -ÐаÑиÑÑ:: -СпиÑок ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð»Ð¸ Ñленов ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе заÑиÑÐ°ÐµÑ ÑÑÐ¾Ñ Ð¼ÑÑÑекÑ. ÐÐ»Ñ Ñленов ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð¼Ñ Ð±ÑÐ´ÐµÑ Ð² ÑоÑме . Ñлена ÑÑÑÑкÑÑÑÑ/. - -ÐавиÑимÑе ÑÑнкÑии:: -ФÑнкÑии, коÑоÑÑе можно вÑзваÑÑ, еÑли ÑÑÐ¾Ñ Ð¼ÑÑÑÐµÐºÑ Ð·Ð°Ð½ÑÑ. - -.СпиÑок мÑÑÑекÑов -[cols="15%,10%,10%,55%,20%", frame="all", options="header"] -|=== -| Variable Name -| Logical Name -| Type -| Protectees -| Dependent Functions - -|sched_lock -|"sched lock" -|`MTX_SPIN` \| `MTX_RECURSE` -|`_gmonparam`, `cnt.v_swtch`, `cp_time`, `curpriority`, `mtx`.`mtx_blocked`, `mtx`.`mtx_contested`, `proc`.`p_procq`, `proc`.`p_slpq`, `proc`.`p_sflag`, `proc`.`p_stat`, `proc`.`p_estcpu`, `proc`.`p_cpticks` `proc`.`p_pctcpu`, `proc`.`p_wchan`, `proc`.`p_wmesg`, `proc`.`p_swtime`, `proc`.`p_slptime`, `proc`.`p_runtime`, `proc`.`p_uu`, `proc`.`p_su`, `proc`.`p_iu`, `proc`.`p_uticks`, `proc`.`p_sticks`, `proc`.`p_iticks`, `proc`.`p_oncpu`, `proc`.`p_lastcpu`, `proc`.`p_rqindex`, `proc`.`p_heldmtx`, `proc`.`p_blocked`, `proc`.`p_mtxname`, `proc`.`p_contested`, `proc`.`p_priority`, `proc`.`p_usrpri`, `proc`.`p_nativepri`, `proc`.`p_nice`, `proc`.`p_rtprio`, `pscnt`, `slpque`, `itqueuebits`, `itqueues`, `rtqueuebits`, `rtqueues`, `queuebits`, `queues`, `idqueuebits`, `idqueues`, `switchtime`, `switchticks` -|`setrunqueue`, `remrunqueue`, `mi_switch`, `chooseproc`, `schedclock`, `resetpriority`, `updatepri`, `maybe_resched`, `cpu_switch`, `cpu_throw`, `need_resched`, `resched_wanted`, `clear_resched`, `aston`, `astoff`, `astpending`, `calcru`, `proc_compare` - -|vm86pcb_lock -|"vm86pcb lock" -|`MTX_DEF` -|`vm86pcb` -|`vm86_bioscall` - -|Giant -|"Giant" -|`MTX_DEF` \| `MTX_RECURSE` -|nearly everything -|lots - -|callout_lock -|"callout lock" -|`MTX_SPIN` \| `MTX_RECURSE` -|`callfree`, `callwheel`, `nextsoftcheck`, `proc`.`p_itcallout`, `proc`.`p_slpcallout`, `softticks`, `ticks` -| -|=== - -[[locking-sx]] -== РазделÑемÑе ÑкÑклÑзивнÑе блокиÑовки - -ÐÑи блокиÑовки обеÑпеÑиваÑÑ Ð±Ð°Ð·Ð¾Ð²Ñй Ñип ÑÑнкÑионалÑноÑÑи - на ÑÑение/запиÑÑ Ð¸ могÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð¿ÑоÑеÑÑами, Ð½Ð°Ñ Ð¾Ð´ÑÑимÑÑ Ð² ÑоÑÑоÑнии ожиданиÑ. Ðа ÑекÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾Ð½Ð¸ ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð² man:lockmgr[9]. - -.СпиÑок ÑазделÑемÑÑ ÑкÑклÑзивнÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок -[cols="1,1", options="header"] -|=== -| ÐÐ¼Ñ Ð¿ÐµÑеменной -| ÐаÑиÑÑ - -|`allproc_lock` -|`allproc` `zombproc` `pidhashtbl` `proc`.`p_list` `proc`.`p_hash` `nextpid` - -|`proctree_lock` -|`proc`.`p_children` `proc`.`p_sibling` -|=== - -[[locking-atomic]] -== ÐÑомаÑно заÑиÑеннÑе пеÑеменнÑе - -ÐеÑеменной, заÑиÑенной аÑомаÑно, ÑвлÑеÑÑÑ Ð¾ÑÐ¾Ð±Ð°Ñ Ð¿ÐµÑеменнаÑ, коÑоÑÐ°Ñ Ð½Ðµ заÑиÑаеÑÑÑ Ñвной блокиÑовкой. ÐмеÑÑо ÑÑого Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к даннÑм пеÑеменнÑÑ Ð¸ÑполÑзÑÑÑÑÑ ÑпеÑиалÑнÑе аÑомаÑнÑе опеÑаÑии, как опиÑано в man:atomic[9]. ÐиÑÑ Ð½ÐµÑколÑко пеÑеменнÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ñаким обÑазом, Ñ Ð¾ÑÑ Ð´ÑÑгие пÑимиÑÐ¸Ð²Ñ ÑÐ¸Ð½Ñ ÑонизаÑии, Ñакие как мÑÑÑекÑÑ, ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ñ Ð°ÑомаÑно заÑиÑеннÑми пеÑеменнÑми. - -* `mtx`.`mtx_lock` diff --git a/documentation/content/ru/books/arch-handbook/sound/chapter.adoc b/documentation/content/ru/books/arch-handbook/sound/chapter.adoc deleted file mode 100644 index 4bb8b82ea9..0000000000 --- a/documentation/content/ru/books/arch-handbook/sound/chapter.adoc +++ /dev/null @@ -1,432 +0,0 @@ ---- -title: Ðлава 15. ÐодÑиÑÑема звÑка -authors: ---- - -[[oss]] -= ÐодÑиÑÑема звÑка -:doctype: book -:toc: macro -:toclevels: 1 -:icons: font -:sectnums: -:sectnumlevels: 6 -:sectnumoffset: 15 -:partnums: -:source-highlighter: rouge -:experimental: - -ifdef::env-beastie[] -ifdef::backend-html5[] -:imagesdir: ../../../../images/{images-path} -endif::[] -ifndef::book[] -include::shared/authors.adoc[] -include::shared/mirrors.adoc[] -include::shared/releases.adoc[] -include::shared/attributes/attributes-{{% lang %}}.adoc[] -include::shared/{{% lang %}}/teams.adoc[] -include::shared/{{% lang %}}/mailing-lists.adoc[] -include::shared/{{% lang %}}/urls.adoc[] -toc::[] -endif::[] -ifdef::backend-pdf,backend-epub3[] -include::../../../../../shared/asciidoctor.adoc[] -endif::[] -endif::[] - -ifndef::env-beastie[] -toc::[] -include::../../../../../shared/asciidoctor.adoc[] -endif::[] - -[[oss-intro]] -== Ðведение - -ÐеÑевод на ÑÑÑÑкий ÑзÑк: ÐиÑалий Ðогданов (mailto:[email protected][[email protected]]) - -РподÑиÑÑеме звÑка FreeBSD ÑÑÑеÑÑвÑÐµÑ ÑÑÑкое Ñазделение Ð¼ÐµÐ¶Ð´Ñ ÑаÑÑÑÑ, поддеÑживаÑÑей обÑие звÑковÑе возможноÑÑи и аппаÑаÑно завиÑимой ÑаÑÑÑÑ. ÐÐ°Ð½Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Ð´ÐµÐ»Ð°ÐµÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÑм добавление поддеÑжки новÑÑ ÑÑÑÑойÑÑв. - -man:pcm[4] Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ ÑенÑÑалÑное меÑÑо в подÑиÑÑеме звÑка. Ðго оÑновнÑми ÑлеменÑами ÑвлÑÑÑÑÑ: - -* ÐнÑеÑÑÐµÐ¹Ñ ÑиÑÑемнÑÑ Ð²Ñзовов (read, write, ioctls) к ÑÑнкÑиÑм оÑиÑÑованного звÑка и микÑеÑа. ÐоманднÑй Ð½Ð°Ð±Ð¾Ñ ioctl ÑовмеÑÑим Ñ Ð¸Ð½ÑеÑÑейÑом _OSS_ или _Voxware_, позволÑÑ Ñем ÑамÑм поÑÑиÑование мÑлÑÑимедиа пÑиложений без дополниÑелÑной модиÑикаÑии. -* ÐбÑий код обÑабоÑки звÑковÑÑ Ð´Ð°Ð½Ð½ÑÑ (пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑоÑмаÑов, виÑÑÑалÑнÑе каналÑ). -* ÐдинÑй пÑогÑаммнÑй инÑеÑÑÐµÐ¹Ñ Ðº аппаÑаÑно-завиÑимÑм модÑлÑм звÑкового инÑеÑÑейÑа. -* ÐополниÑелÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑжка неÑколÑÐºÐ¸Ñ Ð¾Ð±ÑÐ¸Ñ Ð°Ð¿Ð¿Ð°ÑаÑнÑÑ Ð¸Ð½ÑеÑÑейÑов (ac97) или ÑазделÑемого аппаÑаÑно-ÑпеÑиÑиÑного кода (напÑимеÑ: ÑÑнкÑии ISA DMA). - -ÐоддеÑжка оÑделÑнÑÑ Ð·Ð²ÑковÑÑ ÐºÐ°ÑÑ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð°Ð¿Ð¿Ð°ÑаÑно-ÑпеÑиÑиÑнÑÑ Ð´ÑайвеÑов, обеÑпеÑиваÑÑÐ¸Ñ ÐºÐ°Ð½Ð°Ð»ÑнÑе и микÑеÑнÑе инÑеÑÑейÑÑ, вклÑÑаемÑе в обÑий код. - -Ð ÑÑой главе ÑеÑмином Ð¼Ñ Ð±Ñдем назÑваÑÑ ÑенÑÑалÑнÑÑ, обÑÑÑ ÑаÑÑÑ Ð·Ð²Ñкового дÑайвеÑа, как пÑоÑивопоÑÑавление аппаÑаÑно-ÑпеÑиÑиÑнÑм модÑлÑм. - -Человек, ÑеÑаÑÑий напиÑаÑÑ Ð´ÑÐ°Ð¹Ð²ÐµÑ Ð½Ð°Ð²ÐµÑнÑка Ð·Ð°Ñ Ð¾ÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² каÑеÑÑве Ñаблона Ñже ÑÑÑеÑÑвÑÑÑий код. Ðо, еÑли звÑковой код Ñ Ð¾ÑÐ¾Ñ Ð¸ ÑиÑÑ, он Ñакже в оÑновном лиÑÑн комменÑаÑиев. ÐÑÐ¾Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ - попÑÑка ÑаÑÑмоÑÑÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ инÑеÑÑейÑа и попÑÑка оÑвеÑиÑÑ Ð½Ð° вопÑоÑÑ, возникÑие пÑи адапÑиÑовании ÑÑÑеÑÑвÑÑÑего кода. - -ÐÐ»Ñ ÑÑаÑÑа Ñ ÑабоÑего пÑимеÑа, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе найÑи Ñаблон дÑайвеÑа, оÑнаÑенного комменÑаÑиÑми на http://people.FreeBSD.org/\~cg/template.c[ http://people.FreeBSD.org/~cg/template.c] - -[[oss-files]] -== Ð¤Ð°Ð¹Ð»Ñ - -ÐеÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñй код, на ÑегоднÑÑний Ð¼Ð¾Ð¼ÐµÐ½Ñ (FreeBSD 4.4), ÑодеÑжиÑÑÑ Ð² каÑалоге [.filename]#/usr/src/sys/dev/sound/#, за иÑклÑÑением пÑблиÑнÑÑ Ð¾Ð¿Ñеделений инÑеÑÑейÑа ioctl, Ð½Ð°Ñ Ð¾Ð´ÑÑÐ¸Ñ ÑÑ Ð² [.filename]#/usr/src/sys/sys/soundcard.h# - -РподкаÑалоге [.filename]#pcm/# ÑодиÑелÑÑкого каÑалога [.filename]#/usr/src/sys/dev/sound/# Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð³Ð»Ð°Ð²Ð½Ñй код, а в каÑÐ°Ð»Ð¾Ð³Ð°Ñ [.filename]#isa/# и [.filename]#pci/# ÑодеÑжаÑÑÑ Ð´ÑайвеÑа Ð´Ð»Ñ ISA и PCI каÑÑ. - -[[pcm-probe-and-attach]] -== ÐбнаÑÑжение, подклÑÑение, и Ñ.д. - -ÐбнаÑÑжение и подклÑÑение звÑковÑÑ Ð´ÑайвеÑов во многом ÑÑ Ð¾Ð¶Ðµ Ñ Ð´ÑайвеÑом лÑбого дÑÑгого ÑÑÑÑойÑÑва. Ðа дополниÑелÑной инÑоÑмаÑией Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе обÑаÑиÑÑÑÑ Ðº главам <<isa-driver, ISA>> или <<pci,PCI>> данного ÑÑководÑÑва. - -Ðо вÑÑ Ð¶Ðµ, звÑковÑе дÑайвеÑа немного оÑлиÑаÑÑÑÑ: - -* Ðни обÑÑвлÑÑÑ Ñами ÑебÑ, как ÑÑÑÑойÑÑва клаÑÑа , Ñ ÑаÑÑной ÑÑÑÑкÑÑÑой ÑÑÑÑойÑÑва : -+ -[.programlisting] -.... - static driver_t xxx_driver = { - "pcm", - xxx_methods, - sizeof(struct snddev_info) - }; - - DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0); - MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER); -.... -+ -ÐолÑÑинÑÑво звÑковÑÑ Ð´ÑайвеÑов нÑждаÑÑÑÑ Ð² ÑÐ¾Ñ Ñанении лиÑной инÑоÑмаÑии, каÑаÑÑейÑÑ Ð¸Ñ ÑÑÑÑойÑÑва. СÑÑÑкÑÑÑа Ñ Ð»Ð¸ÑнÑми даннÑми обÑÑно вÑделÑеÑÑÑ Ð¿Ñи вÑзове ÑÑнкÑии attach. ÐÑ Ð°Ð´ÑÐµÑ Ð¿ÐµÑедаÑÑÑÑ Ð¿Ð¾ÑÑедÑÑвом вÑзовов `pcm_register()` и `mixer_init()`. Ðозже пеÑедаÑÑ Ð½Ð°Ð·Ð°Ð´ ÑÑÐ¾Ñ Ð°Ð´ÑеÑ, в каÑеÑÑве паÑамеÑÑа в вÑÐ·Ð¾Ð²Ð°Ñ Ðº инÑеÑÑейÑам звÑкового дÑайвеÑа. -* ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð·Ð²Ñкового дÑайвеÑа должна обÑÑвлÑÑÑ ÐµÑ Ð¼Ð¸ÐºÑеÑнÑй или AC97 инÑеÑÑÐµÐ¹Ñ Ð¿Ð¾ÑÑедÑÑвом вÑзова `mixer_init()`. ÐÐ»Ñ Ð¼Ð¸ÐºÑеÑного инÑеÑÑейÑа ÑÑо взамен веÑнÑÑ Ð²Ñзов <<xxxmixer-init,`xxxmixer_init()`>>. -* ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð·Ð²Ñкового дÑайвеÑа пеÑедаÑÑ Ð¾Ð±Ñие наÑÑÑойки каналов поÑÑедÑÑвом вÑзова `pcm_register(dev, sc, nplay, nrec)`, где `sc` - адÑÐµÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ ÑÑÑÑойÑÑва, иÑполÑзÑемой в далÑнейÑÐ¸Ñ Ð²ÑÐ·Ð¾Ð²Ð°Ñ Ð¾Ñ , а `nplay` и `nrec` - колиÑеÑÑво каналов пÑоигÑÑÐ²Ð°Ð½Ð¸Ñ Ð¸ запиÑи. -* ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð·Ð²Ñкового дÑайвеÑа обÑÑвлÑÐµÑ ÐºÐ°Ð¶Ð´Ñй из ÐµÑ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ñзовов `pcm_addchan()`. ÐÑо ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð·Ð°Ð½ÑÑоÑÑÑ ÐºÐ°Ð½Ð°Ð»Ð° в и вÑÐ·Ð¾Ð²ÐµÑ Ð²Ð·Ð°Ð¼ÐµÐ½ вÑзов <<xxxchannel-init,`xxxchannel_init()`>>. -* ФÑнкÑÐ¸Ñ Ð¾ÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑзÑваÑÑ `pcm_unregister()` пеÑед обÑÑвлением ÐµÑ ÑеÑÑÑÑов ÑвободнÑми. - -СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° меÑода ÑабоÑÑ Ñ Ð½Ðµ PnP ÑÑÑÑойÑÑвами: - -* ÐÑполÑзование меÑода `device_identify()` (пÑÐ¸Ð¼ÐµÑ ÑмоÑÑиÑе в: [.filename]#sound/isa/es1888.c#). `device_identify()` пÑÑаеÑÑÑ Ð¾Ð±Ð½Ð°ÑÑжиÑÑ Ð¾Ð±Ð¾ÑÑдование, иÑполÑзÑÑÑее извеÑÑнÑе адÑеÑа, и еÑли найдÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаемое ÑÑÑÑойÑÑво, Ñо ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ pcm ÑÑÑÑойÑÑво, коÑоÑое заÑем бÑÐ´ÐµÑ Ð¿ÐµÑедано пÑоÑеÑÑÑ Ð¾Ð±Ð½Ð°ÑÑжениÑ/подклÑÑениÑ. -* ÐÑполÑзование вÑбоÑоÑной конÑигÑÑаÑии ÑдÑа Ñ ÑооÑвеÑÑÑвÑÑÑими Ñ Ð¸Ð½Ñами Ð´Ð»Ñ pcm ÑÑÑÑойÑÑв (пÑимеÑ: [.filename]#sound/isa/mss.c#). - -дÑайвеÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ `device_suspend`, `device_resume` и `device_shutdown` ÑÑнкÑии, Ð´Ð»Ñ ÐºÐ¾ÑÑекÑного ÑÑнкÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñанием и пÑоÑеÑÑа вÑгÑÑзки модÑлÑ. - -[[oss-interfaces]] -== ÐнÑеÑÑейÑÑ - -ÐнÑеÑÑÐµÐ¹Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¸ звÑковÑми дÑайвеÑами опÑеделÑн в ÑеÑÐ¼Ð¸Ð½Ð°Ñ <<kernel-objects,обÑекÑов ÑдÑа>>. - -ÐÑÑÑ 2 оÑновнÑÑ Ð¸Ð½ÑеÑÑейÑа, коÑоÑÑе обÑÑно обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð·Ð²Ñковой дÑайвеÑ: _каналÑнÑй_ и, либо _микÑеÑнÑй_ либо _AC97_. - -ÐнÑеÑÑÐµÐ¹Ñ _AC97_ доволÑно мало иÑполÑзÑÐµÑ Ð´Ð¾ÑÑÑп к ÑеÑÑÑÑам обоÑÑÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ (ÑÑение/запиÑÑ ÑегиÑÑÑов). ÐаннÑй инÑеÑÑÐµÐ¹Ñ Ñеализован в дÑайвеÑÐ°Ñ Ð´Ð»Ñ ÐºÐ°ÑÑ Ñ ÐºÐ¾Ð´ÐµÐºÐ¾Ð¼ AC97. Ð ÑÑом ÑлÑÑае ÑакÑиÑеÑкий микÑеÑнÑй инÑеÑÑÐµÐ¹Ñ Ð¾Ð±ÐµÑпеÑиваеÑÑÑ ÑазделÑемÑм кодом AC97 в . - -=== ÐаналÑнÑй инÑеÑÑÐµÐ¹Ñ - -==== ÐбÑие замеÑки о паÑамеÑÑÐ°Ñ ÑÑнкÑий - -ÐвÑковÑе дÑайвеÑÑ Ð¾Ð±ÑÑно имеÑÑ ÑÑÑÑкÑÑÑÑ Ñ Ð»Ð¸ÑнÑми даннÑми Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¸Ñ ÑÑÑÑойÑÑва и по одной ÑÑÑÑкÑÑÑе на каждÑй поддеÑживаемÑй канал пÑоигÑÑÐ²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ запиÑи даннÑÑ . - -ÐÐ»Ñ Ð²ÑÐµÑ ÑÑнкÑий каналÑного инÑеÑÑейÑа пеÑвÑй паÑамеÑÑ - непÑозÑаÑнÑй ÑказаÑелÑ. - -ÐÑоÑой паÑамеÑÑ ÑÑо ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑÑÑкÑÑÑÑ Ñ Ð´Ð°Ð½Ð½Ñми канала. ÐÑклÑÑение: У ``channel_init()`` ÑÑо ÑказаÑÐµÐ»Ñ Ð½Ð° ÑаÑÑнÑÑ ÑÑÑÑкÑÑÑÑ ÑÑÑÑойÑÑва (Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð° канал Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ). - -==== ÐÐ±Ð·Ð¾Ñ Ð¾Ð¿ÐµÑаÑий пеÑедаÑи даннÑÑ - -ÐÐ»Ñ Ð¿ÐµÑедаÑи даннÑÑ , и звÑковÑе дÑайвеÑа иÑполÑзÑÑÑ ÑазделÑемÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи, опиÑаннÑÑ Ð² . - -пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ , и звÑковÑе дÑайвеÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð½ÑжнÑе знаÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ñзовов ÑÑнкÑий (`sndbuf_getxxx()`). - -ÐблаÑÑÑ ÑазделÑемой памÑÑи Ð¸Ð¼ÐµÐµÑ ÑазмеÑ, опÑеделÑемÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ `sndbuf_getsize()` и ÑазделÑн на блоки ÑикÑиÑованного ÑазмеÑа, опÑеделÑнного в `sndbuf_getblksz()` колиÑеÑÑва байÑ. - -ÐÑи пÑоигÑÑвании, обÑий Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ пеÑедаÑи даннÑÑ Ð¿ÑимеÑно ÑледÑÑÑий (обÑаÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ, иÑполÑзÑÐµÐ¼Ð¾Ð¼Ñ Ð¿Ñи запиÑи): - -* РнаÑале, заполнÑÐµÑ Ð±ÑÑеÑ, заÑем вÑзÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ Ð·Ð²Ñкового дÑайвеÑа <<channel-trigger,``xxxchannel_trigger()``>> Ñ Ð¿Ð°ÑамеÑÑом PCMTRIG_START. -* ÐаÑем звÑковой дÑÐ°Ð¹Ð²ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑно пеÑедаÑÑ Ð²ÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи (`sndbuf_getbuf()`, `sndbuf_getsize()`) ÑÑÑÑойÑÑвÑ, Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑвом байÑ, опÑеделÑннÑм в `sndbuf_getblksz()` . Ðзамен ÑÑо вÑÐ·Ð¾Ð²ÐµÑ `chn_intr()` ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пеÑеданного блока (ÑÑо обÑÑно пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿ÑеÑÑваниÑ). -* `chn_intr()` копиÑÑÐµÑ Ð½Ð¾Ð²Ñе даннÑе в облаÑÑÑ, коÑоÑÐ°Ñ Ð±Ñла пеÑедана ÑÑÑÑойÑÑÐ²Ñ (ÑейÑÐ°Ñ ÑвободнаÑ) и вноÑÐ¸Ñ ÑооÑвеÑÑÑвÑÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑÑÑкÑÑÑÑ . - -[[xxxchannel-init]] -=== channel_init - -`xxxchannel_init()` вÑзÑваеÑÑÑ Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии каждого из каналов пÑоигÑÑÐ²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ запиÑи. ÐÑÐ·Ð¾Ð²Ñ Ð¸Ð½Ð¸ÑииÑÑÑÑÑÑ ÑÑнкÑией подклÑÑÐµÐ½Ð¸Ñ Ð·Ð²Ñкового дÑайвеÑа. (ÐодÑобнее в главе <<pcm-probe-and-attach, ÐбнаÑÑжение и подклÑÑение>>). - -[.programlisting] -.... - static void * - xxxchannel_init(kobj_t obj, void *data, - struct snd_dbuf *b, struct pcm_channel *c, int dir) - { - struct xxx_info *sc = data; - struct xxx_chinfo *ch; - ... - return ch; - } - - b - ÑÑо адÑÐµÑ ÐºÐ°Ð½Ð°Ð»Ñной - struct snd_dbuf. Ðна должна - бÑÑÑ Ð¸Ð½Ð¸ÑиализиÑована в ÑÑнкÑии поÑÑедÑÑвом - вÑзова sndbuf_alloc(). ÐоÑмалÑнÑй - ÑÐ°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ - наименÑÑее кÑаÑное - ÑазмеÑа пеÑедаваемого блока даннÑÑ Ð´Ð»Ñ Ð²Ð°Ñего ÑÑÑÑойÑÑва. - - c - ÑÑо - ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑÑÑкÑÑÑÑ - конÑÑÐ¾Ð»Ñ pcm канала. ÐÑо не пÑозÑаÑнÑй - обÑекÑ. ФÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° Ñ ÑаниÑÑ ÐµÐ³Ð¾ в локалÑной ÑÑÑÑкÑÑÑе - канала, Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вÑÐ·Ð¾Ð²Ð°Ñ Ðº - pcm (напÑÐ¸Ð¼ÐµÑ Ð²: - chn_intr(c)). - - dir опÑеделÑÐµÑ Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ Ñелей - иÑполÑзÑеÑÑÑ ÐºÐ°Ð½Ð°Ð» - (PCMDIR_PLAY или - PCMDIR_REC). - - ФÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° лиÑнÑÑ, - облаÑÑÑ, иÑполÑзÑемÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ ÑÑого - канала. Ðн бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð² каÑеÑÑве паÑамеÑÑа в - дÑÑÐ³Ð¸Ñ Ð²ÑÐ·Ð¾Ð²Ð°Ñ ÐºÐ°Ð½Ð°Ð»Ñного инÑеÑÑейÑа. - - channel_setformat - - xxxchannel_setformat() наÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ - ÑÑÑÑойÑÑво на конкÑеÑнÑй канал опÑеделÑнного ÑоÑмаÑа звÑка. - - static int - xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) - { - struct xxx_chinfo *ch = data; - ... - return 0; - } - - format иÑполÑзÑеÑÑÑ, как - AFMT_XXX знаÑение - (soundcard.h). - - channel_setspeed - - xxxchannel_setspeed() ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ - обоÑÑдование канала на опÑеделÑннÑÑ ÑаблоннÑÑ ÑкоÑоÑÑÑ Ð¸ возвÑаÑÐ°ÐµÑ - возможнÑÑ ÐºÐ¾ÑÑекÑиÑÑÑÑÑÑ ÑкоÑоÑÑÑ. - - static int - xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed) - { - struct xxx_chinfo *ch = data; - ... - return speed; - } - - channel_setblocksize - - xxxchannel_setblocksize() ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ - ÑÐ°Ð·Ð¼ÐµÑ Ð¿ÐµÑедаваемого блока Ð¼ÐµÐ¶Ð´Ñ - pcm и звÑковÑм дÑайвеÑом, и Ð¼ÐµÐ¶Ð´Ñ - звÑковÑм дÑайвеÑом и ÑÑÑÑойÑÑвом. ÐбÑÑно ÑÑо бÑÐ´ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво - пеÑеданнÑÑ Ð±Ð°Ð¹Ñ Ð¿ÐµÑед пÑеÑÑванием. Ðо вÑÐµÐ¼Ñ ÑÑанÑÑеÑа звÑковой - дÑÐ°Ð¹Ð²ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ должен вÑзÑваÑÑ - pcm ÑÑнкÑÐ¸Ñ chn_intr() каждÑй - Ñаз пÑи пеÑедаÑе блока даннÑÑ Ñакого ÑазмеÑа. - - ÐолÑÑинÑÑво звÑковÑÑ Ð´ÑайвеÑов ÑолÑко беÑÑÑ Ð½Ð° замеÑÐºÑ - ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿ÐµÑедаÑи даннÑÑ . - - static int - xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) - { - struct xxx_chinfo *ch = data; - ... - return blocksize; - } - - ФÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑоглаÑованнÑй ÑÐ°Ð·Ð¼ÐµÑ - блока. Ð ÑлÑÑае, еÑли ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° дейÑÑвиÑелÑно - изменилÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿ÑоизведÑн вÑзов - sndbuf_resize() Ð´Ð»Ñ ÐºÐ¾ÑÑекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ - бÑÑеÑа. - - channel_trigger - - xxxchannel_trigger() вÑзÑваеÑÑÑ - pcm Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ Ð½Ð°Ð´ ÑÑанÑÑеÑнÑми - опеÑаÑиÑми в дÑайвеÑе. - - static int - xxxchannel_trigger(kobj_t obj, void *data, int go) - { - struct xxx_chinfo *ch = data; - ... - return 0; - } - - go опÑеделÑÐµÑ Ð´ÐµÐ¹ÑÑвие Ð´Ð»Ñ - ÑекÑÑего вÑзова. ÐозможнÑе знаÑениÑ: - - PCMTRIG_START: дÑÐ°Ð¹Ð²ÐµÑ - должен наÑаÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð· или в каналÑнÑй - бÑÑеÑ. ÐÑÑÐµÑ Ð¸ его ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ ÑеÑез - вÑзов sndbuf_getbuf() и - sndbuf_getsize(). - - PCMTRIG_EMLDMAWR / - PCMTRIG_EMLDMARD: говоÑÐ¸Ñ - дÑайвеÑÑ, ÑÑо Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ или вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ бÑÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ - бÑл обновлÑн. ÐолÑÑинÑÑво дÑайвеÑов игноÑиÑÑÑÑ - ÑÑи вÑзовÑ. - - PCMTRIG_STOP / - PCMTRIG_ABORT: дÑÐ°Ð¹Ð²ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ - оÑÑановиÑÑ ÑекÑÑÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð°Ð½Ð½ÑÑ . - - ÐÑли дÑÐ°Ð¹Ð²ÐµÑ Ð¸ÑполÑзÑÐµÑ ISA DMA, - sndbuf_isadma() должна вÑзÑваÑÑÑÑ - пеÑед вÑполнением дейÑÑвий над ÑÑÑÑойÑÑвом, она Ñакже - позабоÑиÑÑÑ Ð¾ веÑÐ°Ñ Ñо ÑÑоÑÐ¾Ð½Ñ DMA Ñипа. - - channel_getptr - - xxxchannel_getptr() возвÑаÑÐ°ÐµÑ - ÑекÑÑее ÑмеÑение в пеÑедаваемом бÑÑеÑе. ÐбÑÑно вÑзÑваеÑÑÑ - в chn_intr(), и Ñак - pcm ÑзнаÑÑ, где бÑаÑÑ Ð´Ð°Ð½Ð½Ñе Ð´Ð»Ñ - новой пеÑедаÑи. - - channel_free - - xxxchannel_free() вÑзÑваеÑÑÑ Ð´Ð»Ñ - оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑеÑÑÑÑов канала. ÐапÑимеÑ: должна вÑзÑваÑÑÑÑ, - пÑи вÑгÑÑзке дÑайвеÑа, еÑли ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ ÐºÐ°Ð½Ð°Ð»Ð° - ÑаÑпÑеделÑлиÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñно или, еÑли - sndbuf_alloc() не иÑполÑзовалаÑÑ - Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи под бÑÑеÑ. *** 1367 LINES SKIPPED ***