aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/arch-handbook
diff options
context:
space:
mode:
Diffstat (limited to 'zh_CN.GB2312/books/arch-handbook')
-rw-r--r--zh_CN.GB2312/books/arch-handbook/Makefile4
-rw-r--r--zh_CN.GB2312/books/arch-handbook/book.sgml20
-rw-r--r--zh_CN.GB2312/books/arch-handbook/boot/chapter.sgml4
-rw-r--r--zh_CN.GB2312/books/arch-handbook/chapters.ent6
-rw-r--r--zh_CN.GB2312/books/arch-handbook/driverbasics/chapter.sgml18
-rw-r--r--zh_CN.GB2312/books/arch-handbook/isa/chapter.sgml16
-rw-r--r--zh_CN.GB2312/books/arch-handbook/jail/chapter.sgml20
-rw-r--r--zh_CN.GB2312/books/arch-handbook/kobj/chapter.sgml2
-rw-r--r--zh_CN.GB2312/books/arch-handbook/locking/chapter.sgml18
-rw-r--r--zh_CN.GB2312/books/arch-handbook/mac.ent16
-rw-r--r--zh_CN.GB2312/books/arch-handbook/mac/chapter.sgml1692
-rw-r--r--zh_CN.GB2312/books/arch-handbook/newbus/chapter.sgml112
-rw-r--r--zh_CN.GB2312/books/arch-handbook/pccard/chapter.sgml2
-rw-r--r--zh_CN.GB2312/books/arch-handbook/scsi/chapter.sgml188
-rw-r--r--zh_CN.GB2312/books/arch-handbook/sound/chapter.sgml48
-rw-r--r--zh_CN.GB2312/books/arch-handbook/usb/chapter.sgml14
-rw-r--r--zh_CN.GB2312/books/arch-handbook/vm/chapter.sgml18
17 files changed, 1099 insertions, 1099 deletions
diff --git a/zh_CN.GB2312/books/arch-handbook/Makefile b/zh_CN.GB2312/books/arch-handbook/Makefile
index 278a6d6e62..50d77e3695 100644
--- a/zh_CN.GB2312/books/arch-handbook/Makefile
+++ b/zh_CN.GB2312/books/arch-handbook/Makefile
@@ -1,4 +1,4 @@
-#
+#
# Original Revision: 1.25
# $FreeBSD$
#
@@ -16,7 +16,7 @@ HAS_INDEX= true
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
#
diff --git a/zh_CN.GB2312/books/arch-handbook/book.sgml b/zh_CN.GB2312/books/arch-handbook/book.sgml
index 10730132ff..706c3767f4 100644
--- a/zh_CN.GB2312/books/arch-handbook/book.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/book.sgml
@@ -20,11 +20,11 @@
<book lang='zh_cn'>
<bookinfo>
<title>&os; 系统结构手册</title>
-
+
<corpauthor>The FreeBSD Documentation Project</corpauthor>
-
+
<pubdate>2000 年 8 月</pubdate>
-
+
<copyright>
<year>2000</year>
<year>2001</year>
@@ -37,9 +37,9 @@
</copyright>
<corpauthor>&cnproj.freebsd.org;</corpauthor>
-
+
<pubdate>2005 年 12 月</pubdate>
-
+
<copyright>
<year>2004</year>
<year>2005</year>
@@ -51,12 +51,12 @@
&legalnotice;
<releaseinfo>$FreeBSD$</releaseinfo>
-
+
<abstract>
- <!--
+ <!--
The following two entities "contributing.to.freebsd.doc" and
- "getting.freebsd.doc" are defined in zh_CN.GB2312/share/sgml/l10n.ent
+ "getting.freebsd.doc" are defined in zh_CN.GB2312/share/sgml/l10n.ent
-->
<para>欢迎您阅读《&os;系统结构手册》。&cnproj.contributing.to.freebsd.doc;</para>
@@ -78,7 +78,7 @@
&chap.smp;
</part>
-
+
<part id="devicedrivers">
<title>设备驱动程序</title>
@@ -93,7 +93,7 @@
&chap.pccard;
</part>
-
+
<!-- XXX - finish me
<part id="architectures">
<title>Architectures</title>
diff --git a/zh_CN.GB2312/books/arch-handbook/boot/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/boot/chapter.sgml
index 4e125297e3..6edc8ad1ea 100644
--- a/zh_CN.GB2312/books/arch-handbook/boot/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/boot/chapter.sgml
@@ -37,7 +37,7 @@ $FreeBSD$
<indexterm><primary>IA-32</primary></indexterm>
<indexterm><primary>booting(引导)</primary></indexterm>
<indexterm><primary>system initialization(系统初始化)</primary></indexterm>
- <para>这一章是对引导过程和系统初始化过程的总览。这些过程始于BIOS(固件)POST,
+ <para>这一章是对引导过程和系统初始化过程的总览。这些过程始于BIOS(固件)POST,
直到第一个用户进程建立。由于系统启动的最初步骤是与硬件结构相关的、是紧配合的,
这里用IA-32(Intel Architecture 32bit)结构作为例子。</para>
</sect1>
@@ -632,7 +632,7 @@ begin:</programlisting>
即全局描述符表中的索引(更精确的说,索引并非选择符的全部,
而是选择符中的INDEX部分)。<tip><title>译者注</title><para>对于80386,
选择符有16位,INDEX部分是其中的高13位。</para></tip>
- FreeBSD的全局描述符表为每个CPU保存着15个选择符:</para>
+ FreeBSD的全局描述符表为每个CPU保存着15个选择符:</para>
<programlisting><filename>sys/i386/i386/machdep.c:</filename>
union descriptor gdt[NGDT * MAXCPU]; /* 全局描述符表 */
diff --git a/zh_CN.GB2312/books/arch-handbook/chapters.ent b/zh_CN.GB2312/books/arch-handbook/chapters.ent
index 2c9b1b5b94..df7067d033 100644
--- a/zh_CN.GB2312/books/arch-handbook/chapters.ent
+++ b/zh_CN.GB2312/books/arch-handbook/chapters.ent
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="GB2312"?>
-<!--
+<!--
Creates entities for each chapter in the FreeBSD Architecture
Handbook. Each entity is named chap.foo, where foo is the value
of the id attribute on that chapter, and corresponds to the name of
the directory in which that chapter's .sgml file is stored.
-
+
Chapters should be listed in the order in which they are referenced.
-
+
Original Revision: 1.21
$FreeBSD$
-->
diff --git a/zh_CN.GB2312/books/arch-handbook/driverbasics/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/driverbasics/chapter.sgml
index 5ba1ca5d19..cb2eec2e9c 100644
--- a/zh_CN.GB2312/books/arch-handbook/driverbasics/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/driverbasics/chapter.sgml
@@ -59,7 +59,7 @@
</sect1>
<sect1 id="driverbasics-kld">
- <title>动态内核链接工具&mdash;KLD</title>
+ <title>动态内核链接工具&mdash;KLD</title>
<indexterm><primary>kernel linking(内核链接)</primary><secondary>dynamic(动态)</secondary></indexterm>
<indexterm><primary>kernel loadable modules (KLD, 内核可装载模块)</primary></indexterm>
@@ -91,12 +91,12 @@
#include &lt;sys/types.h&gt;
#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
+#include &lt;sys/systm.h&gt; /* uprintf */
#include &lt;sys/errno.h&gt;
#include &lt;sys/param.h&gt; /* kernel.h中用到的定义 */
#include &lt;sys/kernel.h&gt; /* 模块初始化中使用的类型 */
-/*
+/*
* 加载处理函数,负责处理KLD的加载和卸载。
*/
@@ -104,7 +104,7 @@ 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");
@@ -125,7 +125,7 @@ static moduledata_t skel_mod = {
"skel",
skel_loader,
NULL
-};
+};
DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);</programlisting>
@@ -409,8 +409,8 @@ MALLOC_DECLARE(M_ECHOBUF);
MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
/*
- * 这个函数被kld[un]load(2)系统调用来调用,
- * 以决定加载和卸载模块时需要采取的动作.
+ * 这个函数被kld[un]load(2)系统调用来调用,
+ * 以决定加载和卸载模块时需要采取的动作.
*/
static int
@@ -483,7 +483,7 @@ echo_read(struct cdev *dev, struct uio *uio, int ioflag)
}
/*
- * echo_write接受一个字符串并将它保存到缓冲区, 用于以后的访问.
+ * echo_write接受一个字符串并将它保存到缓冲区, 用于以后的访问.
*/
static int
@@ -560,7 +560,7 @@ Test Data</screen>
<indexterm><primary>network devices(网络设备)</primary></indexterm>
<para>访问网络设备的驱动程序不需要使用设备节点。选择哪个驱动程序是
基于内核内部的其他决定而不是调用open(),对网络设备的使用通常由
- 系统调用socket(2)引入。</para>
+ 系统调用socket(2)引入。</para>
<para>更多细节, 请参见 ifnet(9) 联机手册、 回环设备的源代码,
以及 Bill Paul 撰写的网络驱动程序。</para>
diff --git a/zh_CN.GB2312/books/arch-handbook/isa/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/isa/chapter.sgml
index ea48ca2e77..b26940a356 100644
--- a/zh_CN.GB2312/books/arch-handbook/isa/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/isa/chapter.sgml
@@ -280,7 +280,7 @@
<para>对于老的ISA设备,很多情况下驱动程序仍然能够侦测配置参数。
但是系统中配置的每个设备必须具有一个配置行。如果系统中装有同一
- 类型的两个设备,但对应的驱动程序却只有一个配置行,例如:
+ 类型的两个设备,但对应的驱动程序却只有一个配置行,例如:
<programlisting>device xxx0 at isa?</programlisting>
那么只有一个设备会被配置。</para>
@@ -317,7 +317,7 @@
要求一个设备的情况是可能的,这种情况下,具有最高优先权的驱动程序
将获胜。探测例程必须调用<function>ISA_PNP_PROBE()</function>将
真实的PnP ID和驱动程序支持的ID列表作比较,如果ID不在表中则返回
- 失败。这意味着每个驱动程序,包括不支持任何PnP设备的驱动程序,
+ 失败。这意味着每个驱动程序,包括不支持任何PnP设备的驱动程序,
都必须对未知的PnP设备无条件调用
<function>ISA_PNP_PROBE()</function>,对于未知设备, 至少要用一个
空的PnP ID表调用并返回失败。</para>
@@ -1611,7 +1611,7 @@
所有可能的端口,如下:
</para>
- <programlisting>
+ <programlisting>
/* 此设备所有可能的基I/O端口地址表 */
static struct xxx_allports {
u_short port; /* 端口地址 */
@@ -1673,9 +1673,9 @@
内核在配置文件中没有这个信息。
</para>
- <programlisting>
+ <programlisting>
if(pnperror /* 只对非PnP设备 */
- &#38;&#38; bus_set_resource(dev, SYS_RES_IOPORT, 0, sc-&gt;port0,
+ &#38;&#38; bus_set_resource(dev, SYS_RES_IOPORT, 0, sc-&gt;port0,
XXX_PORT_COUNT)&lt;0)
return ENXIO;</programlisting>
@@ -1687,7 +1687,7 @@
<programlisting>
sc-&gt;port0_rid = 0;
- sc-&gt;port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,
+ sc-&gt;port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,
&#38;sc-&gt;port0_rid,
/*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
@@ -1715,7 +1715,7 @@
但不建议这样。
</para>
- <programlisting>
+ <programlisting>
/* 以严重依赖于具体设备的方式实现 */
if(error = xxx_probe_ports(sc))
goto bad; /* 返回前释放资源 */
@@ -1746,7 +1746,7 @@
哪个呢?可能用户厌烦在内核配置文件中明确设置地址,但他们知道
自己在干什么,则应当优先使用这个。一个实现的例子可能是这样的:
</para>
- <programlisting>
+ <programlisting>
/* 首先试图找出配置地址 */
sc-&gt;mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);
if(sc-&gt;mem0_p == 0) { /* 没有,用户没指定 */
diff --git a/zh_CN.GB2312/books/arch-handbook/jail/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/jail/chapter.sgml
index 12e7cc9cdf..7fcf8deec1 100644
--- a/zh_CN.GB2312/books/arch-handbook/jail/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/jail/chapter.sgml
@@ -50,7 +50,7 @@
这最多让人们皱皱眉头,而不会使人们惊慌失措。
本文主要关注<application>jail</application>的内部原理(源代码)。
如果你正在寻找设置<application>Jail</application>的指南性文档,
- 我建议你阅读我的另一篇文章,发表在Sys Admin Magazine, May 2001,
+ 我建议你阅读我的另一篇文章,发表在Sys Admin Magazine, May 2001,
《Securing FreeBSD using <application>Jail</application>》。</para>
<sect1 id="jail-arch">
@@ -79,7 +79,7 @@
<para><literal>jail</literal>结构的定义是:</para>
-<programlisting><filename>/usr/include/sys/jail.h</filename>:
+<programlisting><filename>/usr/include/sys/jail.h</filename>:
struct jail {
u_int32_t version;
@@ -99,7 +99,7 @@ if(realpath(argv[0], path) == NULL)
if (chdir(path) != 0)
err(1, "chdir: %s", path);
memset(&amp;j, 0, sizeof(j));
-j.version = 0;
+j.version = 0;
j.path = path;
j.hostname = argv[1];</programlisting>
@@ -112,8 +112,8 @@ j.hostname = argv[1];</programlisting>
&man.jail.8;将IP地址翻译成网络字节顺序,并存入<literal>j</literal>(<literal>jail</literal>类型的结构体)。</para>
<programlisting><filename>/usr/src/usr.sbin/jail/jail.c</filename>:
-struct in_addr in;
-...
+struct in_addr in;
+...
if (inet_aton(argv[2], &amp;in) == 0)
errx(1, "Could not make sense of ip-number: %s", argv[2]);
j.ip_number = ntohl(in.s_addr);</programlisting>
@@ -132,7 +132,7 @@ j.ip_number = ntohl(in.s_addr);</programlisting>
并使用&man.execv.3;执行用户指定的命令。</para>
<programlisting><filename>/usr/src/usr.sbin/jail/jail.c</filename>
-i = jail(&amp;j);
+i = jail(&amp;j);
...
if (execv(argv[3], argv + 3) != 0)
err(1, "execv: %s", argv[3]);</programlisting>
@@ -336,7 +336,7 @@ jail(struct thread *td, struct jail_args *uap)
goto e_dropprref;
...
}
-
+
int
jail_attach(struct thread *td, struct jail_attach_args *uap)
{
@@ -375,7 +375,7 @@ td2-&gt;td_ucred = crhold(p2-&gt;p_ucred);</programlisting>
相关的函数将出错返回。例如:</para>
<programlisting>
-if (jailed(td-&gt;td_ucred))
+if (jailed(td-&gt;td_ucred))
return EPERM;</programlisting>
<sect2>
@@ -457,7 +457,7 @@ if (!jail_sysvipc_allowed &amp;&amp; jailed(td-&gt;td_ucred))
<listitem><para><literal>shmat(shmid, addr, flag)</literal>:
<literal>shmat</literal>将<literal>shmid</literal>标识的共享内存区域指派到进程的地址空间里。</para></listitem>
- <listitem><para><literal>shmdt(addr)</literal>:
+ <listitem><para><literal>shmdt(addr)</literal>:
<literal>shmdt</literal>取消共享内存区域的地址指派。</para></listitem>
</itemizedlist>
@@ -515,7 +515,7 @@ socreate(int dom, struct socket **aso, int type, int proto,
在函数<literal>in_pcbbind_setup()</literal>中<literal>sin</literal>是一个指向<literal>sockaddr_in</literal>结构体的指针,
这个结构体包含了套接字可以绑定的端口、地址、长度、协议族。
这就禁止了在<application>jail</application>中的进程指定不属于这个进程所存在于的<application>jail</application>的IP地址。</para>
- <programlisting><filename>/usr/src/sys/kern/netinet/in_pcb.c</filename>:
+ <programlisting><filename>/usr/src/sys/kern/netinet/in_pcb.c</filename>:
int
in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
u_short *lportp, struct ucred *cred)
diff --git a/zh_CN.GB2312/books/arch-handbook/kobj/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/kobj/chapter.sgml
index 3fcd40efe8..df14d6b58b 100644
--- a/zh_CN.GB2312/books/arch-handbook/kobj/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/kobj/chapter.sgml
@@ -165,7 +165,7 @@ KOBJMETHOD(NAME, FUNC)</programlisting>
}
};</programlisting>
- <para>关键词<literal>METHOD</literal>用来描述一个方法。语法是:
+ <para>关键词<literal>METHOD</literal>用来描述一个方法。语法是:
<literal>METHOD [返回值类型] [方法名] { [对象 [,
参数若干]] };</literal></para>
diff --git a/zh_CN.GB2312/books/arch-handbook/locking/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/locking/chapter.sgml
index eee975f5c8..06f05d2d9c 100644
--- a/zh_CN.GB2312/books/arch-handbook/locking/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/locking/chapter.sgml
@@ -46,7 +46,7 @@
<para>Mutex可以被递归的索要,但是mutex一般只被一个实体拥有较短的一段时间,
因此一个实体不能在持有mutex时睡眠。如果你需要在持有mutex时睡眠,
可使用一个 &man.lockmgr.9; 的锁。</para>
-
+
<para>每个mutex有几个令人感兴趣的属性:</para>
<variablelist>
@@ -118,16 +118,16 @@
<title>Mutex列表</title>
<indexterm><primary>locks(锁)</primary>
- <secondary>sched_lock(调度器锁)</secondary></indexterm>
+ <secondary>sched_lock(调度器锁)</secondary></indexterm>
<indexterm><primary>locks(锁)</primary>
- <secondary>vm86pcb_lock(虚拟8086模式进程控制块锁)</secondary></indexterm>
+ <secondary>vm86pcb_lock(虚拟8086模式进程控制块锁)</secondary></indexterm>
<indexterm><primary>locks(锁)</primary>
- <secondary>Giant(巨锁)</secondary></indexterm>
+ <secondary>Giant(巨锁)</secondary></indexterm>
<indexterm><primary>locks(锁)</primary>
- <secondary>callout_lock(延时调用锁)</secondary></indexterm>
+ <secondary>callout_lock(延时调用锁)</secondary></indexterm>
<tgroup cols="5">
<thead>
@@ -139,7 +139,7 @@
<entry>依赖函数</entry>
</row>
</thead>
-
+
<!-- The scheduler lock -->
<tbody>
<row>
@@ -279,14 +279,14 @@
<para>这些锁提供基本的读/写类型的功能,可以被一个正在睡眠的进程持有。
现在它们被统一到&man.lockmgr.9;之中。</para>
<indexterm><primary>locks(锁)</primary>
- <secondary>shared exclusive(共享互斥)</secondary></indexterm>
+ <secondary>shared exclusive(共享互斥)</secondary></indexterm>
<table>
<title>共享互斥锁列表</title>
<indexterm><primary>locks(锁)</primary>
- <secondary>allproc_lock(全进程锁)</secondary></indexterm>
+ <secondary>allproc_lock(全进程锁)</secondary></indexterm>
<indexterm><primary>locks(锁)</primary>
- <secondary>proctree_lock(进程树锁)</secondary></indexterm>
+ <secondary>proctree_lock(进程树锁)</secondary></indexterm>
<tgroup cols="2">
<thead>
diff --git a/zh_CN.GB2312/books/arch-handbook/mac.ent b/zh_CN.GB2312/books/arch-handbook/mac.ent
index 8070a910bc..b3234c84a4 100644
--- a/zh_CN.GB2312/books/arch-handbook/mac.ent
+++ b/zh_CN.GB2312/books/arch-handbook/mac.ent
@@ -30,17 +30,17 @@ $FreeBSD$ -->
<entry><parameter>label</parameter></entry>
<entry>将用外部形式表示的标记</entry>
</row>
-
+
<row>
<entry><parameter>element_name</parameter></entry>
<entry>需要外部表示标记的策略的名字</entry>
</row>
-
+
<row>
<entry><parameter>sb</parameter></entry>
<entry>用来存放标记的文本表示形式的字符buffer</entry>
</row>
-
+
<row>
<entry><parameter>claimed</parameter></entry>
<entry>如果可以填充element_data 域,则其数值递增</entry>
@@ -49,10 +49,10 @@ $FreeBSD$ -->
'>
<!ENTITY mac.externalize.para "
- <para>根据传入的标记结构,产生一个以外部形式表示的标记。
+ <para>根据传入的标记结构,产生一个以外部形式表示的标记。
一个外部形式标记,是标记内容的文本表示,它由用户级的应用程序使用,是用户可读的。
目前的MAC实现方案将依次调用策略的相应入口函数,因此,
- 具体策略的实现代码,需要在填写sb之前,先检查element_name中指定的名字。
+ 具体策略的实现代码,需要在填写sb之前,先检查element_name中指定的名字。
如果element_name中的内容与你的策略名字不相符,则直接返回0。
仅当转换标记数据的过程中出现错误时,才返回非0值。
一旦策略决定填写element_data,递增*claim的数值。</para>
@@ -71,17 +71,17 @@ $FreeBSD$ -->
<entry><parameter>label</parameter></entry>
<entry>将被填充的标记</entry>
</row>
-
+
<row>
<entry><parameter>element_name</parameter></entry>
<entry>需要内部表示标记的策略的名字</entry>
</row>
-
+
<row>
<entry><parameter>element_data</parameter></entry>
<entry>需要被转换的文本数据</entry>
</row>
-
+
<row>
<entry><parameter>claimed</parameter></entry>
<entry>如果数据被正确转换,则其数值递增</entry>
diff --git a/zh_CN.GB2312/books/arch-handbook/mac/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/mac/chapter.sgml
index 0f8c283fc4..5e36bada75 100644
--- a/zh_CN.GB2312/books/arch-handbook/mac/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/mac/chapter.sgml
@@ -2,13 +2,13 @@
<!--
Copyright (c) 2002-2005 Networks Associates Technology, Inc.
All rights reserved.
-
+
This software was developed for the FreeBSD Project by
Chris Costello at Safeport Network Services and Network Associates Labs,
the Security Research Division of Network Associates, Inc. under
DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
DARPA CHATS research program.
-
+
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
@@ -17,7 +17,7 @@
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -29,7 +29,7 @@
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-
+
Original Revision: 1.46
$FreeBSD$
-->
@@ -40,17 +40,17 @@
<author>
<firstname>Chris</firstname>
<surname>Costello</surname>
-
+
<affiliation>
<orgname>TrustedBSD 项目</orgname>
<address><email>chris@FreeBSD.org</email></address>
</affiliation>
</author>
-
+
<author>
<firstname>Robert</firstname>
<surname>Watson</surname>
-
+
<affiliation>
<orgname>TrustedBSD 项目</orgname>
<address><email>rwatson@FreeBSD.org</email></address>
@@ -66,7 +66,7 @@
</authorgroup>
</chapterinfo>
-
+
<title>TrustedBSD MAC 框架</title>
<sect1 id="mac-copyright">
@@ -133,18 +133,18 @@
</orderedlist>
<important>
- <para>本文档由 NETWORKS ASSOCIATES TECHNOLOGY, INC “按现状条件”提供,并在此明示不提供任何明示或暗示的保障,
+ <para>本文档由 NETWORKS ASSOCIATES TECHNOLOGY, INC “按现状条件”提供,并在此明示不提供任何明示或暗示的保障,
包括但不限于对商业适销性、对特定目的的适用性的暗示保障。任何情况下,
- NETWORKS ASSOCIATES TECHNOLOGY, INC 均不对任何直接、 间接、 偶然、 特殊、 惩罚性的,
+ NETWORKS ASSOCIATES TECHNOLOGY, INC 均不对任何直接、 间接、 偶然、 特殊、 惩罚性的,
或必然的损失 (包括但不限于替代商品或服务的采购、 使用、 数据或利益的损失或营业中断) 负责,
- 无论是如何导致的并以任何有责任逻辑的, 无论是否是在本文档使用以外以任何方式产生的契约、严格责任或是民事侵权行为(包括疏忽或其它)中的,
+ 无论是如何导致的并以任何有责任逻辑的, 无论是否是在本文档使用以外以任何方式产生的契约、严格责任或是民事侵权行为(包括疏忽或其它)中的,
即使已被告知发生该损失的可能性。</para>
</important>
</sect1>
-
+
<sect1 id="mac-synopsis">
<title>术语解析</title>
-
+
<para>FreeBSD 以一个内核安全扩展性框架(TrustedBSD MAC 框架)的方式,为若干强制访问控制策略(也称“集权式访问控制策略”)
提供试验性支持。MAC 框架是一个插入式的访问控制框架,允许新的安全策略更方便地融入内核:安全策略可以静态链入内核,也可以
在引导时加载,甚至在运行时动态加载。该框架所提供的标准化接口,使得运行在其上的安全策略模块能对系统对象的安全属性进行诸如标记等一系列操作。
@@ -152,11 +152,11 @@
<para>本章将介绍 MAC 策略框架,为读者提供一个示例性的 MAC 策略模块文档。</para>
</sect1>
-
-
+
+
<sect1 id="mac-introduction">
<title>概述</title>
-
+
<para>TrustedBSD MAC 框架提供的机制,允许在其上运行的内核模块在内核编译或者运行时,对内核的访问控制模型进行扩展。
新的系统安全策略作为一个内核模块实现,并被链接到内核中;如果系统中同时存在多个安全策略模块,则它们的决策结果将以某种确定的方式组合。
为了给简化新安全策略的开发,MAC 向上提供了大量用于访问控制的基础设施,特别是,对临时的或者持久的、策略无关的对象安全标记的支持。
@@ -182,10 +182,10 @@
还能用于实现其他利用已有安全属性(如,用户和组ID、文件扩展属性等)决策的系统安全强化策略。
此外,因为具体策略模块在访问授权方面所拥有的高度灵活性和自主性,所以MAC 框架同样可以用来实现完全自主式的安全策略.</para>
</sect1>
-
+
<sect1 id="mac-framework-kernel-arch">
<title>MAC 框架的内核体系结构</title>
-
+
<para>TrustedBSD MAC 框架为大多数的访问控制模块提供基本设施,允许它们以内核模块的形式灵活地扩展系统中实施的安全策略。
如果系统中同时加载了多个策略,MAC 框架将负责将各个策略的授权结果以一种(某种程度上)有意义的方式组合,形成最后的决策。</para>
@@ -399,9 +399,9 @@
<listitem>
<para><function>mac_get_link()</function> 与
- <function>mac_get_file()</function> 功能相同,
+ <function>mac_get_file()</function> 功能相同,
只是当路径参数的最后一项为符号链接时,
- 前者将返回该符号链接的安全标记,
+ 前者将返回该符号链接的安全标记,
而后者将返回其所指文件的安全标记。</para>
</listitem>
@@ -409,7 +409,7 @@
<para><function>mac_set_link()</function> 与
<function>mac_set_file()</function> 功能相同,
只是当路径参数的最后一项为符号链接时,
- 前者将设置该符号链接的安全标记,
+ 前者将设置该符号链接的安全标记,
而后者将设置其所指文件的安全标记。</para>
</listitem>
@@ -452,24 +452,24 @@
<sect2 id="mac-policy-declaration">
<title>策略注销</title>
-
+
<para>策略模块可以使用 <function>MAC_POLICY_SET()</function> 宏来声明。
该宏完成以下工作:为该策略命名(向系统声明该策略提供的名字);提交策略定义的 MAC 入口函数向量的地址;
按照策略的要求设置该策略的加载标志位,保证 MAC 框架将以策略所期望的方式对其进行操作;
另外,还可能请求框架为策略分配标记状态 slot 值。</para>
<programlisting>static struct mac_policy_ops mac_<replaceable>policy</replaceable>_ops =
-{
+{
.mpo_destroy = mac_<replaceable>policy</replaceable>_destroy,
.mpo_init = mac_<replaceable>policy</replaceable>_init,
- .mpo_init_bpfdesc_label = mac_<replaceable>policy</replaceable>_init_bpfdesc_label,
+ .mpo_init_bpfdesc_label = mac_<replaceable>policy</replaceable>_init_bpfdesc_label,
.mpo_init_cred_label = mac_<replaceable>policy</replaceable>_init_label,
/* ... */
.mpo_check_vnode_setutimes = mac_<replaceable>policy</replaceable>_check_vnode_setutimes,
.mpo_check_vnode_stat = mac_<replaceable>policy</replaceable>_check_vnode_stat,
.mpo_check_vnode_write = mac_<replaceable>policy</replaceable>_check_vnode_write,
};</programlisting>
-
+
<para>如上所示,MAC 策略入口函数向量,<varname>mac_<replaceable>policy</replaceable>_ops</varname>,
将策略模块中定义的功能函数挂接到特定的入口函数地址上。
在稍后的“入口函数参考”小节中,将提供可用入口函数功能描述和原型的完整列表。
@@ -479,17 +479,17 @@
卸载一个策略模块时,将调用 <symbol>.mpo_destroy</symbol> 用来释放策略分配的内存空间或注销其申请的锁。
目前,为了防止其他入口函数被同时调用,调用上述两个入口函数的进程必须持有 MAC 策略链表的互斥锁:这种限制将被放开,
但与此同时,将要求策略必须谨慎使用内核原语,以避免由于上锁次序或睡眠造成死锁。</para>
-
+
<para>之所以向策略声明提供模块名字域,是为了能够唯一标识该模块,以便解析模块依赖关系。选择使用恰当的字符串作为名字。
在策略加载和卸载时,策略的完整字符串名字将经由内核日志显示给用户。另外,当向用户进程报告状态信息时也会包含该字符串。</para>
</sect2>
<sect2 id="mac-policy-flags">
<title>策略标志</title>
-
+
<para>在声明时提供标志参数域的机制,允许策略模块在作为模块被加载时,就自身特性向 MAC 框架提供说明。
目前,已经定义的标志有三个:</para>
-
+
<variablelist>
<varlistentry>
<term>MPC_LOADTIME_FLAG_UNLOADOK</term>
@@ -501,10 +501,10 @@
</para>
</listitem>
</varlistentry>
-
+
<varlistentry>
<term>MPC_LOADTIME_FLAG_NOTLATE</term>
-
+
<listitem>
<para>表示该策略模块必须在系统引导过程时进行加载和初始化。
如果该标志被设置,那么在系统引导之后注册该模块的请求将被 MAC 框架所拒绝。
@@ -523,7 +523,7 @@
</listitem>
</varlistentry>
</variablelist>
-
+
<note><para>那些使用了
<literal>MPC_LOADTIME_FLAG_LABELMBUFS</literal> 标志但没有设置
<literal>MPC_LOADTIME_FLAG_NOTLATE</literal> 标志的
@@ -536,7 +536,7 @@
<sect2 id="mac-policy-entry-points">
<title>策略入口函数</title>
-
+
<para>MAC 框架为注册的策略提供四种类型的入口函数:
策略注册和管理入口函数;
用于处理内核对象声明周期事件,如初始化、
@@ -547,7 +547,7 @@
还有一个 <function>mac_syscall()</function> 入口函数,
被策略模块用于在不注册新的系统调用的前提下,
扩展内核接口。</para>
-
+
<para>策略模块的编写人员除了必须清楚在进入特定入口函数之后,
哪些对象锁是可用的之外,
还应该熟知内核所采用的加锁策略。
@@ -564,7 +564,7 @@
包括对象本身和其安全标记)
也是安全的。
相关的上锁信息,可以参考 MAC 框架入口函数的相关文档。</para>
-
+
<para>策略入口函数把两个分别指向对象本身和其安全标记的指针传递给策略模块。
这样一来,即使策略并不熟悉对象内部结构,也能基于标记作出正确决策。
只有进程信任状这个对象例外:MAC 框架总是假设所有的策略模块是理解其内部结构的。</para>
@@ -573,27 +573,27 @@
<sect1 id="mac-entry-point-reference">
<title>MAC策略入口函数参考</title>
-
+
<sect2 id="mac-mpo-general">
<title>通用的模块入口函数</title>
-
+
<sect3 id="mac-mpo-init">
<title><function>&mac.mpo;_init</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init</function></funcdef>
-
+
<paramdef>struct mac_policy_conf
*<parameter>conf</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>conf</parameter></entry>
@@ -602,29 +602,29 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>策略加载事件。当前进程正持有策略链表上的互斥锁,因此是非睡眠的,对其他内核子系统的调用也须慎重。
如果需要在策略初始化阶段进行可能造成睡眠阻塞的存储分配操作,可以将它们放在一个单独的模块 SYSINIT()
过程中集中进行。</para>
</sect3>
-
+
<sect3 id="mpo-destroy">
<title><function>&mac.mpo;_destroy</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy</function></funcdef>
-
+
<paramdef>struct mac_policy_conf
*<parameter>conf</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>conf</parameter></entry>
@@ -633,7 +633,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>策略加载事件。必须持有策略链表互斥锁,因此需要慎重行事。</para>
</sect3>
@@ -682,7 +682,7 @@
<note><para>不同的模块需要并发地手动进行<function>copyin()</function>拷贝系统调用数据。</para></note>
</sect3>
-
+
<sect3 id="mac-mpo-thread-userret">
<title><function>&mac.mpo;_thread_userret</function></title>
@@ -725,21 +725,21 @@
<sect3 id="mac-mpo-init-bpfdesc">
<title><function>&mac.mpo;_init_bpfdesc_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_bpfdesc_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -748,27 +748,27 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的 bpfdesc(BPF 描述子)初始化标记。可以睡眠。</para>
</sect3>
<sect3 id="mac-mpo-init-cred-label">
<title><function>&mac.mpo;_init_cred_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_cred_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -777,27 +777,27 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的用户信任状初始化标记。可以睡眠。</para>
</sect3>
<sect3 id="mac-mpo-init-devfsdirent">
<title><function>&mac.mpo;_init_devfsdirent_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_devfsdirent_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -806,27 +806,27 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的 devfs 表项初始化标记。可以睡眠。</para>
</sect3>
<sect3 id="mac-mpo-init-ifnet">
<title><function>&mac.mpo;_init_ifnet_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_ifnet_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -835,28 +835,28 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的网络接口初始化标记。可以睡眠。</para>
</sect3>
-
+
<sect3 id="mac-mpo-init-ipq">
<title><function>&mac.mpo;_init_ipq_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_ipq_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
<paramdef>int <parameter>flag</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -870,7 +870,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的 IP 分片重组队列初始化标记。其中的<parameter>flag</parameter>域可能取<symbol>M_WAITOK</symbol>
或<symbol>M_NOWAIT</symbol>之一,用来避免在该初始化调用中因为 &man.malloc.9; 而进入睡眠。IP 分片重组队列的分配操作通常是在
对性能有严格要求的环境下进行的,因此实现代码必须小心地避免睡眠和长时间的操作。IP 分片重组队列分配操作失败时上述入口函数将失败返回。</para>
@@ -878,28 +878,28 @@
<sect3 id="mac-mpo-init-mbuf">
<title><function>&mac.mpo;_init_mbuf_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_mbuf_label</function></funcdef>
-
+
<paramdef>int <parameter>flag</parameter></paramdef>
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>flag</parameter></entry>
<entry>睡眠/不睡眠 &man.malloc.9;; 参见下文</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry>将被初始化的策略标记</entry>
@@ -907,39 +907,39 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的 mbuf 数据包头部(<parameter>mbuf</parameter>)初始化标记。
其中的<parameter>flag</parameter>的值可能取<symbol>M_WAITOK</symbol>和<symbol>M_NOWAIT</symbol>之一,
用来避免在该初始化调用中因为 &man.malloc.9; 而进入睡眠。Mbuf 头部的分配操作常常在对性能有严格要求的环境下被频繁执行,
- 因此实现代码必须小心地避免睡眠和长时间的操作。上述入口函数在 Mbuf 头部分配操作失败时将失败返回。</para>
+ 因此实现代码必须小心地避免睡眠和长时间的操作。上述入口函数在 Mbuf 头部分配操作失败时将失败返回。</para>
</sect3>
-
+
<sect3 id="mac-mpo-init-mount">
<title><function>&mac.mpo;_init_mount_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_mount_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>mntlabel</parameter></paramdef>
<paramdef>struct label
*<parameter>fslabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<!-- XXX: Wording on label descriptions. -->
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>mntlabel</parameter></entry>
<entry>将被初始化的mount 结构策略标记</entry>
</row>
-
+
<row>
<entry><parameter>fslabel</parameter></entry>
<entry>将被初始化的文件系统策略标记</entry>
@@ -947,7 +947,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个新近实例化的 mount 点初始化标记。可以睡眠。</para>
</sect3>
@@ -1008,31 +1008,31 @@
<para>为一个刚刚实例化的管道初始化安全标记。可以睡眠。</para>
</sect3>
-
+
<sect3 id="mac-mpo-init-socket">
<title><function>&mac.mpo;_init_socket_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_socket_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
<paramdef>int <parameter>flag</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
<entry>将被初始化的新标记</entry>
</row>
-
+
<row>
<entry><parameter>flag</parameter></entry>
<entry>&man.malloc.9; flags</entry>
@@ -1040,7 +1040,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个刚刚实例化的套接字初始化安全标记。其中的 <parameter>flag</parameter> 域的值必须被指定为
<symbol>M_WAITOK</symbol>和<symbol>M_NOWAIT</symbol>之一,以避免在该初始化程中使用可能睡眠的&man.malloc.9; 。</para>
</sect3>
@@ -1081,24 +1081,24 @@
<symbol>M_WAITOK</symbol> 和 <symbol>M_NOWAIT</symbol> 之一,以避免在该初始化程中使用可能睡眠的
&man.malloc.9;。</para>
</sect3>
-
+
<sect3 id="mac-mpo-init-proc-label">
<title><function>&mac.mpo;_init_proc_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_proc_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1107,28 +1107,28 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个刚刚实例化的进程初始化安全标记。可以睡眠。</para>
</sect3>
<sect3 id="mac-mpo-init-vnode">
<title><function>&mac.mpo;_init_vnode_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_init_vnode_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1137,7 +1137,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为一个刚刚实例化的 vnode 初始化安全标记。可以睡眠。</para>
</sect3>
<sect3 id="mac-mpo-destroy-bpfdesc">
@@ -1169,24 +1169,24 @@
<para>销毁一个 BPF 描述子上的标记。在该入口函数中,策略应当释放所有在内部分配与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
-
+
<sect3 id="mac-mpo-destroy-cred">
<title><function>&mac.mpo;_destroy_cred_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_cred_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1195,7 +1195,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁一个信任状上的标记。在该入口函数中,策略应当释放所有在内部分配的与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
@@ -1203,21 +1203,21 @@
<sect3 id="mac-mpo-destroy-devfsdirent">
<title><function>&mac.mpo;_destroy_devfsdirent_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_devfsdirent_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1226,28 +1226,28 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁一个 devfs 表项上的标记。在该入口函数中,策略应当释放所有在内部分配的与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
-
+
<sect3 id="mac-mpo-destroy-ifnet-label">
<title><function>&mac.mpo;_destroy_ifnet_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_ifnet_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1256,24 +1256,24 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁与一个已删除接口相关联的标记。在该入口函数中,策略应当释放所有在内部分配的与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
-
+
<sect3 id="mac-mpo-destroy-ipq-label">
<title><function>&mac.mpo;_destroy_ipq_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_ipq_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
@@ -1286,28 +1286,28 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁与一个 IP 分片队列相关联的标记。在该入口函数中,策略应当释放所有在内部分配的与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
-
+
<sect3 id="mac-mpo-destroy-mbuf-label">
<title><function>&mac.mpo;_destroy_mbuf_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_mbuf_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1316,28 +1316,28 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁与一个 Mbuf 相关联的标记。在该入口函数中,策略应当释放所有在内部分配的与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
-
+
<sect3 id="mac-mpo-destroy-mount-label">
<title><function>&mac.mpo;_destroy_mount_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_mount_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>label</parameter></entry>
@@ -1346,36 +1346,36 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁与一个 mount 点相关联的标记。在该入口函数中,策略应当释放所有在内部分配的与 <parameter>mntlabel</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
<sect3 id="mac-mpo-destroy-mount">
<title><function>&mac.mpo;_destroy_mount_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_mount_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>mntlabel</parameter></paramdef>
<paramdef>struct label
*<parameter>fslabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>mntlabel</parameter></entry>
<entry>将被销毁的 Mount 点标记</entry>
</row>
-
+
<row>
<entry><parameter>fslabel</parameter></entry>
<entry>File system label being destroyed></entry>
@@ -1383,25 +1383,25 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁与一个 mount 点相关联的标记。在该入口函数中,策略应当释放所有在内部分配的,与 <parameter>mntlabel</parameter>
和<parameter>fslabel</parameter> 相关联的存储空间,以便销毁该标记。</para>
</sect3>
-
+
<sect3 id="mac-mpo-destroy-socket">
<title><function>&mac.mpo;_destroy_socket_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_destroy_socket_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
@@ -1415,7 +1415,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>销毁与一个套接字相关联的标记。在该入口函数中,策略应当释放所有在内部分配的,与 <parameter>label</parameter>
相关联的存储空间,以便销毁该标记。</para>
</sect3>
@@ -1540,29 +1540,29 @@
<sect3 id="mac-mpo-copy-mbuf-label">
<title><function>&mac.mpo;_copy_mbuf_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_copy_mbuf_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>src</parameter></paramdef>
<paramdef>struct label
*<parameter>dest</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>src</parameter></entry>
<entry>源标记</entry>
</row>
-
+
<row>
<entry><parameter>dest</parameter></entry>
<entry>目标标记</entry>
@@ -1570,35 +1570,35 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>将 <parameter>src</parameter> 中的标记信息拷贝到 <parameter>dest</parameter>中。</para>
</sect3>
<sect3 id="mac-mpo-copy-pipe-label">
<title><function>&mac.mpo;_copy_pipe_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_copy_pipe_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>src</parameter></paramdef>
<paramdef>struct label
*<parameter>dest</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>src</parameter></entry>
<entry>源标记</entry>
</row>
-
+
<row>
<entry><parameter>dest</parameter></entry>
<entry>目标标记</entry>
@@ -1606,35 +1606,35 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>将 <parameter>src</parameter> 中的标记信息拷贝至 <parameter>dest</parameter>。</para>
</sect3>
<sect3 id="mac-mpo-copy-vnode-label">
<title><function>&mac.mpo;_copy_vnode_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_copy_vnode_label</function></funcdef>
-
+
<paramdef>struct label
*<parameter>src</parameter></paramdef>
<paramdef>struct label
*<parameter>dest</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>src</parameter></entry>
<entry>源标记</entry>
</row>
-
+
<row>
<entry><parameter>dest</parameter></entry>
<entry>目标标记</entry>
@@ -1642,271 +1642,271 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>将 <parameter>src</parameter> 中的标记信息拷贝至 <parameter>dest</parameter>。</para>
</sect3>
<sect3 id="mac-mpo-externalize-cred-label">
<title><function>&mac.mpo;_externalize_cred_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_externalize_cred_label</function></funcdef>
-
+
&mac.externalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.externalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.externalize.para;
</sect3>
<sect3 id="mac-mpo-externalize-ifnet-label">
<title><function>&mac.mpo;_externalize_ifnet_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_externalize_ifnet_label</function></funcdef>
-
+
&mac.externalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.externalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.externalize.para;
</sect3>
-
+
<sect3 id="mac-mpo-externalize-pipe-label">
<title><function>&mac.mpo;_externalize_pipe_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_externalize_pipe_label</function></funcdef>
-
+
&mac.externalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.externalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.externalize.para;
</sect3>
-
+
<sect3 id="mac-mpo-externalize-socket-label">
<title><function>&mac.mpo;_externalize_socket_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_externalize_socket_label</function></funcdef>
-
+
&mac.externalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.externalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.externalize.para;
</sect3>
-
+
<sect3 id="mac-mpo-externalize-socket-peer-label">
<title><function>&mac.mpo;_externalize_socket_peer_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_externalize_socket_peer_label</function></funcdef>
-
+
&mac.externalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.externalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.externalize.para;
</sect3>
-
+
<sect3 id="mac-mpo-externalize-vnode-label">
<title><function>&mac.mpo;_externalize_vnode_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_externalize_vnode_label</function></funcdef>
-
+
&mac.externalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.externalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.externalize.para;
- </sect3>
+ </sect3>
<sect3 id="mac-mpo-internalize-cred-label">
<title><function>&mac.mpo;_internalize_cred_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_internalize_cred_label</function></funcdef>
-
+
&mac.internalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.internalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.internalize.para;
</sect3>
<sect3 id="mac-mpo-internalize-ifnet-label">
<title><function>&mac.mpo;_internalize_ifnet_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_internalize_ifnet_label</function></funcdef>
-
+
&mac.internalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.internalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.internalize.para;
</sect3>
-
+
<sect3 id="mac-mpo-internalize-pipe-label">
<title><function>&mac.mpo;_internalize_pipe_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_internalize_pipe_label</function></funcdef>
-
+
&mac.internalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.internalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.internalize.para;
</sect3>
-
+
<sect3 id="mac-mpo-internalize-socket-label">
<title><function>&mac.mpo;_internalize_socket_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_internalize_socket_label</function></funcdef>
-
+
&mac.internalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.internalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.internalize.para;
</sect3>
<sect3 id="mac-mpo-internalize-vnode-label">
<title><function>&mac.mpo;_internalize_vnode_label</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_internalize_vnode_label</function></funcdef>
-
+
&mac.internalize.paramdefs;
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
&mac.internalize.tbody;
</tgroup>
</informaltable>
-
+
&mac.internalize.para;
</sect3>
</sect2>
-
+
<sect2 id="mac-label-events">
<title>标记事件</title>
-
+
<para>策略模块使用MAC 框架提供的“标记事件”类入口函数,对内核对象的标记进行操作。策略模块将感兴趣的被标记内核对象的相关生命周期事件
注册在恰当的入口点上。对象的初始化、创建和销毁事件均提供了钩子点。在某些对象上还可以实现重新标记,即,允许用户进程改变对象上的标记值。
对某些对象可以实现其特定的对象事件,比如与 IP 重组相关的标记事件。一个典型的被标记对象在其生命周期中将拥有下列入口函数:</para>
-
+
<programlisting>标记初始化 o
(对象相关的等待) \
标记创建 o
@@ -1916,10 +1916,10 @@
访问控制事件 ~--&gt;--o
\
标记销毁 o</programlisting>
-
+
<para>使用标记初始化入口函数,策略可以以一种统一的、与对象使用环境无关的方式设置标记的初始值。
分配给一个策略的缺省 slot 值为0,这样不使用标记的策略可能并不需要执行专门的初始化操作。</para>
-
+
<para>标记的创建事件发生在将一个内核数据结构同一个真实的内核对象相关联(内核对象实例化)的时刻。
例如,在真正被使用之前,在一个缓冲池内已分配的 mbuf 数据结构,将保持为“未使用”状态。
因此,mbuf 的分配操作将导致针对该 mbuf 的标记初始化操作,而 mbuf 的创建操作则被推迟到该 mbuf 真正与一个数据报相关联的时刻。
@@ -1927,18 +1927,18 @@
除了新创建的 mbuf 及其标记之外,作为创建者的套接字与其标记也被提交给策略检查。
不提倡在创建对象时就为其分配内存的原因有两个:创建操作可能发生在对性能有严格要求的内核接口上;
而且,因为创建调用不允许失败,所以无法报告内存分配失败。</para>
-
- <para>对象特有的事件一般不会引发其他的标记事件,但是在对象上下文发生改变时,策略使用它们可以对相关标记进行修改或更新操作。
+
+ <para>对象特有的事件一般不会引发其他的标记事件,但是在对象上下文发生改变时,策略使用它们可以对相关标记进行修改或更新操作。
例如,在<symbol>MAC_UPDATE_IPQ</symbol> 入口函数之内,某个 IP 分片重组队列的标记可能会因为队列中接收了新的 mbuf 而被更新。</para>
-
+
<para>访问控制事件将在后续章节中详细讨论。</para>
-
+
<para>策略通过执行标记销毁操作,释放为其分配的存储空间或维护的状态,之后内核才可以重用或者释放对象的内核数据结构。</para>
-
+
<para>除了与特定内核对象绑定的普通标记之外,还有一种额外的标记类型:临时标记。这些标记用于存放由用户进程提交的更新信息。
它们的初始化和销毁操作与其他标记一样,只是创建事件,<symbol>MAC_INTERNALIZE</symbol>,略有不同:
该函数接受用户提交的标记,负责将其转化为内核表示形式。 </para>
-
+
<sect3 id="mac-fs-label-event-ops">
<title>文件系统对象标记事件操作</title>
@@ -2004,7 +2004,7 @@
</tgroup>
</informaltable>
- <para>根据参数 <parameter>de</parameter> 传入的 devfs 目录项及其标记信息,为一个新近创建的
+ <para>根据参数 <parameter>de</parameter> 传入的 devfs 目录项及其标记信息,为一个新近创建的
devfs vnode 填充标记(<parameter>vlabel</parameter>)。</para>
</sect4>
@@ -2115,12 +2115,12 @@
<sect4 id="mac-mpo-create-devfs-device">
<title><function>&mac.mpo;_create_devfs_device</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_devfs_device</function></funcdef>
-
+
<paramdef>dev_t <parameter>dev</parameter></paramdef>
<paramdef>struct devfs_dirent
*<parameter>devfs_dirent</parameter></paramdef>
@@ -2128,22 +2128,22 @@
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>dev</parameter></entry>
<entry><parameter>devfs_dirent</parameter> 对应的设备</entry>
</row>
-
+
<row>
<entry><parameter>devfs_dirent</parameter></entry>
<entry>将被标记的 Devfs 目录项</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry>将被填写的 <parameter>devfs_dirent</parameter> 标记</entry>
@@ -2151,18 +2151,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为传入设备新建的 devfs_dirent 填写标记。该函数将在设备文件系统加载、重构或添加新设备时被调用。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-devfs-directory">
<title><function>&mac.mpo;_create_devfs_directory</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_devfs_directory</function></funcdef>
-
+
<paramdef>char *<parameter>dirname</parameter></paramdef>
<paramdef>int <parameter>dirnamelen</parameter></paramdef>
<paramdef>struct devfs_dirent
@@ -2171,22 +2171,22 @@
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>dirname</parameter></entry>
<entry>新建目录的名字</entry>
</row>
-
+
<row>
<entry><parameter>namelen</parameter></entry>
<entry>字符串 <parameter>dirname</parameter> 的长度</entry>
</row>
-
+
<row>
<entry><parameter>devfs_dirent</parameter></entry>
<entry>新建目录在 Devfs 中对应的目录项</entry>
@@ -2194,7 +2194,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为传入目录参数的新建 devfs_dirent 填写标记。该函数将在加载、重构设备文件系统,或者添加一个需要指定目录结构的新设备时被调用。</para>
</sect4>
@@ -2261,7 +2261,7 @@
<para>为新近创建的 &man.devfs.5; 符号链接项填写标记(<parameter>delabel</parameter>)。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-vnode-extattr">
<title><function>&mac.mpo;_create_vnode_extattr</function></title>
@@ -2343,12 +2343,12 @@
<sect4 id="mac-mpo-create-mount">
<title><function>&mac.mpo;_create_mount</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mount</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct mount
@@ -2359,27 +2359,27 @@
*<parameter>fslabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>mp</parameter></entry>
<entry>客体;将被挂载的文件系统</entry>
</row>
-
+
<row>
<entry><parameter>mntlabel</parameter></entry>
<entry>将被填写的 <parameter>mp</parameter> 的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>fslabel</parameter></entry>
<entry>将被挂载到 <parameter>mp</parameter> 的文件系统的策略标记。</entry>
@@ -2387,18 +2387,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为传入的主体信任状所创建的挂载点填写标记。该函数将在文件系统挂载时被调用。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-root-mount">
<title><function>&mac.mpo;_create_root_mount</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_root_mount</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct mount
@@ -2409,11 +2409,11 @@
*<parameter>fslabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry namest="first" nameend="last">见 <xref
@@ -2422,18 +2422,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为传入的主体信任状所创建的挂载点填写标记。该函数将在挂载根文件系统时,&mac.mpo;_create_mount; 之后被调用。</para>
</sect4>
<sect4 id="mac-mpo-relabel-vnode">
<title><function>&mac.mpo;_relabel_vnode</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_relabel_vnode</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -2444,27 +2444,27 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>将被重新标记的 vnode</entry>
</row>
-
+
<row>
<entry><parameter>vnodelabel</parameter></entry>
<entry><parameter>vp</parameter> 现有的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将取代<parameter>vnodelabel</parameter>的新(可能只是部分)标记</entry>
@@ -2472,7 +2472,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的新标记和主体信任状,更新参数 vnode 的标记。</para>
</sect4>
@@ -2533,7 +2533,7 @@
<funcprototype>
<funcdef>void
<function>&mac.mpo;_update_devfsdirent</function></funcdef>
-
+
<paramdef>struct devfs_dirent
*<parameter>devfs_dirent</parameter></paramdef>
<paramdef>struct label
@@ -2544,28 +2544,28 @@
*<parameter>vnodelabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>devfs_dirent</parameter></entry>
<entry>客体;devfs 目录项</entry>
</row>
-
+
<row>
<entry><parameter>direntlabel</parameter></entry>
<entry>将被更新的<parameter>devfs_dirent</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>父 vnode</entry>
<entry>已锁定</entry>
</row>
-
+
<row>
<entry><parameter>vnodelabel</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
@@ -2573,26 +2573,26 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据所传入的 devfs vnode 标记,对 <parameter>devfs_dirent</parameter> 的标记进行更新。
重新标记一个 devfs vnode 的操作成功之后,将调用该函数来确认标记的改变,如此,即使相应的 vnode 数据结构被内核回收重用,
- 也不会丢失标记的新状态。另外,在 devfs 中新建一个符号链接时,紧接着<function>mac_vnode_create_from_vnode</function>,
+ 也不会丢失标记的新状态。另外,在 devfs 中新建一个符号链接时,紧接着<function>mac_vnode_create_from_vnode</function>,
也将调用该函数,对 vnode 标记进行初始化操作。</para>
</sect4>
</sect3>
-
+
<sect3 id="mac-ipc-label-ops">
<title>IPC 对象标记事件操作</title>
-
+
<sect4 id="mac-mpo-create-mbuf-from-socket">
<title><function>&mac.mpo;_create_mbuf_from_socket</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_from_socket</function></funcdef>
-
+
<paramdef>struct socket
*<parameter>so</parameter></paramdef>
<paramdef>struct label
@@ -2602,28 +2602,28 @@
*<parameter>mbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>socket</parameter></entry>
<entry>套接字</entry>
<entry>套接字锁定 WIP</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>socket</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>m</parameter></entry>
<entry>客体;mbuf</entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry>将被填写的 <parameter>m</parameter> 的策略标记 </entry>
@@ -2631,7 +2631,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的套接字标记为新创建的mbuf头部设置标记。
每当套接字产生一个新的数据报或者消息,并将其存储在参数 mbuf 中时,将调用该函数。</para>
</sect4>
@@ -2678,15 +2678,15 @@
<para>根据传入的主体信任状参数,设置新建管道的标记。每当一个新管道被创建,该函数将被调用。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-socket">
<title><function>&mac.mpo;_create_socket</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_socket</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -2695,23 +2695,23 @@
*<parameter>socketlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>so</parameter></entry>
<entry>客体;将被标记的套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry>将被填写的 <parameter>so</parameter> 的标记</entry>
@@ -2719,7 +2719,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的主体信任状参数,设置新建套接字的标记。每当新建一个套接字,该函数将被调用。</para>
</sect4>
@@ -2826,12 +2826,12 @@
<sect4 id="mac-mpo-relabel-socket">
<title><function>&mac.mpo;_relabel_socket</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_relabel_socket</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -2842,28 +2842,28 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>so</parameter></entry>
<entry>客体;套接字</entry>
</row>
-
+
<row>
<entry><parameter>oldlabel</parameter></entry>
<entry><parameter>so</parameter> 的当前标记 </entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将为<parameter>socket</parameter> 设置的新标记 </entry>
@@ -2871,18 +2871,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的标记参数,对套接字的当前标记进行更新。</para>
</sect4>
-
+
<sect4 id="mpo-set-socket-peer-from-mbuf">
<title><function>&mac.mpo;_set_socket_peer_from_mbuf</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_set_socket_peer_from_mbuf</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>mbuf</parameter></paramdef>
<paramdef>struct label
@@ -2893,27 +2893,27 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>从套接字接收到的第一个数据报</entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry><parameter>mbuf</parameter> 的标记 </entry>
</row>
-
+
<row>
<entry><parameter>oldlabel</parameter></entry>
<entry>套接字的当前标记</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将为套接字填写的策略标记</entry>
@@ -2921,19 +2921,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的 mbuf 标记,设置某个 stream 套接字的对等标志。
除Unix域的套接字之外,每当一个 stream 套接字接收到第一个数据报时,该函数将被调用。</para>
</sect4>
-
+
<sect4 id="mac-mpo-set-socket-peer-from-socket">
<title><function>&mac.mpo;_set_socket_peer_from_socket</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_set_socket_peer_from_socket</function></funcdef>
-
+
<paramdef>struct socket
*<parameter>oldsocket</parameter></paramdef>
<paramdef>struct label
@@ -2944,27 +2944,27 @@
*<parameter>newsocketpeerlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>oldsocket</parameter></entry>
<entry>本地套接字</entry>
</row>
-
+
<row>
<entry><parameter>oldsocketlabel</parameter></entry>
<entry><parameter>oldsocket</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>newsocket</parameter></entry>
<entry>对等套接字</entry>
</row>
-
+
<row>
<entry><parameter>newsocketpeerlabel</parameter></entry>
<entry>将为<parameter>newsocket</parameter>填写的策略标记</entry>
@@ -2972,24 +2972,24 @@
</tbody>
</tgroup>
</informaltable>
-
+
<!-- XXX Passed _remote_ socket endpoint ? -->
<para>根据传入的远程套接字端点,为一个 stream UNIX 与套接字设置对等标记。
每当相应的套接字对之间进行连接时,该函数将在两端分别被调用。</para>
</sect4>
</sect3>
-
+
<sect3 id="mac-net-labeling-event-ops">
<title>Network Object Labeling Event Operations</title>
-
+
<sect4 id="mac-mpo-create-bpfdesc">
<title><function>&mac.mpo;_create_bpfdesc</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_bpfdesc</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct bpf_d
@@ -2998,23 +2998,23 @@
*<parameter>bpflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>bpf_d</parameter></entry>
<entry>客体;bpf 描述子</entry>
</row>
-
+
<row>
<entry><parameter>bpf</parameter></entry>
<entry>将为<parameter>bpf_d</parameter>填写的策略标记</entry>
@@ -3022,36 +3022,36 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的主体信任状参数,为新建的 BPF 描述子设置标记。
当进程打开 BPF 设备节点时,该函数将被调用。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-ifnet">
<title><function>&mac.mpo;_create_ifnet</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_ifnet</function></funcdef>
-
+
<paramdef>struct ifnet
*<parameter>ifnet</parameter></paramdef>
<paramdef>struct label
*<parameter>ifnetlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry>将为<parameter>ifnet</parameter>填写的策略标记</entry>
@@ -3059,19 +3059,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为新建的网络接口设置标记。该函数在以下情况下被调用:
当一个新的物理接口变为可用时,或者当一个伪接口在引导时或由于某个用户操作而实例化时。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-ipq">
<title><function>&mac.mpo;_create_ipq</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_ipq</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>fragment</parameter></paramdef>
<paramdef>struct label
@@ -3082,27 +3082,27 @@
*<parameter>ipqlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>fragment</parameter></entry>
<entry>第一个被接收的 IP 分片</entry>
</row>
-
+
<row>
<entry><parameter>fragmentlabel</parameter></entry>
<entry><parameter>fragment</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>ipq</parameter></entry>
<entry>将被标记的 IP 重组队列</entry>
</row>
-
+
<row>
<entry><parameter>ipqlabel</parameter></entry>
<entry>将为<parameter>ipq</parameter>填写的策略标记</entry>
@@ -3110,18 +3110,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据第一个接收到的分片的 mbuf 头部信息,为新建的 IP 分片重组队列设置标记。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-datagram-from-ipq">
<title><function>&mac.mpo;_create_datagram_from_ipq</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_create_datagram_from_ipq</function></funcdef>
-
+
<paramdef>struct ipq
*<parameter>ipq</parameter></paramdef>
<paramdef>struct label
@@ -3132,27 +3132,27 @@
*<parameter>datagramlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>ipq</parameter></entry>
<entry>IP 重组队列</entry>
</row>
-
+
<row>
<entry><parameter>ipqlabel</parameter></entry>
<entry><parameter>ipq</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>datagram</parameter></entry>
<entry>将被标记的数据报</entry>
</row>
-
+
<row>
<entry><parameter>datagramlabel</parameter></entry>
<entry>将为<parameter>datagramlabel</parameter>填写的策略标记</entry>
@@ -3160,18 +3160,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据 IP 分片重组队列,为刚刚重组完毕的 IP 数据报设置标记。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-fragment">
<title><function>&mac.mpo;_create_fragment</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_fragment</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>datagram</parameter></paramdef>
<paramdef>struct label
@@ -3182,27 +3182,27 @@
*<parameter>fragmentlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>datagram</parameter></entry>
<entry>数据报</entry>
</row>
-
+
<row>
<entry><parameter>datagramlabel</parameter></entry>
<entry><parameter>datagram</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>fragment</parameter></entry>
<entry>将被标记的分片</entry>
</row>
-
+
<row>
<entry><parameter>fragmentlabel</parameter></entry>
<entry>将为<parameter>datagram</parameter>填写的策略标记</entry>
@@ -3210,18 +3210,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据数据报所对应的 mbuf 头部信息,为其新建的分片的 mbuf 头部设置标记。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-mbuf-from-mbuf">
<title><function>&mac.mpo;_create_mbuf_from_mbuf</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_from_mbuf</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>oldmbuf</parameter></paramdef>
<paramdef>struct label
@@ -3232,27 +3232,27 @@
*<parameter>newmbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>oldmbuf</parameter></entry>
<entry>已有的(源)mbuf</entry>
</row>
-
+
<row>
<entry><parameter>oldmbuflabel</parameter></entry>
<entry><parameter>oldmbuf</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>newmbuf</parameter></entry>
<entry>将被标记的新建 mbuf</entry>
</row>
-
+
<row>
<entry><parameter>newmbuflabel</parameter></entry>
<entry>将为<parameter>newmbuf</parameter>填写的策略标记</entry>
@@ -3260,19 +3260,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据某个现有数据报的 mbuf 头部信息,为新建数据报的 mbuf 头部设置标记。在许多条件下将会调用该函数,
比如,由于对齐要求而重新分配某个 mbuf 时。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-mbuf-linklayer">
<title><function>&mac.mpo;_create_mbuf_linklayer</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_linklayer</function></funcdef>
-
+
<paramdef>struct ifnet
*<parameter>ifnet</parameter></paramdef>
<paramdef>struct label
@@ -3283,27 +3283,27 @@
*<parameter>mbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>新建数据报的 mbuf 头部</entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry>将为<parameter>mbuf</parameter>填写的策略标记</entry>
@@ -3311,19 +3311,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为在给定接口上由于某个链路层响应而新建的数据报的mbuf头部设置标记。
该函数将在若干条件下被调用,比如当IPv4和IPv6协议栈在响应ARP或者ND6时。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-mbuf-from-bpfdesc">
<title><function>&mac.mpo;_create_mbuf_from_bpfdesc</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_from_bpfdesc</function></funcdef>
-
+
<paramdef>struct bpf_d
*<parameter>bpf_d</parameter></paramdef>
<paramdef>struct label
@@ -3334,27 +3334,27 @@
*<parameter>mbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>bpf_d</parameter></entry>
<entry>BPF 描述子</entry>
</row>
-
+
<row>
<entry><parameter>bpflabel</parameter></entry>
<entry><parameter>bpflabel</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>将被标记的新建 mbuf</entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry>将为<parameter>mbuf</parameter>填写的策略标记</entry>
@@ -3362,19 +3362,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为使用参数 BPF 描述子创建的新数据报的 mbuf 头部设置标记。
当对参数 BPF 描述子所关联的 BPF 设备进行写操作时,该函数将被调用。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-mbuf-from-ifnet">
<title><function>&mac.mpo;_create_mbuf_from_ifnet</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_from_ifnet</function></funcdef>
-
+
<paramdef>struct ifnet
*<parameter>ifnet</parameter></paramdef>
<paramdef>struct label
@@ -3385,27 +3385,27 @@
*<parameter>mbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnetlabel</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>新建数据报的 mbuf 头部</entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry>将为<parameter>mbuf</parameter>填写的策略标记</entry>
@@ -3413,18 +3413,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为从网络接口参数创建的数据报的 mbuf 头部设置标记。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-mbuf-multicast-encap">
<title><function>&mac.mpo;_create_mbuf_multicast_encap</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_multicast_encap</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>oldmbuf</parameter></paramdef>
<paramdef>struct label
@@ -3439,37 +3439,37 @@
*<parameter>newmbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>oldmbuf</parameter></entry>
<entry>现有数据报的 mbuf 头部</entry>
</row>
-
+
<row>
<entry><parameter>oldmbuflabel</parameter></entry>
<entry><parameter>oldmbuf</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>newmbuf</parameter></entry>
<entry>将被标记的新建数据报 mbuf 头部</entry>
</row>
-
+
<row>
<entry><parameter>newmbuflabel</parameter></entry>
<entry>将为<parameter>newmbuf</parameter>填写的策略标记</entry>
@@ -3477,20 +3477,20 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>当传入的已有数据报被给定多播封装接口(multicast encapsulation interface)处理时被调用,
为新创建的数据报所在 mbuf 头部设置标记。
每当使用该虚拟接口传递一个mbuf时,将调用该函数。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-mbuf-netlayer">
<title><function>&mac.mpo;_create_mbuf_netlayer</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_mbuf_netlayer</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>oldmbuf</parameter></paramdef>
<paramdef>struct label
@@ -3501,27 +3501,27 @@
*<parameter>newmbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>oldmbuf</parameter></entry>
<entry>接收的数据报</entry>
</row>
-
+
<row>
<entry><parameter>oldmbuflabel</parameter></entry>
<entry><parameter>oldmbuf</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>newmbuf</parameter></entry>
<entry>新建数据报</entry>
</row>
-
+
<row>
<entry><parameter>newmbuflabel</parameter></entry>
<entry><parameter>newmbuf</parameter> 的策略标记 </entry>
@@ -3529,19 +3529,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为由 IP 堆栈因为响应接收数据报(<parameter>oldmbuf</parameter>)而新建的数据报设置其 mbuf 头部的标记。
许多情况下需要调用该函数,比如,响应 ICMP 请求数据报时。</para>
</sect4>
-
+
<sect4 id="mac-mpo-fragment-match">
<title><function>&mac.mpo;_fragment_match</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_fragment_match</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>fragment</parameter></paramdef>
<paramdef>struct label
@@ -3552,27 +3552,27 @@
*<parameter>ipqlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>fragment</parameter></entry>
<entry>IP 数据报分片</entry>
</row>
-
+
<row>
<entry><parameter>fragmentlabel</parameter></entry>
<entry><parameter>fragment</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>ipq</parameter></entry>
<entry>IP 分片重组队列</entry>
</row>
-
+
<row>
<entry><parameter>ipqlabel</parameter></entry>
<entry><parameter>ipq</parameter> 的策略标记 </entry>
@@ -3580,7 +3580,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据所传入的 IP 分片重组队列(<parameter>ipq</parameter>)的标记,
检查包含一个 IP 数据报(<parameter>fragment</parameter>)的 mbuf 的头部是否符合其要求。
符合,则返回<returnvalue>1</returnvalue>。否则,返回<returnvalue>0</returnvalue>。
@@ -3588,15 +3588,15 @@
如果失败,将为分片重新实例化一个新的分片重组队列。
策略可以利用该入口函数,根据标记或者其他信息阻止不期望的 IP 分片重组。</para>
</sect4>
-
+
<sect4 id="mac-mpo-ifnet-relabel">
<title><function>&mac.mpo;_relabel_ifnet</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_relabel_ifnet</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct ifnet
@@ -3607,27 +3607,27 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>客体;网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter> 的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将为<parameter>ifnet</parameter>设置的新标记</entry>
@@ -3635,19 +3635,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据所传入的新标记,<parameter>newlabel</parameter>,以及主体信任状,
<parameter>cred</parameter>,对网络接口的标记进行更新。</para>
</sect4>
-
+
<sect4 id="mac-mpo-update-ipq">
<title><function>&mac.mpo;_update_ipq</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_update_ipq</function></funcdef>
-
+
<paramdef>struct mbuf
*<parameter>fragment</parameter></paramdef>
<paramdef>struct label
@@ -3658,27 +3658,27 @@
*<parameter>ipqlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>IP 分片</entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry><parameter>mbuf</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>ipq</parameter></entry>
<entry>IP 分片重组队列</entry>
</row>
-
+
<row>
<entry><parameter>ipqlabel</parameter></entry>
<entry>将被更新的<parameter>ipq</parameter>的当前策略标记</entry>
@@ -3686,40 +3686,40 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据所传入的 IP 分片 mbuf 头部(<parameter>mbuf</parameter>)为接收
它的 IP 分片重组队列(<parameter>ipq</parameter>)的标记进行更新。</para>
</sect4>
</sect3>
-
+
<sect3 id="mac-proc-labeling-event-ops">
<title>进程标记事件操作</title>
-
+
<sect4 id="mac-mpo-create-cred">
<title><function>&mac.mpo;_create_cred</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_cred</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>parent_cred</parameter></paramdef>
<paramdef>struct ucred
*<parameter>child_cred</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>parent_cred</parameter></entry>
<entry>父主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>child_cred</parameter></entry>
<entry>子主体信任状</entry>
@@ -3727,20 +3727,20 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据所传入的主体信任状,为新建的主体信任状设置标记。
每当为一个新建的 <type>struct ucred</type>调用 &man.crcopy.9; 时,将调用此函数。
该函数不应与进程复制(forking)或者创建事件混为一谈。</para>
</sect4>
-
+
<sect4 id="mac-mpo-execve-transition">
<title><function>&mac.mpo;_execve_transition</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_execve_transition</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>old</parameter></paramdef>
<paramdef>struct ucred
@@ -3751,29 +3751,29 @@
*<parameter>vnodelabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>old</parameter></entry>
<entry>已有的主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>new</parameter></entry>
<entry>将被标记的新主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>将被执行的文件</entry>
<entry>已被锁定</entry>
</row>
-
+
<row>
<entry><parameter>vnodelabel</parameter></entry>
<entry><parameter>vp</parameter> 的策略标记 </entry>
@@ -3781,7 +3781,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>一个拥有信任状<parameter>old</parameter>的主体由于执行(<parameter>vp</parameter>文件而导致标记转换时,
该函数根据vnode标记为该主体重新标记为<parameter>new</parameter>。 每当一个进程请求执行vnode文件,而通过
入口函数<function>mpo_execve_will_transition</function> 有成功返回的策略时,将调用该函数。
@@ -3790,15 +3790,15 @@
transitioning event. 一旦策略实现了<function>mpo_create_cred</function>函数,即使没有实现
<function>mpo_execve_will_transition</function>,也应该实现该函数。</para>
</sect4>
-
+
<sect4 id="mac-mpo-execve-will-transition">
<title><function>&mac.mpo;_execve_will_transition</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_execve_will_transition</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>old</parameter></paramdef>
<paramdef>struct vnode
@@ -3807,23 +3807,23 @@
*<parameter>vnodelabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>old</parameter></entry>
<entry>在执行&man.execve.2;之前的主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>将被执行的文件</entry>
</row>
-
+
<row>
<entry><parameter>vnodelabel</parameter></entry>
<entry><parameter>vp</parameter> 的策略标记 </entry>
@@ -3831,29 +3831,29 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>由策略决定,当参数主体信任状执行参数 vnode 时,是否需要进行一个标记转换操作。如果需要,返回<returnvalue>1</returnvalue>;
否则,返回<returnvalue>0</returnvalue>。即使一个策略返回<returnvalue>0</returnvalue>,它也必须为自己不期望的对
<function>mpo_execve_transition</function>的调用作好准备,因为只要有其他任何一个策略要求转换,就将执行此函数。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-proc0">
<title><function>&mac.mpo;_create_proc0</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_proc0</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
@@ -3862,27 +3862,27 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为进程0,所有内核进程的祖先,创建主体信任状。</para>
</sect4>
-
+
<sect4 id="mac-mpo-create-proc1">
<title><function>&mac.mpo;_create_proc1</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_create_proc1</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
@@ -3891,35 +3891,35 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>为进程1,所有用户进程的祖先,创建主体信任状。</para>
</sect4>
-
+
<sect4 id="mac-mpo-relabel-cred">
<title><function>&mac.mpo;_relabel_cred</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>void
<function>&mac.mpo;_relabel_cred</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct label
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将被应用到 <parameter>cred</parameter> 上的新标记</entry>
@@ -3927,30 +3927,30 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>根据传入的新标记,对主体信任状上的标记进行更新。</para>
</sect4>
</sect3>
</sect2>
-
+
<sect2 id="mac-access-control-checks">
<title>访问控制检查</title>
-
+
<para>通过访问控制入口函数,策略模块能影响内核的访问控制决策。
通常情况下,不是绝对,一个访问控制入口函数的参数有,一个或者若干个授权信任状,和相关操作涉及的其他任何对象的信息(其中可能包含标记)。
访问控制入口函数返回0,表示允许该操作;否则,返回一个 &man.errno.2; 错误编码。调用该入口函数,将遍历所有系统注册的策略模块,逐一进行
策略相关的检查和决策,之后按照下述方法组合不同策略的返回结果:只有当所有的模块均允许该操作时,才成功返回。
否则,如果有一个或者若干模块失败返回,则整个检查不通过。如果有多个模块的检查出错返回,将由定义在<filename>kern_mac.c</filename> 中的
<function>error_select()</function> 函数从它们返回的错误编码中,选择一个合适的,返回给用户。</para>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<tbody>
<row>
<entry>最高优先级</entry>
<entry><errorcode>EDEADLK</errorcode></entry></row>
-
+
<row>
<entry></entry>
<entry><errorcode>EINVAL</errorcode></entry>
@@ -3970,18 +3970,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>如果所有策略模块返回的错误编码均没有出现在上述优先级序列表中,则任意选择一个返回。
选择错误编码的一般次序为:内核错误,无效的参数,对象不存在,访问被拒绝,和其他错误。</para>
-
+
<sect3 id="mac-mpo-bpfdesc-check-receive-from-ifnet">
<title><function>&mac.mpo;_check_bpfdesc_receive</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_bpfdesc_receive</function></funcdef>
-
+
<paramdef>struct bpf_d
*<parameter>bpf_d</parameter></paramdef>
<paramdef>struct label
@@ -3992,27 +3992,27 @@
*<parameter>ifnetlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>bpf_d</parameter></entry>
<entry>主体;BPF 描述子</entry>
</row>
-
+
<row>
<entry><parameter>bpflabel</parameter></entry>
<entry><parameter>bpf_d</parameter> 的策略标记 </entry>
</row>
-
+
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>客体;网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter> 的策略标记 </entry>
@@ -4020,7 +4020,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>决定 MAC 框架是否应该允许将由参数接口接收到的数据报传递给由 BPF 描述子所对应的缓冲区。成功,则返回<returnvalue>0</returnvalue>;
否则,返回错误编码信息<varname>errno</varname>。建议使用的错误编码有:<errorcode>EACCES</errorcode>,用于标记不符的情况;
<errorcode>EPERM</errorcode>,用于缺少特权的情况。</para>
@@ -4148,7 +4148,7 @@
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>name</parameter></entry>
<entry>内核的环境变量名字Kernel environment variable name</entry>
@@ -4541,12 +4541,12 @@
<sect3 id="mac-mpo-cred-check-socket-bind">
<title><function>&mac.mpo;_check_socket_bind</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_bind</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -4557,27 +4557,27 @@
*<parameter>sockaddr</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>socket</parameter></entry>
<entry>将被绑定的套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>socket</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>sockaddr</parameter></entry>
<entry><parameter>socket</parameter>的地址</entry>
@@ -4585,18 +4585,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
</sect3>
-
-
+
+
<sect3 id="mac-mpo-cred-check-socket-connect">
<title><function>&mac.mpo;_check_socket_connect</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_connect</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -4607,35 +4607,35 @@
*<parameter>sockaddr</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>socket</parameter></entry>
<entry>将被连接的套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>socket</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>sockaddr</parameter></entry>
<entry><parameter>socket</parameter>的地址</entry>
</row>
- </tbody>
+ </tbody>
</tgroup>
</informaltable>
-
+
<para>决定该主体(<parameter>cred</parameter>)是否有权将套接字(<parameter>socket</parameter>)绑定到地址
<parameter>sockaddr</parameter>。成功,返回<returnvalue>0</returnvalue>,否则返回一个错误编码<varname>errno</varname>。
建议采用的错误编码有:<errorcode>EACCES</errorcode>,用于标记不符的情况;<errorcode>EPERM</errorcode>,用于特权不足的情况。</para>
@@ -4726,32 +4726,32 @@
<para>决定该主体是否有权通过套接字<parameter>so</parameter>发送信息。</para>
</sect3>
-
+
<sect3 id="mac-mpo-check-cred-visible">
<title><function>&mac.mpo;_check_cred_visible</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_cred_visible</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>u1</parameter></paramdef>
<paramdef>struct ucred
*<parameter>u2</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>u1</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>u2</parameter></entry>
<entry>对象信任状</entry>
@@ -4759,21 +4759,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定该主体信任状<parameter>u1</parameter>是否有权 <quote>see</quote> 具有信任状<parameter>u2</parameter> 的其他主体。
成功,返回<returnvalue>0</returnvalue>;否则,返回错误编码<varname>errno</varname>。建议采用的错误编码有:
<errorcode>EACCES</errorcode>,用于标记不符的情况;<errorcode>EPERM</errorcode>,用于特权不足的情况;<errorcode>ESRCH</errorcode>,
用来提供不可见性。该函数可在许多环境下使用,包括命令<command>ps</command>所使用的进程间的状态 sysctl,以及通过procfs 的状态查询操作。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-socket-visible">
<title><function>&mac.mpo;_check_socket_visible</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_visible</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -4782,22 +4782,22 @@
*<parameter>socketlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>socket</parameter></entry>
<entry>客体;套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>socket</parameter>的策略标记</entry>
@@ -4805,17 +4805,17 @@
</tbody>
</tgroup>
</informaltable>
-
+
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-ifnet-relabel">
<title><function>&mac.mpo;_check_ifnet_relabel</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_ifnet_relabel</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct ifnet
@@ -4826,27 +4826,27 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>客体;网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter>现有的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将被应用到<parameter>ifnet</parameter>上的新的策略标记</entry>
@@ -4854,18 +4854,18 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>决定该主体信任状是否有权使用传入的标记更新参数对给定的网络接口的标记进行重新设置。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-socket-relabel">
<title><function>&mac.mpo;_check_socket_relabel</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_relabel</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -4876,27 +4876,27 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>socket</parameter></entry>
<entry>客体;套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>socket</parameter>现有的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将被应用到<parameter>socketlabel</parameter>上的更新标记</entry>
@@ -4904,35 +4904,35 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>决定该主体信任状是否有权采用传入的标记对套接字参数的标记进行重新设置。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-cred-relabel">
<title><function>&mac.mpo;_check_cred_relabel</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_cred_relabel</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct label
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将被应用到<parameter>cred</parameter>上的更新标记</entry>
@@ -4940,19 +4940,19 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>决定该主体信任状是否有权将自己的标记重新设置为给定的更新标记。</para>
</sect3>
<sect3 id="mac-mpo-cred-check-vnode-relabel">
<title><function>&mac.mpo;_check_vnode_relabel</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_relabel</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -4963,29 +4963,29 @@
*<parameter>newlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
<entry>已被锁定</entry>
</row>
-
+
<row>
<entry><parameter>vnodelabel</parameter></entry>
<entry><parameter>vp</parameter>现有的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>newlabel</parameter></entry>
<entry>将被应用到<parameter>vp</parameter>上的策略标记</entry>
@@ -4993,17 +4993,17 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>决定该主体信任状是否有权将参数 vnode 的标记重新设置为指定标记。</para>
</sect3>
-
+
<sect3 id="mpo-cred-check-mount-stat">
<title><function>&mac.mpo;_check_mount_stat</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int <function>&mac.mpo;_check_mount_stat</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct mount
@@ -5012,22 +5012,22 @@
*<parameter>mountlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>mp</parameter></entry>
<entry>客体;文件系统挂载</entry>
</row>
-
+
<row>
<entry><parameter>mountlabel</parameter></entry>
<entry><parameter>mp</parameter>的策略标记</entry>
@@ -5035,7 +5035,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<!-- XXX Update ? -->
<para>确定相关主体信任状是否有权查看在给定文件系统上执行 statfs 的结果。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
@@ -5045,33 +5045,33 @@
在 &man.statfs.2; 和其他相关调用期间,或者当需要从文件系统列表中选择排除哪个文件系统时,比如,
调用 &man.getfsstat.2;时。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-proc-debug">
<title><function>&mac.mpo;_check_proc_debug</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_proc_debug</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct proc
*<parameter>proc</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>proc</parameter></entry>
<entry>客体;进程</entry>
@@ -5079,22 +5079,22 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权 debug 给定进程。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够;
<errorcode>ESRCH</errorcode>,用于隐瞒目标的存在。
&man.ptrace.2; 和 &man.ktrace.2; API,以及某些 procfs 操作将调用该函数。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-access">
<title><function>&mac.mpo;_check_vnode_access</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_access</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5104,27 +5104,27 @@
<paramdef>int <parameter>flags</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>flags</parameter></entry>
<entry>&man.access.2; 标志</entry>
@@ -5132,23 +5132,23 @@
</tbody>
</tgroup>
</informaltable>
-
- <para>根据相关主体信任状决定其对给定 vnode 以给定访问标志执行的 &man.access.2;
+
+ <para>根据相关主体信任状决定其对给定 vnode 以给定访问标志执行的 &man.access.2;
和其他相关调用的返回值。一般,应采用与<function>&mac.mpo;_check_vnode_open</function>
相同的语义来实现该函数。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-chdir">
<title><function>&mac.mpo;_check_vnode_chdir</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_chdir</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5157,22 +5157,22 @@
*<parameter>dlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>dvp</parameter></entry>
<entry>客体;&man.chdir.2; 的目的 vnode</entry>
</row>
-
+
<row>
<entry><parameter>dlabel</parameter></entry>
<entry><parameter>dvp</parameter>的策略标记</entry>
@@ -5180,7 +5180,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权将进程工作目录切换到给定 vnode。成功,则返回 <returnvalue>0</returnvalue>;
否则,返回一个 <varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
@@ -5231,15 +5231,15 @@
<para>确定相关主体是否有权 &man.chroot.2; 到由
(<parameter>dvp</parameter>)给定的目录。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-create">
<title><function>&mac.mpo;_check_vnode_create</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_create</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5252,32 +5252,32 @@
*<parameter>vap</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>dvp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>dlabel</parameter></entry>
<entry><parameter>dvp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>cnp</parameter></entry>
<entry><parameter>dvp</parameter>中的成员名</entry>
</row>
-
+
<row>
<entry><parameter>vap</parameter></entry>
<entry><parameter>vap</parameter>的 vnode 属性</entry>
@@ -5285,24 +5285,24 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权在给定父目录,以给定的名字和属性,
常见一个 vnode。成功,则返回 <returnvalue>0</returnvalue>;否则,
返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode> 来表示用于标记不匹配, 而用
<errorcode>EPERM</errorcode>,用于权限不足。
- 以<symbol>O_CREAT</symbol>为参数调用 &man.open.2;,或对 &man.mknod.2;,&man.mkfifo.2;
+ 以<symbol>O_CREAT</symbol>为参数调用 &man.open.2;,或对 &man.mknod.2;,&man.mkfifo.2;
等的调用将导致该函数被调用。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-delete">
<title><function>&mac.mpo;_check_vnode_delete</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_delete</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5316,37 +5316,37 @@
*<parameter>cnp</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>dvp</parameter></entry>
<entry>父目录 vnode</entry>
</row>
-
+
<row>
<entry><parameter>dlabel</parameter></entry>
<entry><parameter>dvp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;将被删除的 vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>cnp</parameter></entry>
<entry><parameter>vp</parameter>中的成员名</entry>
@@ -5354,7 +5354,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权从给定的父目录中,删除给定名字的 vnode。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
@@ -5364,44 +5364,44 @@
<function>mpo_check_rename_to</function>,
用来授权由于重命名操作导致的目标文件的删除。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-deleteacl">
<title><function>&mac.mpo;_check_vnode_deleteacl</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_deleteacl</function></funcdef>
-
+
<paramdef>struct ucred *<parameter>cred</parameter></paramdef>
<paramdef>struct vnode *<parameter>vp</parameter></paramdef>
<paramdef>struct label *<parameter>label</parameter></paramdef>
<paramdef>acl_type_t <parameter>type</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
<entry>被锁定</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>type</parameter></entry>
<entry>ACL 类型</entry>
@@ -5409,21 +5409,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权删除给定 vnode 的给定类型的 ACL。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-exec">
<title><function>&mac.mpo;_check_vnode_exec</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_exec</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5432,22 +5432,22 @@
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;将被执行的 vnode </entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
@@ -5455,22 +5455,22 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权执行给定 vnode。
对于执行特权的决策与任何瞬时事件的决策是严格分开的。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mpo-cred-check-vnode-getacl">
<title><function>&mac.mpo;_check_vnode_getacl</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_getacl</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5481,27 +5481,27 @@
<parameter>type</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>type</parameter></entry>
<entry>ACL 类型</entry>
@@ -5509,21 +5509,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权查询给定 vnode 上的给定类型的 ACL。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-getextattr">
<title><function>&mac.mpo;_check_vnode_getextattr</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_getextattr</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -5538,37 +5538,37 @@
*<parameter>uio</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>attrnamespace</parameter></entry>
<entry>扩展属性名字空间</entry>
</row>
-
+
<row>
<entry><parameter>name</parameter></entry>
<entry>扩展属性名</entry>
</row>
-
+
<row>
<entry><parameter>uio</parameter></entry>
<entry>I/O 结构指针;参见 &man.uio.9;</entry>
@@ -5576,7 +5576,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权查询给定 vnode 上给定名字空间和名字的扩展属性。
使用扩展属性实现标记存储的策略模块可能会需要对这些扩展属性的操作进行特殊处理。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
@@ -5645,7 +5645,7 @@
</tgroup>
</informaltable>
- <para>确定相关主体是否有权为参数<parameter>vp</parameter>给定的 vnode
+ <para>确定相关主体是否有权为参数<parameter>vp</parameter>给定的 vnode
创建一个由参数<parameter>cnp</parameter>给定名字的链接。</para>
</sect3>
@@ -5977,15 +5977,15 @@
则<parameter>vp</parameter> 和
<parameter>label</parameter> 的值将为 NULL.</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-socket-listen">
<title><function>&mac.mpo;_check_socket_listen</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_listen</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -5994,22 +5994,22 @@
*<parameter>socketlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>socket</parameter></entry>
<entry>客体;套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>socket</parameter>的策略标记</entry>
@@ -6017,21 +6017,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体是否有权监听给定套接字。
成功,则返回<returnvalue>0</returnvalue>;否则,返回错误编码值<varname>errno</varname>。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-lookup">
<title><function>&mac.mpo;_check_vnode_lookup</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_lookup</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter></parameter>cred</paramdef>
<paramdef>struct vnode
@@ -6042,27 +6042,27 @@
*<parameter>cnp</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>dvp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>dlabel</parameter></entry>
<entry><parameter>dvp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>cnp</parameter></entry>
<entry>被检查的成员名</entry>
@@ -6070,21 +6070,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权在给定的目录 vnode 中为查找给定名字执行lookup操作。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个 <varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-open">
<title><function>&mac.mpo;_check_vnode_open</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_open</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6095,27 +6095,27 @@
<parameter>acc_mode</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>acc_mode</parameter></entry>
<entry>&man.open.2; 访问模式</entry>
@@ -6123,21 +6123,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权在给定 vnode 上以给定的访问模式执行 open 操作。
如果成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个错误编码。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-readdir">
<title><function>&mac.mpo;_check_vnode_readdir</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_readdir</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter></parameter>cred</paramdef>
<paramdef>struct vnode
@@ -6146,22 +6146,22 @@
*<parameter></parameter>dlabel</paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>dvp</parameter></entry>
<entry>客体;目录 vnode</entry>
</row>
-
+
<row>
<entry><parameter>dlabel</parameter></entry>
<entry><parameter>dvp</parameter>的策略标记</entry>
@@ -6169,21 +6169,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权在给定的目录 vnode 上执行
<function>readdir</function> 操作。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个错误编码 <varname>errno</varname>。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-readlink">
<title><function>&mac.mpo;_check_vnode_readlink</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_readlink</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6192,22 +6192,22 @@
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
@@ -6215,22 +6215,22 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权在给定符号链接 vnode 上执行
<function>readlink</function> 操作。成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够。
该函数可能在若干环境下被调用,包括由用户进程显式执行的 <function>readlink</function> 调用,
或者是在进程执行名字查询时隐式执行的 <function>readlink</function> 。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-revoke">
<title><function>&mac.mpo;_check_vnode_revoke</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_revoke</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6239,22 +6239,22 @@
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
@@ -6262,20 +6262,20 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权撤销对给定 vnode 的访问。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-setacl">
<title><function>&mac.mpo;_check_vnode_setacl</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_setacl</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6288,32 +6288,32 @@
*<parameter>acl</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>type</parameter></entry>
<entry>ACL 类型</entry>
</row>
-
+
<row>
<entry><parameter>acl</parameter></entry>
<entry>ACL</entry>
@@ -6321,20 +6321,20 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权设置给定 vnode 的给定类型的 ACL。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-setextattr">
<title><function>&mac.mpo;_check_vnode_setextattr</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_setextattr</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6349,37 +6349,37 @@
*<parameter>uio</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>attrnamespace</parameter></entry>
<entry>扩展属性名字空间</entry>
</row>
-
+
<row>
<entry><parameter>name</parameter></entry>
<entry>扩展属性名</entry>
</row>
-
+
<row>
<entry><parameter>uio</parameter></entry>
<entry>I/O 结构指针;参见 &man.uio.9;</entry>
@@ -6387,7 +6387,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权设置给定 vnode 上给定名字空间中给定名字的扩展属性的值。
使用扩展属性备份安全标记的策略模块可能需要对其使用的属性实施额外的保护。另外,
由于在检查和实际操作时间可能存在的竞争,
@@ -6396,15 +6396,15 @@
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-setflags">
<title><function>&mac.mpo;_check_vnode_setflags</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_setflags</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6414,27 +6414,27 @@
<paramdef>u_long <parameter>flags</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>flags</parameter></entry>
<entry>文件标志;参见 &man.chflags.2;</entry>
@@ -6442,21 +6442,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权为给定的 vnode 设置给定的标志。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-setmode">
<title><function>&mac.mpo;_check_vnode_setmode</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_setmode</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6466,27 +6466,27 @@
<paramdef>mode_t <parameter>mode</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>mode</parameter></entry>
<entry>文件模式;参见 &man.chmod.2;</entry>
@@ -6494,21 +6494,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权将给定 vnode 的模式设置为给定值。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-setowner">
<title><function>&mac.mpo;_check_vnode_setowner</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_setowner</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6519,32 +6519,32 @@
<paramdef>gid_t <parameter>gid</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>uid</parameter></entry>
<entry>用户ID</entry>
</row>
-
+
<row>
<entry><parameter>gid</parameter></entry>
<entry>组ID</entry>
@@ -6552,22 +6552,22 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权将给定 vnode 的文件 uid 和文件 gid 设置为给定值。如果无需更新,
相关参数值可能被设置为(<literal>-1</literal>)。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-setutimes">
<title><function>&mac.mpo;_check_vnode_setutimes</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_setutimes</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter></parameter>cred</paramdef>
<paramdef>struct vnode
@@ -6580,32 +6580,32 @@
<parameter></parameter>mtime</paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vp</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>atime</parameter></entry>
<entry>访问时间;参见 &man.utimes.2;</entry>
</row>
-
+
<row>
<entry><parameter>mtime</parameter></entry>
<entry>修改时间;参见 &man.utimes.2;</entry>
@@ -6613,38 +6613,38 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权将给定 vnode 的访问时间标签设置为给定值。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-proc-sched">
<title><function>&mac.mpo;_check_proc_sched</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_proc_sched</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>ucred</parameter></paramdef>
<paramdef>struct proc
*<parameter>proc</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>proc</parameter></entry>
<entry>客体;进程</entry>
@@ -6652,24 +6652,24 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权改变给定进程的调度参数。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够;
<errorcode>ESRCH</errorcode>,用于提供不可见性质。</para>
-
+
<para>See &man.setpriority.2; for more information.</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-proc-signal">
<title><function>&mac.mpo;_check_proc_signal</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_proc_signal</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct proc
@@ -6677,22 +6677,22 @@
<paramdef>int <parameter>signal</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>proc</parameter></entry>
<entry>客体;进程</entry>
</row>
-
+
<row>
<entry><parameter>signal</parameter></entry>
<entry>信号;参见 &man.kill.2;</entry>
@@ -6700,22 +6700,22 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权向给定进程发送给定信号。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,
用于标记不匹配;<errorcode>EPERM</errorcode>,用于权限不够;
<errorcode>ESRCH</errorcode>,用于提供不可见性质。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-vnode-stat">
<title><function>&mac.mpo;_check_vnode_stat</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_vnode_stat</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct vnode
@@ -6724,22 +6724,22 @@
*<parameter>label</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>vp</parameter></entry>
<entry>客体;vnode</entry>
</row>
-
+
<row>
<entry><parameter>label</parameter></entry>
<entry><parameter>vp</parameter>的策略标记</entry>
@@ -6747,23 +6747,23 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状是否有权在给定 vnode 上执行 <function>stat</function> 操作。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
-
+
<para>See &man.stat.2; for more information.</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-ifnet-transmit">
<title><function>&mac.mpo;_check_ifnet_transmit</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_ifnet_transmit</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct ifnet
@@ -6776,32 +6776,32 @@
*<parameter>mbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>客体;将被发送的 mbuf </entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry><parameter>mbuf</parameter>的策略标记</entry>
@@ -6809,21 +6809,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关网络接口是否有权传送给定的 mbuf。成功,则返回 <returnvalue>0</returnvalue>;
否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-cred-check-socket-deliver">
<title><function>&mac.mpo;_check_socket_deliver</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_deliver</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct ifnet
@@ -6836,32 +6836,32 @@
*<parameter>mbuflabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
</row>
-
+
<row>
<entry><parameter>ifnet</parameter></entry>
<entry>网络接口</entry>
</row>
-
+
<row>
<entry><parameter>ifnetlabel</parameter></entry>
<entry><parameter>ifnet</parameter>的策略标记</entry>
</row>
-
+
<row>
<entry><parameter>mbuf</parameter></entry>
<entry>客体;将被传送的 mbuf </entry>
</row>
-
+
<row>
<entry><parameter>mbuflabel</parameter></entry>
<entry><parameter>mbuf</parameter>的策略标记</entry>
@@ -6869,21 +6869,21 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关套接字是否有权从给定的 mbuf 中接收数据报。
成功,则返回 <returnvalue>0</returnvalue>;否则,返回一个<varname>errno</varname>值。
建议使用的错误编码:<errorcode>EACCES</errorcode>,用于标记不匹配;
<errorcode>EPERM</errorcode>,用于权限不够。</para>
</sect3>
-
+
<sect3 id="mac-mpo-check-socket-visible">
<title><function>&mac.mpo;_check_socket_visible</function></title>
-
+
<funcsynopsis>
<funcprototype>
<funcdef>int
<function>&mac.mpo;_check_socket_visible</function></funcdef>
-
+
<paramdef>struct ucred
*<parameter>cred</parameter></paramdef>
<paramdef>struct socket
@@ -6892,23 +6892,23 @@
*<parameter>socketlabel</parameter></paramdef>
</funcprototype>
</funcsynopsis>
-
+
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
&mac.thead;
-
+
<tbody>
<row>
<entry><parameter>cred</parameter></entry>
<entry>主体信任状</entry>
<entry>不可改变</entry>
</row>
-
+
<row>
<entry><parameter>so</parameter></entry>
<entry>客体;套接字</entry>
</row>
-
+
<row>
<entry><parameter>socketlabel</parameter></entry>
<entry><parameter>so</parameter>的策略标记</entry>
@@ -6916,7 +6916,7 @@
</tbody>
</tgroup>
</informaltable>
-
+
<para>确定相关主体信任状cred 是否有权使用系统监控函数,比如,
由&man.netstat.8; 和 &man.sockstat.1;使用的程序来观察
给定的套接字(<parameter>socket</parameter>)。成功,
@@ -7174,20 +7174,20 @@
<para>确定相关主体是否应该被允许执行指定的 &man.sysctl.3; 事务。</para>
</sect3>
</sect2>
-
+
<sect2 id="mac-label-management">
<title>标记管理调用</title>
-
+
<para>当用户进程请求对某个对象的标记进行修改时,将引发重新标记事件。对应的更新操作分两步进行:
首先,进行访问控制检查,确认此次更新操作是有效且被允许的;然后,调用另一个独立的入口函数对标记进行修改。
重新标记入口函数通常接收由请求进程提交的对象、对象标记指针和请求新标记,作为输入参数。
- 对象重新标记操作的失败将由先期的标记检查报告,所以,不允许在接下来的标记修改过程中报告失败,故而不提倡在此过程中新分配内存。</para>
+ 对象重新标记操作的失败将由先期的标记检查报告,所以,不允许在接下来的标记修改过程中报告失败,故而不提倡在此过程中新分配内存。</para>
</sect2>
</sect1>
-
+
<sect1 id="mac-userland-arch">
<title>应用层体系结构</title>
-
+
<para>TrustedBSD MAC 框架包含了一组策略无关的组成元素,包括管理抽象标记的 MAC 接口库,
对系统信任状管理体系的修改, 为用户分配 MAC 标记提供支持的 login 库函数,
以及若干负责维护和更新内核对象(进程、文件和网络接口等)安全标记的工具。
@@ -7238,7 +7238,7 @@
<sect1 id="mac-conclusion">
<title>小结</title>
-
+
<para>TrustedBSD MAC 框架使得内核模块能以一种集中的方式,完善系统的安全策略。
它们既可利用现有的内核对象属性,又能使用由 MAC 框架协助维护的安全标记数据,来实施访问控制。
框架提供的灵活性使得开发人员可以在其上实现各种策略,如利用 BSD 现有的信任状(credential)
diff --git a/zh_CN.GB2312/books/arch-handbook/newbus/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/newbus/chapter.sgml
index c233784a14..c543cf7fa5 100644
--- a/zh_CN.GB2312/books/arch-handbook/newbus/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/newbus/chapter.sgml
@@ -2,7 +2,7 @@
<!--
The FreeBSD Documentation Project
The FreeBSD Simplified Chinese Project
-
+
Original Revision: 1.10
$FreeBSD$
@@ -10,19 +10,19 @@
Date: newbus-draft.txt,v 1.8 2001/01/25 08:01:08
Copyright (c) 2000 Jeroen Ruigrok van der Warven (asmodai@wxs.nl)
Copyright (c) 2002 Hiten Mahesh Pandya (hiten@uk.FreeBSD.org)
-
+
Future Additions:
-
+
o Expand the information about device_t
o Add information about the bus_* functions.
o Add information about bus specific (e.g. PCI) functions.
o Add a reference section for additional information.
o Add more newbus related structures and typedefs.
o Add a 'Terminology' section.
- o Add information on resource manager functions, busspace
+ o Add information on resource manager functions, busspace
manager functions, newbus events related functions.
o More cleanup ... !
-
+
Provided under the FreeBSD Documentation License.
-->
<chapter id="newbus">
@@ -68,19 +68,19 @@
之间定义的接口。
</para>
</sect2>
-
+
<sect2>
<title>设备驱动程序的类型</title>
<para>在&unix;那个时代,FreeBSD也从中延续而来,定义了四种类型的
设备:</para>
-
+
<itemizedlist>
<listitem><para>块设备驱动程序</para></listitem>
<listitem><para>字符设备驱动程序</para></listitem>
<listitem><para>网络设备驱动程序</para></listitem>
<listitem><para>伪设备驱动程序</para></listitem>
</itemizedlist>
-
+
<indexterm><primary>block devices(块设备)</primary></indexterm>
<para><emphasis>块设备</emphasis>以使用固定大小的[数据]块的方式运行。
@@ -90,7 +90,7 @@
(write-behind),这意味着数据在内存中被修改后,当系统进行其周期性
磁盘刷新时才会被同步到磁盘,从而优化写操作。</para>
</sect2>
-
+
<sect2>
<title>字符设备</title>
@@ -100,7 +100,7 @@
块设备和字符设备的区别变得不存在了。</para>
</sect2>
</sect1>
-
+
<sect1 id="newbus-overview">
<!--
Real title:
@@ -115,118 +115,118 @@
代码树中。直到4.0它才成为设备驱动程序使用的默认系统。其目的是为主机
系统提供给<emphasis>操作系统</emphasis>的各种总线和设备的互连提供更加
面向对象的方法。</para>
-
+
<para>其主要特性包括:</para>
-
+
<itemizedlist>
<listitem><para>动态连接</para></listitem>
<listitem><para>驱动程序容易模块化</para></listitem>
<listitem><para>伪总线</para></listitem>
</itemizedlist>
-
+
<para>最显著的改变之一是从平面和特殊系统演变为设备树布局。</para>
-
+
<para>顶层驻留的是<emphasis><quote>根</quote></emphasis>设备,它作为
父设备,所有其他设备挂接在它上面。对于每个结构,通常<quote>根</quote>
只有单个孩子,其上连接着诸如<emphasis>host-to-PCI桥</emphasis>
等东西。对于x86,这种<quote>根</quote>设备为
<emphasis><quote>nexus</quote></emphasis>设备,对于Alpha,Alpha的各种
- 不同型号有不同的顶层设备,对应不同的硬件芯片组,包括
+ 不同型号有不同的顶层设备,对应不同的硬件芯片组,包括
<emphasis>lca</emphasis>,<emphasis>apecs</emphasis>,
<emphasis>cia</emphasis>和<emphasis>tsunami</emphasis>。</para>
-
+
<para>Newbus上下文中的设备表示系统中的单个硬件实体。例如,每个PCI设备被
表示为一个Newbus设备。系统中的任何设备可以有孩子;有孩子的设备通常被
称为<emphasis><quote>bus</quote></emphasis>。系统中常用总线的例子就是
ISA和PCI,他们各自管理连接到ISA和PCI总线上的设备列表。</para>
-
+
<para>通常,不同类型的总线之间的连接被表示为
<emphasis><quote>桥</quote></emphasis>设备,它的孩子就是它所连接的
总线。一个例子就是<emphasis>PCI-to-PCI桥</emphasis>,它在父PCI总线上被
- 表示为<emphasis><devicename>pcibN</devicename></emphasis>,而用它的孩子
+ 表示为<emphasis><devicename>pcibN</devicename></emphasis>,而用它的孩子
<emphasis><devicename>pciN</devicename></emphasis>表示连接在它上面的
总线。这种布局简化了PCI总线树的实现,允许公共代码同时用于顶层和桥接的
总线。</para>
-
+
<para>Newbus结构中的每个设备请求它的父设备来为其映射资源。父设备接着请求
它的父设备,直到到达nexus。因此,基本上nexus是Newbus系统中唯一知道所有
资源的部分。</para>
-
+
<tip><para>ISA设备可能想在<literal>0x230</literal>映射其IO端口,因此它向其
父设备请求,这种情况下是ISA总线。ISA总线将它交给PCI-to-ISA桥,PCI-to-ISA
桥接着请求PCI总线,PCI总线到达host-to-PCI桥,最后到达nexus。这种向上
- 过渡的优美之处在于可以有空间来变换请求。对<literal>0x230</literal>IO端口
+ 过渡的优美之处在于可以有空间来变换请求。对<literal>0x230</literal>IO端口
的请求在<acronym>MIPS</acronym>机器上可以被PCI桥变成
<literal>0xb0000230</literal>处的内存映射。</para></tip>
-
+
<para>资源分配可以在设备树的任何地方加以控制。例如,在很多Alpha平台上,
ISA中断与PCI中断是单独管理的,对ISA中断的资源分配是由Alpha的ISA总线设备
管理的。在IA-32上,ISA和PCI中断都由顶层的nexus设备管理。对于两种移植,
内存和端口地址空间由单个实体管理 - 在IA-32上是nexus,在Alpha(例如,CIA
或tsunami)上是相关的芯片组驱动程序。</para>
-
+
<para>为了规范化对内存和端口映射资源的访问,Newbus整合了NetBSD的
<literal>bus_space</literal> API。他们提供了单一的API来代替inb/outb
和直接内存读写。这样做的优势在于单个驱动程序就可以使用内存映射寄存器
或端口映射寄存器(有些硬件支持两者)。</para>
-
+
<para>这种支持被合并到了资源分配机制中。分配资源时,驱动程序可以从资源
中检取关联的<structfield>bus_space_tag_t</structfield>和
<structfield>bus_space_handle_t</structfield>。</para>
-
+
<para>Newbus也允许在专用于此目的的文件中定义接口方法。这些是
<filename>.m</filename>文件,可以在<filename>src/sys</filename>
目录树中找到。</para>
-
- <para>Newbus系统的核心是可扩展的<quote>基于对象编程(object-based
+
+ <para>Newbus系统的核心是可扩展的<quote>基于对象编程(object-based
programming)</quote>的模型。系统中的每个设备具有它所支持的一个方法表。
系统和其他设备使用这些方法来控制设备并请求服务。设备所支持的不同方法
被定义为多个<quote>接口</quote>。<quote>接口</quote>只是
设备实现的一组相关的方法。</para>
-
+
<para>在Newbus系统中,设备方法是通过系统中的各种设备驱动程序提供的。当
<emphasis>自动配置(auto-configuration)</emphasis>期间设备被连接(attach)
到驱动程序,它使用驱动程序声明的方法表。以后设备可以从其驱动程序
<emphasis>分离(detach)</emphasis>,并
<emphasis>重新连接(re-attach)</emphasis>到具有新方法表的新驱动程序。这就
允许驱动程序的动态替换,而动态替换对于驱动程序的开发非常有用。</para>
-
+
<para>接口通过与文件系统中用于定义vnode操作的语言相似的接口定义语言来
描述。接口被保存在方法文件中(通常命名为<filename>foo_if.m</filename>)。
</para>
-
+
<example>
<title>Newbus的方法</title>
<programlisting>
# Foo 子系统/驱动程序(注释...)
-
+
INTERFACE foo
METHOD int doit {
device_t dev;
};
-
+
# 如果没有通过DEVMETHOD()提供一个方法,则DEFAULT为将会被使用的方法
-
+
METHOD void doit_to_child {
device_t dev;
driver_t child;
} DEFAULT doit_generic_to_child;
</programlisting>
</example>
-
+
<para>当接口被编译后,它产生一个头文件
<quote><filename>foo_if.h</filename></quote>,其中包含函数声明:</para>
-
+
<programlisting>
int FOO_DOIT(device_t dev);
int FOO_DOIT_TO_CHILD(device_t dev, device_t child);
</programlisting>
-
+
<para>伴随自动产生的头文件,也会创建一个源文件
<quote><filename>foo_if.c</filename></quote>;其中包含一些函数的实现,
这些函数用于在对象方法表中查找相关函数的位置并调用那个函数。</para>
-
+
<para>系统定义了两个主要接口。第一个基本接口被称为
<emphasis><quote>设备(device)</quote></emphasis>,并包括与所有设备相关
的方法。<emphasis><quote>设备(device)</quote></emphasis>接口中的方法
@@ -237,10 +237,10 @@
<emphasis><quote>挂起(suspend)</quote></emphasis>和
<emphasis><quote>恢复(resume)</quote></emphasis>,他们用于关键事件通知。
</para>
-
+
<para>另一个,更加复杂接口是<emphasis><quote>bus</quote></emphasis>。
此接口包含的方法适用于带有孩子的设备,包括访问总线特定的每设备信息
- <footnote><para>&man.bus.generic.read.ivar.9; and
+ <footnote><para>&man.bus.generic.read.ivar.9; and
&man.bus.generic.write.ivar.9;</para></footnote>,事件通知
(<emphasis><literal>child_detached</literal></emphasis>,
<emphasis><literal>driver_added</literal></emphasis>)和响应管理
@@ -248,7 +248,7 @@
<emphasis><literal>activate_resource</literal></emphasis>,
<emphasis><literal>deactivate_resource</literal></emphasis>,
<emphasis><literal>release_resource</literal></emphasis>)。</para>
-
+
<para><quote>bus</quote>接口中的很多方法为总线设备的某些孩子执行服务。
这些方法通常使用前两个参量指定提供服务的总线和请求服务的子设备。为了
简化设备驱动程序代码,这些方法中的很多都有访问者(accessor)函数,访问者
@@ -256,57 +256,57 @@
<literal>BUS_TEARDOWN_INTR(device_t dev, device_t child, ...)</literal>
可以使用函数
<literal>bus_teardown_intr(device_t child, ...)</literal>来调用。</para>
-
+
<para>系统中的某些总线类型提供了额外接口以提供对总线特定功能的访问。
例如,PCI总线驱动程序定义了<quote>pci</quote>接口,此接口有两个方法
<emphasis><literal>read_config</literal></emphasis>和
<emphasis><literal>write_config</literal></emphasis>,用于访问PCI设备
的配置寄存器。</para>
</sect1>
-
+
<sect1 id="newbus-api">
<title>Newbus API</title>
<para>由于Newbus API非常庞大,本节努力将它文档化。本文档的下一版本会
带来更多信息。</para>
-
+
<sect2>
<title>源代码目录树中的重要位置</title>
-
+
<para><filename>src/sys/[arch]/[arch]</filename> - 特定机器结构的
- 内核代码位于这个目录。例如<literal>i386</literal>结构或
+ 内核代码位于这个目录。例如<literal>i386</literal>结构或
<literal>SPARC64</literal>结构。</para>
-
+
<para><filename>src/sys/dev/[bus]</filename> - 支持特定
<literal>[bus]</literal>的设备位于这个目录。</para>
-
+
<para><filename>src/sys/dev/pci</filename> - PCI总线支持代码位于
这个目录。</para>
-
+
<para><filename>src/sys/[isa|pci]</filename> - PCI/ISA设备驱动程序
位于这个目录。FreeBSD<literal>4.0</literal>版本中,PCI/ISA支持代码
过去存在于这个目录中。</para>
</sect2>
-
+
<sect2>
<title>重要结构和类型定义</title>
<para><literal>devclass_t</literal> - 这是指向
<literal>struct devclass</literal>的指针的类型定义。</para>
-
+
<para><literal>device_method_t</literal> - 与
- <literal>kobj_method_t</literal>相同(参看
+ <literal>kobj_method_t</literal>相同(参看
<filename>src/sys/kobj.h</filename>)。</para>
-
+
<para><literal>device_t</literal> - 这是指向
<literal>struct device</literal>的指针的类型定义。
<literal>device_t</literal> 表示系统中的设备。它是内核对象。
实现细节参看<filename>src/sys/sys/bus_private.h</filename>。</para>
-
+
<para><literal>driver_t</literal> - 这是一个类型定义,它引用
<literal>struct driver</literal>。
<literal>driver</literal>结构是一类
<literal>device(设备)</literal>内核对象;它也保存着驱动程序的私有数据。
</para>
-
+
<figure>
<title><emphasis>driver_t</emphasis>实现</title>
<programlisting>
@@ -316,11 +316,11 @@
};
</programlisting>
</figure>
-
+
<para><literal>device_state_t</literal>是一个枚举类型,即
<literal>device_state</literal>。它包含Newbus设备在自动配置前后
可能的状态。</para>
-
+
<figure>
<title>设备状态<emphasis>device_state_t</emphasis></title>
<programlisting>
diff --git a/zh_CN.GB2312/books/arch-handbook/pccard/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/pccard/chapter.sgml
index 8b4732012a..92f411da9c 100644
--- a/zh_CN.GB2312/books/arch-handbook/pccard/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/pccard/chapter.sgml
@@ -70,7 +70,7 @@
<para>最后,某些非常低端的设备根本不包含制造商标识。这些设备需要使用
可读CIS字符串来匹配它们。如果我们不需要这种应急办法该有多好,但对于
某些非常低端却非常流行的CD-ROM播放器来说却是必需的。通常应当避免
- 使用这种方法,但本节中还是列出了很多设备,因为它们是在认识到PC
+ 使用这种方法,但本节中还是列出了很多设备,因为它们是在认识到PC
Card商业的<acronym>OEM</acronym>本质之前加入的,应当优先使用
数字方法。</para>
diff --git a/zh_CN.GB2312/books/arch-handbook/scsi/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/scsi/chapter.sgml
index e054dbf61d..75542a19e2 100644
--- a/zh_CN.GB2312/books/arch-handbook/scsi/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/scsi/chapter.sgml
@@ -42,11 +42,11 @@
<itemizedlist>
- <listitem><para>ncr (<filename>/sys/pci/ncr.c</filename>)
+ <listitem><para>ncr (<filename>/sys/pci/ncr.c</filename>)
由Wolfgang Stanglmeier and Stefan Esser编写</para></listitem>
<listitem><para>sym (<filename>/sys/dev/sym/sym_hipd.c</filename>)
- 由Gerard Roudier编写</para></listitem>
+ 由Gerard Roudier编写</para></listitem>
<listitem><para>aic7xxx
(<filename>/sys/dev/aic7xxx/aic7xxx.c</filename>)
@@ -134,7 +134,7 @@
<programlisting> struct cam_sim *sim;
if(( sim = cam_sim_alloc(action_func, poll_func, driver_name,
- softc, unit, max_dev_transactions,
+ softc, unit, max_dev_transactions,
max_tagged_dev_transactions, devq) )==NULL) {
cam_simq_free(devq);
error; /* 一些错误处理代码 */
@@ -149,7 +149,7 @@
<structname>cam_sim</structname> 结构。</para>
<para>一个有趣的问题是,如果SCSI卡有不只一条SCSI总线我们该怎么做,
- 每个卡需要一个<structname>devq</structname>结构还是每条SCSI总线?
+ 每个卡需要一个<structname>devq</structname>结构还是每条SCSI总线?
在CAM代码的注释中给出的答案是:任一方式均可,由驱动程序的作者
选择。</para>
@@ -323,16 +323,16 @@
<listitem><para><function>cam_sim_path(sim)</function> - 路径ID
(参见上面)</para></listitem>
- <listitem><para><function>cam_sim_name(sim)</function> -
+ <listitem><para><function>cam_sim_name(sim)</function> -
sim的名字</para></listitem>
- <listitem><para><function>cam_sim_softc(sim)</function> -
+ <listitem><para><function>cam_sim_softc(sim)</function> -
指向softc(驱动程序私有数据)结构的指针</para></listitem>
- <listitem><para><function> cam_sim_unit(sim)</function> -
+ <listitem><para><function> cam_sim_unit(sim)</function> -
单元号</para></listitem>
- <listitem><para><function> cam_sim_bus(sim)</function> -
+ <listitem><para><function> cam_sim_bus(sim)</function> -
总线ID</para></listitem>
</itemizedlist>
@@ -424,7 +424,7 @@
<listitem><para><emphasis>target_lun</emphasis> - 目标设备的LUN ID
</para></listitem>
- <listitem><para><emphasis>timeout</emphasis> -
+ <listitem><para><emphasis>timeout</emphasis> -
这个命令的超时间隔,以毫秒计</para></listitem>
<listitem><para><emphasis>timeout_ch</emphasis> - 一个为SIM驱动
@@ -434,7 +434,7 @@
<listitem><para><emphasis>flags</emphasis> - 有关请求的各个
信息位</para></listitem>
- <listitem><para><emphasis>spriv_ptr0,spriv_ptr1</emphasis> -
+ <listitem><para><emphasis>spriv_ptr0,spriv_ptr1</emphasis> -
SIM驱动程序保留私用的字段
(例如链接到SIM队列或SIM私有控制块);实际上,它们作为联合存在:
spriv_ptr0和spriv_ptr1具有类型(void *),spriv_field0和
@@ -459,45 +459,45 @@
它们是:</para>
<itemizedlist>
- <listitem><para><emphasis>cdb_io</emphasis> -
+ <listitem><para><emphasis>cdb_io</emphasis> -
指向SCSI命令缓冲区的指针或缓冲区本身</para></listitem>
- <listitem><para><emphasis>cdb_len</emphasis> -
+ <listitem><para><emphasis>cdb_len</emphasis> -
SCSI命令长度</para></listitem>
- <listitem><para><emphasis>data_ptr</emphasis> -
+ <listitem><para><emphasis>data_ptr</emphasis> -
指向数据缓冲区的指针(如果使用分散/集中会复杂一点)
</para></listitem>
- <listitem><para><emphasis>dxfer_len</emphasis> -
+ <listitem><para><emphasis>dxfer_len</emphasis> -
待传输数据的长度</para></listitem>
- <listitem><para><emphasis>sglist_cnt</emphasis> -
+ <listitem><para><emphasis>sglist_cnt</emphasis> -
分散/集中段的计数</para></listitem>
- <listitem><para><emphasis>scsi_status</emphasis> -
+ <listitem><para><emphasis>scsi_status</emphasis> -
返回SCSI状态的地方</para></listitem>
- <listitem><para><emphasis>sense_data</emphasis> -
+ <listitem><para><emphasis>sense_data</emphasis> -
命令返回错误时保存SCSI sense信息的缓冲区(这种情况下,如果没有
设置CCB的旗标CAM_DIS_AUTOSENSE,则假定SIM驱动程序会自动运行
REQUEST SENSE命令)
</para></listitem>
- <listitem><para><emphasis>sense_len</emphasis> -
+ <listitem><para><emphasis>sense_len</emphasis> -
缓冲区的长度(如果碰巧大于sense_data的大小,SIM驱动程序必须
悄悄地采用较小值)(译注:一点改动,参考原文及代码)
</para></listitem>
- <listitem><para><emphasis>resid, sense_resid</emphasis> -
+ <listitem><para><emphasis>resid, sense_resid</emphasis> -
如果数据传输或SCSI sense返回错误,则它们
就是返回的剩余(未传输)数据的计数。它们看起来并不是特别有意义,
因此当很难计算的情况下(例如,计数SCSI控制器FIFO缓冲区中的字节
数),使用近似值也同样可以。对于成功完成的传输,它们必须被设置
为0。</para></listitem>
- <listitem><para><emphasis>tag_action</emphasis> -
+ <listitem><para><emphasis>tag_action</emphasis> -
使用的标签的种类有:
-
+
<itemizedlist>
<listitem><para>CAM_TAG_ACTION_NONE - 事务不使用标签
</para></listitem>
@@ -625,10 +625,10 @@
单个非分散虚拟缓冲区的情况,CAM中这种情况用得很多。</para>
<programlisting> int rv;
-
+
initialize_hcb_for_data(hcb);
- if((!(ccb_h-&gt;flags &amp; CAM_SCATTER_VALID)) {
+ if((!(ccb_h-&gt;flags &amp; CAM_SCATTER_VALID)) {
/* 单个缓冲区 */
if(!(ccb_h-&gt;flags &amp; CAM_DATA_PHYS)) {
rv = add_virtual_chunk(hcb, csio-&gt;data_ptr, csio-&gt;dxfer_len, dir);
@@ -647,7 +647,7 @@
} else if (!(ccb_h-&gt;flags &amp; CAM_DATA_PHYS)) {
/* SG缓冲区指针是虚拟的 */
for (i = 0; i &lt; csio-&gt;sglist_cnt; i++) {
- rv = add_virtual_chunk(hcb, segs[i].ds_addr,
+ rv = add_virtual_chunk(hcb, segs[i].ds_addr,
segs[i].ds_len, dir);
if (rv != CAM_REQ_CMP)
break;
@@ -655,7 +655,7 @@
} else {
/* SG缓冲区指针是物理的 */
for (i = 0; i &lt; csio-&gt;sglist_cnt; i++) {
- rv = add_physical_chunk(hcb, segs[i].ds_addr,
+ rv = add_physical_chunk(hcb, segs[i].ds_addr,
segs[i].ds_len, dir);
if (rv != CAM_REQ_CMP)
break;
@@ -685,7 +685,7 @@
<para>剩下的唯一事情是设置超时,将我们的hcb传递给硬件并返回,余下的
由中断处理函数(或超时处理函数)完成。</para>
-<programlisting> ccb_h-&gt;timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,
+<programlisting> ccb_h-&gt;timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,
(ccb_h-&gt;timeout * hz) / 1000); /* 将毫秒转换为滴答数 */
put_hcb_into_hardware_queue(hcb);
return;</programlisting>
@@ -707,7 +707,7 @@
}
free_hcb(hcb); /* 同时从任何内部列表中移除hcb */
}
- ccb-&gt;ccb_h.status = status |
+ ccb-&gt;ccb_h.status = status |
(ccb-&gt;ccb_h.status &amp; ~(CAM_STATUS_MASK|CAM_SIM_QUEUED));
xpt_done(ccb);
}</programlisting>
@@ -727,7 +727,7 @@
或者清除可能被延迟,因为不管怎样目标将会在下一次事务时请求重新协商。
</para></listitem>
- <listitem><para><emphasis>XPT_RESET_BUS</emphasis> -
+ <listitem><para><emphasis>XPT_RESET_BUS</emphasis> -
发送RESET信号到SCSI总线</para>
<para>CCB中并不传递参量,唯一感兴趣的参量是由指向结构sim的指针标识
@@ -774,7 +774,7 @@
xpt_free_path(path);
}
- for(lun=0; lun &lt;= OUR_MAX_SUPPORTED_LUN; lun++)
+ for(lun=0; lun &lt;= OUR_MAX_SUPPORTED_LUN; lun++)
for(h = softc-&gt;first_discon_hcb[targ][lun]; h != NULL; h = hh) {
hh=h-&gt;next;
free_hcb_and_ccb_done(h, h-&gt;ccb, CAM_SCSI_BUS_RESET);
@@ -834,7 +834,7 @@
if(hcb == NULL) {
/* 我们的队列中没有这样的CCB */
- ccb-&gt;ccb_h.status = CAM_PATH_INVALID;
+ ccb-&gt;ccb_h.status = CAM_PATH_INVALID;
xpt_done(ccb);
return;
}
@@ -876,14 +876,14 @@
<programlisting> case HCB_BEING_TRANSFERRED:
untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb-&gt;ccb_h.timeout_ch);
- abort_ccb-&gt;ccb_h.timeout_ch =
+ abort_ccb-&gt;ccb_h.timeout_ch =
timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
abort_ccb-&gt;ccb_h.status = CAM_REQ_ABORTED;
/* 要求控制器中止CCB,然后产生一个中断并停止
*/
if(signal_hardware_to_abort_hcb_and_stop(hcb) &lt; 0) {
/* 哎呀,我们没有获得与硬件的竞争条件,在我们中止
- * 这个事务之前它就脱离总线,再尝试一次
+ * 这个事务之前它就脱离总线,再尝试一次
* (译注:脱离=getoff)*/
goto abort_again;
}
@@ -895,7 +895,7 @@
<programlisting> case HCB_DISCONNECTED:
untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb-&gt;ccb_h.timeout_ch);
- abort_ccb-&gt;ccb_h.timeout_ch =
+ abort_ccb-&gt;ccb_h.timeout_ch =
timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
put_abort_message_into_hcb(hcb);
put_hcb_at_the_front_of_hardware_queue(hcb);
@@ -925,21 +925,21 @@
}
if(xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) &lt; 0)
/* no such CCB in our queue */
- ccb-&gt;ccb_h.status = CAM_PATH_INVALID;
+ ccb-&gt;ccb_h.status = CAM_PATH_INVALID;
else
ccb-&gt;ccb_h.status = CAM_REQ_CMP;
xpt_done(ccb);
return;</programlisting>
</listitem>
- <listitem><para><emphasis>XPT_SET_TRAN_SETTINGS</emphasis> -
+ <listitem><para><emphasis>XPT_SET_TRAN_SETTINGS</emphasis> -
显式设置SCSI传输设置的值</para>
- <para>在联合ccb的实例<quote>struct ccb_trans_setting cts</quote>
+ <para>在联合ccb的实例<quote>struct ccb_trans_setting cts</quote>
中传输的参量:</para>
<itemizedlist>
- <listitem><para><emphasis>valid</emphasis> -
+ <listitem><para><emphasis>valid</emphasis> -
位掩码,显示应当更新那些设置:</para></listitem>
<listitem><para><emphasis>CCB_TRANS_SYNC_RATE_VALID</emphasis>
@@ -952,15 +952,15 @@
- 总线宽度</para></listitem>
<listitem><para><emphasis>CCB_TRANS_DISC_VALID</emphasis> -
- 设置启用/禁用断开连接</para></listitem>
+ 设置启用/禁用断开连接</para></listitem>
- <listitem><para><emphasis>CCB_TRANS_TQ_VALID</emphasis> -
- 设置启用/禁用带标签的排队</para></listitem>
+ <listitem><para><emphasis>CCB_TRANS_TQ_VALID</emphasis> -
+ 设置启用/禁用带标签的排队</para></listitem>
- <listitem><para><emphasis>flags</emphasis> -
+ <listitem><para><emphasis>flags</emphasis> -
由两部分组成,两元参量和子操作标识。两元参量为:</para>
<itemizedlist>
- <listitem><para><emphasis>CCB_TRANS_DISC_ENB</emphasis> -
+ <listitem><para><emphasis>CCB_TRANS_DISC_ENB</emphasis> -
启用断开连接</para></listitem>
<listitem><para><emphasis>CCB_TRANS_TAG_ENB</emphasis> -
启用带标签的排队</para></listitem>
@@ -974,16 +974,16 @@
<listitem><para><emphasis>CCB_TRANS_USER_SETTINGS</emphasis>
- 记住希望的用户值 </para></listitem>
-
+
<listitem><para><emphasis>sync_period, sync_offset</emphasis> -
自解释的,如果sync_offset==0则请求同步模式
</para></listitem>
- <listitem><para><emphasis>bus_width</emphasis> -
+ <listitem><para><emphasis>bus_width</emphasis> -
总线带宽,以位计(而不是字节)
<tip><title>译注</title><para>参考原文和源码</para></tip>
</para></listitem>
-
+
</itemizedlist>
</listitem>
@@ -1015,7 +1015,7 @@
<listitem><para><emphasis>current</emphasis> - 实际生效的那些
</para></listitem>
- <listitem><para><emphasis>goal</emphasis> -
+ <listitem><para><emphasis>goal</emphasis> -
通过设置<quote>current</quote>参数所请求的那些</para></listitem>
</itemizedlist>
@@ -1048,10 +1048,10 @@
}
if(flags &amp; CCB_TRANS_CURRENT_SETTINGS) {
if(flags &amp; CCB_TRANS_SYNC_RATE_VALID)
- softc-&gt;goal_sync_period[targ] =
+ softc-&gt;goal_sync_period[targ] =
max(cts-&gt;sync_period, OUR_MIN_SUPPORTED_PERIOD);
if(flags &amp; CCB_TRANS_SYNC_OFFSET_VALID)
- softc-&gt;goal_sync_offset[targ] =
+ softc-&gt;goal_sync_offset[targ] =
min(cts-&gt;sync_offset, OUR_MAX_SUPPORTED_OFFSET);
if(flags &amp; CCB_TRANS_BUS_WIDTH_VALID)
softc-&gt;goal_bus_width[targ] = min(cts-&gt;bus_width, OUR_BUS_WIDTH);
@@ -1094,7 +1094,7 @@
(译注:原文可能有误,此处未改)
</para></listitem>
- <listitem><para><emphasis>XPT_GET_TRAN_SETTINGS</emphasis> -
+ <listitem><para><emphasis>XPT_GET_TRAN_SETTINGS</emphasis> -
获得SCSI传输设置的值</para>
<para>此操作为XPT_SET_TRAN_SETTINGS的逆操作。用通过旗标
@@ -1105,7 +1105,7 @@
<listitem>
<indexterm><primary>BIOS(基本输入输出系统, Basic Input Output System)</primary></indexterm>
- <para><emphasis>XPT_CALC_GEOMETRY</emphasis> -
+ <para><emphasis>XPT_CALC_GEOMETRY</emphasis> -
计算磁盘的逻辑(BIOS)结构(geometry)</para>
<para>参量在联合ccb的实例<quote>struct ccb_calc_geometry ccg</quote>
@@ -1113,19 +1113,19 @@
<itemizedlist>
- <listitem><para><emphasis>block_size</emphasis> -
+ <listitem><para><emphasis>block_size</emphasis> -
输入,以字节计的块大小(也称为扇区)</para></listitem>
- <listitem><para><emphasis>volume_size</emphasis> -
+ <listitem><para><emphasis>volume_size</emphasis> -
输入,以字节计的卷大小</para></listitem>
- <listitem><para><emphasis>cylinders</emphasis> -
+ <listitem><para><emphasis>cylinders</emphasis> -
输出,逻辑柱面</para></listitem>
- <listitem><para><emphasis>heads</emphasis> -
+ <listitem><para><emphasis>heads</emphasis> -
输出,逻辑磁头</para></listitem>
- <listitem><para><emphasis>secs_per_track</emphasis> -
+ <listitem><para><emphasis>secs_per_track</emphasis> -
输出,每磁道的逻辑扇区</para></listitem>
</itemizedlist>
@@ -1299,7 +1299,7 @@
<structname>xxx_softc</structname>的指针,ISA中断例程只是取设备号,
因此轮询例程一般看起来像:</para>
-<programlisting>static void
+<programlisting>static void
xxx_poll(struct cam_sim *sim)
{
xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */
@@ -1307,7 +1307,7 @@ xxx_poll(struct cam_sim *sim)
<para>or</para>
-<programlisting>static void
+<programlisting>static void
xxx_poll(struct cam_sim *sim)
{
xxx_intr(cam_sim_unit(sim)); /* for ISA device */
@@ -1380,7 +1380,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
用一个大的临界区保护它们。为了确保中断级别总是会被恢复,可以定义
一个包装函数,如:</para>
-<programlisting> static void
+<programlisting> static void
xxx_action(struct cam_sim *sim, union ccb *ccb)
{
int s;
@@ -1389,7 +1389,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
splx(s);
}
- static void
+ static void
xxx_action1(struct cam_sim *sim, union ccb *ccb)
{
... process the request ...
@@ -1444,7 +1444,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
xpt_free_path(path);
}
- for(lun=0; lun &lt;= OUR_MAX_SUPPORTED_LUN; lun++)
+ for(lun=0; lun &lt;= OUR_MAX_SUPPORTED_LUN; lun++)
for(h = softc-&gt;first_discon_hcb[targ][lun]; h != NULL; h = hh) {
hh=h-&gt;next;
if(fatal)
@@ -1462,9 +1462,9 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
* 初始化真的很快
*/
if(!fatal) {
- reinitialize_controller_without_scsi_reset(softc);
+ reinitialize_controller_without_scsi_reset(softc);
} else {
- reinitialize_controller_with_scsi_reset(softc);
+ reinitialize_controller_with_scsi_reset(softc);
}
schedule_next_hcb(softc);
return;
@@ -1521,7 +1521,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
calculate_residue(hcb);
if( (hcb-&gt;ccb-&gt;ccb_h.flags &amp; CAM_DIS_AUTOSENSE)==0
- &amp;&amp; ( scsi_status == CHECK_CONDITION
+ &amp;&amp; ( scsi_status == CHECK_CONDITION
|| scsi_status == COMMAND_TERMINATED) ) {
/* 启动auto-SENSE */
hcb-&gt;flags |= DOING_AUTOSENSE;
@@ -1546,7 +1546,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
/* 恢复到8-bit总线 */
softc-&gt;current_bus_width[targ] = softc-&gt;goal_bus_width[targ] = 8;
/* 报告事件 */
- neg.bus_width = 8;
+ neg.bus_width = 8;
neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
xpt_async(AC_TRANSFER_NEG, hcb-&gt;ccb.ccb_h.path_id, &amp;neg);
continue_current_hcb(softc);
@@ -1556,9 +1556,9 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
int wd;
wd = get_target_bus_width_request(softc);
- if(wd &lt;= softc-&gt;goal_bus_width[targ]) {
+ if(wd &lt;= softc-&gt;goal_bus_width[targ]) {
/* 可接受的回答 */
- softc-&gt;current_bus_width[targ] =
+ softc-&gt;current_bus_width[targ] =
softc-&gt;goal_bus_width[targ] = neg.bus_width = wd;
/* 报告事件 */
@@ -1580,7 +1580,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
if(wd != softc-&gt;current_bus_width[targ]) {
/* 总线宽度改变了 */
- softc-&gt;current_bus_width[targ] =
+ softc-&gt;current_bus_width[targ] =
softc-&gt;goal_bus_width[targ] = neg.bus_width = wd;
/* 报告事件 */
@@ -1607,10 +1607,10 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
<programlisting> case UNEXPECTED_DISCONNECT:
if(requested_abort(hcb)) {
- /* 中止影响目标和LUN上的所有命令,因此将那个目标和LUN上的
+ /* 中止影响目标和LUN上的所有命令,因此将那个目标和LUN上的
* 所有断开连接的HCB也标记为中止
*/
- for(h = softc-&gt;first_discon_hcb[hcb-&gt;target][hcb-&gt;lun];
+ for(h = softc-&gt;first_discon_hcb[hcb-&gt;target][hcb-&gt;lun];
h != NULL; h = hh) {
hh=h-&gt;next;
free_hcb_and_ccb_done(h, h-&gt;ccb, CAM_REQ_ABORTED);
@@ -1619,12 +1619,12 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
} else if(requested_bus_device_reset(hcb)) {
int lun;
- /* 复位影响那个目标上的所有命令,因此将那个目标和LUN上的
+ /* 复位影响那个目标上的所有命令,因此将那个目标和LUN上的
* 所有断开连接的HCB标记为复位
*/
- for(lun=0; lun &lt;= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc-&gt;first_discon_hcb[hcb-&gt;target][lun];
+ for(lun=0; lun &lt;= OUR_MAX_SUPPORTED_LUN; lun++)
+ for(h = softc-&gt;first_discon_hcb[hcb-&gt;target][lun];
h != NULL; h = hh) {
hh=h-&gt;next;
free_hcb_and_ccb_done(h, h-&gt;ccb, CAM_SCSI_BUS_RESET);
@@ -1634,10 +1634,10 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
xpt_async(AC_SENT_BDR, hcb-&gt;ccb-&gt;ccb_h.path_id, NULL);
/* 这是CAM_RESET_DEV请求本身,它完成了 */
- ccb_status = CAM_REQ_CMP;
+ ccb_status = CAM_REQ_CMP;
} else {
calculate_residue(hcb);
- ccb_status = CAM_UNEXP_BUSFREE;
+ ccb_status = CAM_UNEXP_BUSFREE;
/* request the further code to freeze the queue */
hcb-&gt;ccb-&gt;ccb_h.status |= CAM_DEV_QFRZN;
lun_to_freeze = hcb-&gt;lun;
@@ -1649,11 +1649,11 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
<programlisting> case TAGS_REJECTED:
/* 报告事件 */
- neg.flags = 0 &amp; ~CCB_TRANS_TAG_ENB;
+ neg.flags = 0 &amp; ~CCB_TRANS_TAG_ENB;
neg.valid = CCB_TRANS_TQ_VALID;
xpt_async(AC_TRANSFER_NEG, hcb-&gt;ccb.ccb_h.path_id, &amp;neg);
- ccb_status = CAM_MSG_REJECT_REC;
+ ccb_status = CAM_MSG_REJECT_REC;
/* 请求后面的代码冻结队列 */
hcb-&gt;ccb-&gt;ccb_h.status |= CAM_DEV_QFRZN;
lun_to_freeze = hcb-&gt;lun;
@@ -1663,21 +1663,21 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
</para>
<programlisting> case SELECTION_TIMEOUT:
- ccb_status = CAM_SEL_TIMEOUT;
+ ccb_status = CAM_SEL_TIMEOUT;
/* request the further code to freeze the queue */
hcb-&gt;ccb-&gt;ccb_h.status |= CAM_DEV_QFRZN;
lun_to_freeze = CAM_LUN_WILDCARD;
break;
case PARITY_ERROR:
- ccb_status = CAM_UNCOR_PARITY;
+ ccb_status = CAM_UNCOR_PARITY;
break;
case DATA_OVERRUN:
case ODD_WIDE_TRANSFER:
- ccb_status = CAM_DATA_RUN_ERR;
+ ccb_status = CAM_DATA_RUN_ERR;
break;
default:
/*以通用方法处理所有其他错误 */
- ccb_status = CAM_REQ_CMP_ERR;
+ ccb_status = CAM_REQ_CMP_ERR;
/* 请求后面的代码冻结队列 */
hcb-&gt;ccb-&gt;ccb_h.status |= CAM_DEV_QFRZN;
lun_to_freeze = CAM_LUN_WILDCARD;
@@ -1696,7 +1696,7 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
for(h = softc-&gt;first_queued_hcb; h != NULL; h = hh) {
hh = h-&gt;next;
- if(targ == h-&gt;targ
+ if(targ == h-&gt;targ
&amp;&amp; (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h-&gt;lun) )
free_hcb_and_ccb_done(h, h-&gt;ccb, CAM_REQUEUE_REQ);
}
@@ -1724,32 +1724,32 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
暂时不可用,并且当其变为可用时SIM驱动程序不能产生事件。这种资源
的一个例子就是某些控制器内部硬件资源,当其可用时控制器不会为其
产生中断。</para></listitem>
-
+
<listitem><para><emphasis>CAM_UNCOR_PARITY</emphasis> -
发生不可恢复的奇偶校验错误</para></listitem>
- <listitem><para><emphasis>CAM_DATA_RUN_ERR</emphasis> -
+ <listitem><para><emphasis>CAM_DATA_RUN_ERR</emphasis> -
数据外溢或未预期的数据状态(phase)(跑在另一个方向上而不是
CAM_DIR_MASK指定的方向),或对于宽传输出现奇数传输长度
</para></listitem>
- <listitem><para><emphasis>CAM_SEL_TIMEOUT</emphasis> -
+ <listitem><para><emphasis>CAM_SEL_TIMEOUT</emphasis> -
发生选择超时(目标不响应)</para></listitem>
- <listitem><para><emphasis>CAM_CMD_TIMEOUT</emphasis> -
+ <listitem><para><emphasis>CAM_CMD_TIMEOUT</emphasis> -
发生命令超时(超时函数运行)</para></listitem>
- <listitem><para><emphasis>CAM_SCSI_STATUS_ERROR</emphasis> -
+ <listitem><para><emphasis>CAM_SCSI_STATUS_ERROR</emphasis> -
设备返回的错误</para></listitem>
- <listitem><para><emphasis>CAM_AUTOSENSE_FAIL</emphasis> -
+ <listitem><para><emphasis>CAM_AUTOSENSE_FAIL</emphasis> -
设备返回的错误且REQUEST SENSE命令失败
</para></listitem>
- <listitem><para><emphasis>CAM_MSG_REJECT_REC</emphasis> -
+ <listitem><para><emphasis>CAM_MSG_REJECT_REC</emphasis> -
收到MESSAGE REJECT消息</para></listitem>
- <listitem><para><emphasis>CAM_SCSI_BUS_RESET</emphasis> -
+ <listitem><para><emphasis>CAM_SCSI_BUS_RESET</emphasis> -
收到SCSI总线复位</para></listitem>
<listitem><para><emphasis>CAM_REQ_CMP_ERR</emphasis> -
@@ -1760,16 +1760,16 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
<listitem><para><emphasis>CAM_UNEXP_BUSFREE</emphasis> -
出现未预期的断开连接</para></listitem>
- <listitem><para><emphasis>CAM_BDR_SENT</emphasis> -
+ <listitem><para><emphasis>CAM_BDR_SENT</emphasis> -
BUS DEVICE RESET消息被发送到目标</para></listitem>
<listitem><para><emphasis>CAM_UNREC_HBA_ERROR</emphasis> -
不可恢复的主机总线适配器错误</para></listitem>
- <listitem><para><emphasis>CAM_REQ_TOO_BIG</emphasis> -
+ <listitem><para><emphasis>CAM_REQ_TOO_BIG</emphasis> -
请求对于控制器太大</para></listitem>
- <listitem><para><emphasis>CAM_REQUEUE_REQ</emphasis> -
+ <listitem><para><emphasis>CAM_REQUEUE_REQ</emphasis> -
此请求应当被重新入队以保持事务的次序性。这典型地出现在下列
时刻:SIM识别出了应当冻结队列的错误,并且必须在sim级别上将目标的
其他入队请求放回到XPT队列。这些错误的典型情况有选择超时、命令
@@ -1777,10 +1777,10 @@ ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)<
此命令和其他还没有被发送到总线的命令被重新入队。
</para></listitem>
- <listitem><para><emphasis>CAM_LUN_INVALID</emphasis> -
+ <listitem><para><emphasis>CAM_LUN_INVALID</emphasis> -
SCSI控制器不支持请求中的LUN ID</para></listitem>
- <listitem><para><emphasis>CAM_TID_INVALID</emphasis> -
+ <listitem><para><emphasis>CAM_TID_INVALID</emphasis> -
SCSI控制器不支持请求中的目标ID</para></listitem>
</itemizedlist>
</sect1>
diff --git a/zh_CN.GB2312/books/arch-handbook/sound/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/sound/chapter.sgml
index 552e6d786c..3f61c3e785 100644
--- a/zh_CN.GB2312/books/arch-handbook/sound/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/sound/chapter.sgml
@@ -26,12 +26,12 @@
</chapterinfo>
<title>声音子系统</title>
-
+
<sect1 id="oss-intro">
<title>简介</title>
<indexterm><primary>sound subsystem(声音子系统)</primary></indexterm>
-
+
<para>FreeBSD声音子系统清晰地将通用声音处理问题与设备特定的问题分离
开来。这使得更容易加入对新设备的支持。</para>
@@ -42,7 +42,7 @@
<itemizedlist>
<listitem>
- <para>一个到数字化声音和混音器函数的系统调用接口(read, write,
+ <para>一个到数字化声音和混音器函数的系统调用接口(read, write,
ioctls)。ioctl命令集合兼容老的<emphasis>OSS</emphasis>
或<emphasis>Voxware</emphasis>接口,允许一般多媒体应用程序
不加修改地移植。</para>
@@ -56,7 +56,7 @@
</listitem>
<listitem>
<para>对某些通用硬件接口(ac97)或共享的硬件特定代码
- (例如:ISA DMA例程)的额外支持。</para>
+ (例如:ISA DMA例程)的额外支持。</para>
</listitem>
</itemizedlist>
@@ -99,7 +99,7 @@
<para>声音驱动程序使用与任何硬件驱动程序模块相同的方法探测和连接(设备)。
你可能希望浏览一下手册中<link linkend="isa-driver">ISA</link>或<link
linkend="pci">PCI</link>章节的内容来获取更多信息。</para>
-
+
<para>然而,声音驱动程序在某些方面又有些不同:</para>
<itemizedlist>
@@ -158,7 +158,7 @@
<function>pcm_unregister()</function>。</para>
</listitem>
</itemizedlist>
-
+
<para>有两种可能的方法来处理非PnP设备:</para>
<itemizedlist>
<listitem>
@@ -191,7 +191,7 @@
<para>声音驱动程序通常提供两种主要的接口:
<emphasis>CHANNEL</emphasis>以及
<emphasis>MIXER</emphasis>或<emphasis>AC97</emphasis>。</para>
-
+
<para><emphasis>AC97</emphasis>是一个很小的硬件访问(寄存器读/写)
接口,由驱动程序为带AC97编码解码器的硬件来实现。这种情况下,实际的
MIXER接口由<devicename>pcm</devicename>中共享的AC97代码提供。
@@ -231,7 +231,7 @@
<para>共享内存区域的大小等于
<function>sndbuf_getsize()</function>,并被分割为大小固定,且等于
<function>sndbuf_getblksz()</function>字节的很多块。</para>
-
+
<para>当播放时,常规的传输机制如下(将意思反过来就是录音):
</para>
@@ -270,9 +270,9 @@
<para>调用<function>xxxchannel_init()</function>来初始化每个播放
和录音通道。这个调用从声音驱动程序的连接例程中发起。(参看
<link linkend="pcm-probe-and-attach">探测和连接</link>一节)。</para>
-
+
<programlisting> static void *
- xxxchannel_init(kobj_t obj, void *data,
+ xxxchannel_init(kobj_t obj, void *data,
struct snd_dbuf *b, struct pcm_channel *c, int dir)<co id="co-chinit-params"/>
{
struct xxx_info *sc = data;
@@ -316,7 +316,7 @@
<para><function>xxxchannel_setformat()</function>应当按特定通道,
特定声音格式设置硬件。</para>
-
+
<programlisting> static int
xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format)<co id="co-chsetformat-params"/>
{
@@ -362,7 +362,7 @@
<para>大多数驱动程序只注意这儿的块大小,因为当实际传输开始时应该
使用这个值。</para>
-
+
<programlisting> static int
xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
@@ -375,7 +375,7 @@
<callout arearefs="co-chsetblocksize-return">
<para>函数返回可能调整过的块大小。如果块大小真的变化了,
这种情况下应当调用<function>sndbuf_resize()</function>调整
- 缓冲区的大小。</para>
+ 缓冲区的大小。</para>
</callout>
</calloutlist>
@@ -387,8 +387,8 @@
<para><function>xxxchannel_trigger()</function>由
<devicename>pcm</devicename>来控制驱动程序中的实际传输操作。
- </para>
-
+ </para>
+
<programlisting> static int
xxxchannel_trigger(kobj_t obj, void *data, int go)<co id="co-chtrigger-params"/>
{
@@ -425,7 +425,7 @@
</listitem>
</itemizedlist>
- </callout>
+ </callout>
</calloutlist>
<note><para>如果驱动程序使用ISA DMA,则应当在设备上执行动作前
@@ -442,7 +442,7 @@
当前的缓冲。它通常由<function>chn_intr()</function>调用,而且
这也是为什么<devicename>pcm</devicename>知道它应当往哪儿传送
新数据。</para>
-
+
</sect3>
<sect3>
@@ -451,7 +451,7 @@
<para>调用<function>xxxchannel_free()</function>来释放通道资源,
例如当驱动程序卸载时,并且如果通道数据结构是动态分配的,或者
如果不使用<function>sndbuf_alloc()</function>进行缓冲区分配,
- 则应当实现这个函数。</para>
+ 则应当实现这个函数。</para>
</sect3>
@@ -493,7 +493,7 @@
<sect2>
<title>MIXER接口</title>
-
+
<sect3 id="xxxmixer-init">
<title>mixer_init</title>
@@ -514,7 +514,7 @@
[为录音混音器设置v中适当的位]
mix_setrecdevs(m, v)
- return 0;
+ return 0;
}</programlisting>
<calloutlist>
@@ -539,7 +539,7 @@
(level)。</para>
<programlisting> static int
- xxxmixer_set(struct snd_mixer *m, unsigned dev,
+ xxxmixer_set(struct snd_mixer *m, unsigned dev,
unsigned left, unsigned right)<co id="co-mxset-params"/>
{
struct sc_info *sc = mix_getdevinfo(m);
@@ -549,7 +549,7 @@
<calloutlist>
<callout arearefs="co-mxset-params">
- <para>设备被指定为 <literal>SOUND_MIXER_XXX</literal> 值</para>
+ <para>设备被指定为 <literal>SOUND_MIXER_XXX</literal> 值</para>
<para>在范围[0-100]之间指定音量值。零值应当让设备静音。</para>
</callout>
@@ -566,7 +566,7 @@
<para><function>xxxmixer_setrecsrc()</function>设定录音源设备。
</para>
-
+
<programlisting> static int
xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src)<co id="co-mxsr-params"/>
{
@@ -598,7 +598,7 @@
<para><function>xxxmixer_reinit()</function>应当确保混音器硬件
加电,并且恢复所有不受<function>mixer_set()</function>或
- <function>mixer_setrecsrc()</function>控制的设置。</para>
+ <function>mixer_setrecsrc()</function>控制的设置。</para>
</sect3>
</sect2>
diff --git a/zh_CN.GB2312/books/arch-handbook/usb/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/usb/chapter.sgml
index 0fd67a95a1..5f4b3486fc 100644
--- a/zh_CN.GB2312/books/arch-handbook/usb/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/usb/chapter.sgml
@@ -41,7 +41,7 @@
<para>通用串行总线(USB)是将设备连接到个人计算机的一种新方法。总线
结构突出了双向通信的特色,并且其开发充分考虑到了设备正逐渐智能化
- 和需要与host进行更多交互的现实。对USB的支持包含在当前所有芯片中,
+ 和需要与host进行更多交互的现实。对USB的支持包含在当前所有芯片中,
因此在新近制造的PC中都可用。苹果(Apple)引入仅带USB的iMac对硬件
制造商生产他们USB版本的设备是一个很大的激励。未来的PC规范指定
PC上的所有老连接器应当由一个或多个USB连接器取代,提供通用的
@@ -82,7 +82,7 @@
使用单独的驱动程序来强烈推行基于标准的驱动程序。本章试图整理基本
信息以便对FreeBSD/NetBSD中USB栈的当前实现有个基本的了解。然而,
建议将下面参考中提及的相关规范与本章同时阅读。</para>
-
+
<sect2>
<title>USB栈的结构</title>
@@ -94,7 +94,7 @@
<para>中间层处理设备连接和断开,设备的基本初始化,驱动程序的选择,
通信通道(管道)和资源管理。这个服务层也控制默认管道和其上传输的
设备请求。</para>
-
+
<para>顶层包含支持特定(类)设备的各个驱动程序。这些驱动程序实现
除默认管道外的其他管道上使用的协议。他们也实现额外功能,使得设备
对内核或用户空间是可见的。他们使用服务层暴露出的USB驱动程序接口
@@ -183,7 +183,7 @@
<sect2>
<title>OHCI</title>
- <indexterm><primary>USB(通用串行总线)</primary><secondary>OHCI(开放主控制器接口)</secondary></indexterm>
+ <indexterm><primary>USB(通用串行总线)</primary><secondary>OHCI(开放主控制器接口)</secondary></indexterm>
<para>对OHCI主控器进行编程要容易得多。控制器假设有一组端点(endpoint)可用,
并知道帧中不同传输类型的调度优先级和排序。主控器使用的主要
数据结构是端点描述符(ED),它上面连接着一个传输描述符(TD)的队列。
@@ -295,7 +295,7 @@
这个标志只在in传输中有效,因为将要被发送到设备的数据量总是事先
知道的。如果传输过程中设备出现不可恢复的错误,管道会被停顿。
接受或发送更多数据以前,驱动程序需要确定停顿的原因,并通过在
- 默认管道上发送清除端点挂起设备请求(clear endpoint halt device
+ 默认管道上发送清除端点挂起设备请求(clear endpoint halt device
request)来清除端点停顿条件。</para>
<para>有四种不同类型的端点和对应的管道: - </para>
@@ -338,7 +338,7 @@
<sect1 id="usb-devprobe">
<title>设备的探测和连接</title>
- <indexterm><primary>USB(通用串行总线)</primary><secondary>probe(探测)</secondary></indexterm>
+ <indexterm><primary>USB(通用串行总线)</primary><secondary>probe(探测)</secondary></indexterm>
<para>集中器(hub)通知新设备已连接后,服务层给端口加电(switch on),
为设备提供100mA的电流。
此时设备处于其默认状态,并监听设备地址0。服务层会通过默认
@@ -365,7 +365,7 @@
<sect2>
<title>设备断开连接(disconnect)和分离(detach)</title>
- <indexterm><primary>USB(通用串行总线)</primary><secondary>disconnect(断开)</secondary></indexterm>
+ <indexterm><primary>USB(通用串行总线)</primary><secondary>disconnect(断开)</secondary></indexterm>
<para>设备驱动程序与设备进行任何事务期间,应当预期会接收到错误。
USB的设计支持并鼓励设备在任何点及时断开连接。驱动程序应当确保
当设备不在时做正确的事情。</para>
diff --git a/zh_CN.GB2312/books/arch-handbook/vm/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/vm/chapter.sgml
index 9d71862304..e21ca67e86 100644
--- a/zh_CN.GB2312/books/arch-handbook/vm/chapter.sgml
+++ b/zh_CN.GB2312/books/arch-handbook/vm/chapter.sgml
@@ -88,7 +88,7 @@
由此确定某一页活跃/闲置的实际程度。
这可以为更好的决定何时清理/分配一个页做出决策。</para>
</sect1>
-
+
<sect1 id="vm-cache">
<title>统一的缓存信息结构体&mdash;<literal>vm_object_t</literal></title>
@@ -111,10 +111,10 @@
结构体在任一个时刻只能与一个VM对象相关联。
VM对象影复本可以实现跨实例的共享相同的页。</para>
</sect1>
-
+
<sect1 id="vm-fileio">
<title>文件系统输入/输出&mdash;<literal>buf</literal>结构体</title>
-
+
<indexterm><primary>vnode</primary></indexterm>
<para>vnode VM对象,比如文件VM对象,一般需要维护它们自己的清理(clean)/
未清理(dirty)信息,而不依赖于文件系统的清理/未清理维护。
@@ -142,10 +142,10 @@
他们固有的限制了同时进行输入/输出可能的数量。
但是,由于通常有数千文件系统缓存可供使用,所以这并不会造成问题。</para>
</sect1>
-
+
<sect1 id="vm-pagetables">
<title>映射页表&mdash;<literal>vm_map_t, vm_entry_t</literal></title>
-
+
<indexterm><primary>page tables(页表)</primary></indexterm>
<para>FreeBSD将物理页表结构从VM系统中分离了出来。各进程的所有页表可以脱离进程
(on the fly)重建,并且通常被认为是一次性的。特殊的页表,如内核虚拟内存(KVM),
@@ -162,10 +162,10 @@
然而,由于有了层次的关联,因此在对象中所有对同一页的引用会引用同一
<literal>vm_page_t</literal>结构体,这样就实现了跨区域(board)的缓存的统一。</para>
</sect1>
-
+
<sect1 id="vm-kvm">
<title>KVM存储映射</title>
-
+
<para>FreeBSD使用KVM存放各种各样的内核结构体。在KVM中最大的单个实体是文件系统缓存。
那是与<literal>struct buf</literal>实体有关的映射。</para>
@@ -180,10 +180,10 @@
以便按照某一种类型的结构体分配。你可以使用命令<command>vmstat -m</command>
一览当前KVM分区使用情况。</para>
</sect1>
-
+
<sect1 id="vm-tuning">
<title>调整FreeBSD的虚拟内存系统</title>
-
+
<para>开发者的协同努力使得FreeBSD可以自行动态调整内核。一般来说,
除了内核配置选项<option>maxusers</option>和<option>NMBCLUSTERS</option>,
你不需要做任何杂乱的事情。这些内核编译配置选项(一般)被指定在