Catch up with 5.0-CURRENT-20021105-JPSNAP

Submitted by:	Akira Ikeuchi <yr6a-ikuc@asahi-net.or.jp>
This commit is contained in:
Kazuo Horikawa 2003-01-06 05:41:16 +00:00
parent 35e1829141
commit 8d9a34f82a
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=15550
6 changed files with 425 additions and 234 deletions

View file

@ -1,5 +1,5 @@
.\"-
.\" Copyright (c) 1999, 2000 Robert N. M. Watson
.\" Copyright (c) 1999-2001 Robert N. M. Watson
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" %FreeBSD: src/share/man/man9/acl.9,v 1.2.2.4 2001/12/17 11:30:18 ru Exp %
.\" %FreeBSD: src/share/man/man9/acl.9,v 1.11 2002/05/29 17:45:44 ru Exp $
.\"
.\" $FreeBSD$
.Dd December 23, 1999
@ -37,55 +37,8 @@
.In sys/vnode.h
.In sys/acl.h
.Pp
.Bd -literal
typedef int acl_type_t;
typedef int acl_tag_t;
typedef mode_t acl_perm_t;
struct acl_entry {
acl_tag_t ae_tag;
uid_t ae_id;
acl_perm_t ae_perm;
};
typedef struct acl_entry *acl_entry_t;
struct acl {
int acl_cnt;
struct acl_entry acl_entry[ACL_MAX_ENTRIES];
};
typedef struct acl *acl_t;
/*
* acl_entry_t の a_tag に有効な値
*/
#define ACL_USER_OBJ 0x00000001
#define ACL_USER 0x00000002
#define ACL_GROUP_OBJ 0x00000004
#define ACL_GROUP 0x00000008
#define ACL_MASK 0x00000010
#define ACL_OTHER 0x00000020
#define ACL_OTHER_OBJ ACL_OTHER
/*
* a_type_t 引数に有効な値
*/
#define ACL_TYPE_ACCESS 0x00000000
#define ACL_TYPE_DEFAULT 0x00000001
#define ACL_TYPE_AFS 0x00000002
#define ACL_TYPE_CODA 0x00000003
#define ACL_TYPE_NTFS 0x00000004
#define ACL_TYPE_NWFS 0x00000005
/*
* a_perm フィールドに可能なフラグ
*/
#define ACL_PERM_EXEC 0x0001
#define ACL_PERM_WRITE 0x0002
#define ACL_PERM_READ 0x0004
#define ACL_PERM_NONE 0x0000
#define ACL_PERM_BITS (ACL_PERM_EXEC | ACL_PERM_WRITE | ACL_PERM_READ)
#define ACL_POSIX1E_BITS (ACL_PERM_EXEC | ACL_PERM_WRITE | ACL_PERM_READ)
.Ed
カーネルコンフィギュレーションファイルの中に、
.Cd "options UFS_ACL"
.Sh 解説
アクセス制御リスト、すなわち ACL は、
ファイルおよびディレクトリを表現する vnode に対する権限を、
@ -98,20 +51,158 @@ vnode
関連付けられる 0 個以上の ACL を持つことが可能です。
それぞれ ACL の名前は、適切な vnode ACL 呼び出し
.Xr VOP_ACLCHECK 9 ,
.Xr VOP_GETACL 9 ,
.Xr VOP_GETACL 9
および
.Xr VOP_SETACL 9
.Fa type
フィールドを使用して指定されます。
.Pp
現在は、個々の ACL はカーネル内で固定サイズの ACL 構造体によって表現されます。
現在は、個々の ACL は以下に定義されるカーネル内で固定サイズの
.Vt acl
構造体によって表現されます。
.Bd -literal -offset indent
struct acl {
int acl_cnt;
struct acl_entry acl_entry[ACL_MAX_ENTRIES];
};
.Ed
.Pp
ACL は、ACL エントリの固定サイズ配列で構成されます。
各 ACL エントリは、
パーミッションの組、主要な名前空間、主要な識別子から構成されます。
結びつけられた acl_cnt フィールドの値に依存して、
これらの 0 個以上のエントリが "定義" されることが出来ます。
.Pp
個別の ACL エントリは、以下のメンバを持つ構造体の
.Vt acl_entry_t
型です。
.Bl -tag -width 2n
.It Vt acl_tag_t Va ae_tag
以下は
.Va ae_tag
に設定されるべき ACL の型の定義のリストです。
.Pp
.Bl -tag -width ".Dv ACL_UNDEFINED_FIELD" -offset indent -compact
.It Dv ACL_UNDEFINED_FIELD
未定義の ACL 型。
.It Dv ACL_USER_OBJ
実効ユーザ ID がファイルの所有者のユーザ ID と
一致するプロセスのための任意のアクセス権。
.It Dv ACL_USER
実効ユーザ ID が ACL エントリの権限と
一致するプロセスのための任意のアクセス権。
.It Dv ACL_GROUP_OBJ
実効グループ ID または全ての追加のグループがファイルの所有者のグループ ID と
一致するプロセスのための任意のアクセス権。
.It Dv ACL_GROUP
実効グループ ID または全ての追加のグループが ACL エントリの権限と
一致するプロセスのための任意のアクセス権。
.It Dv ACL_MASK
ファイルグループクラスの中のプロセスが許可されることができる
任意のアクセス権の最高限度。
.It Dv ACL_OTHER
その他の ACL エントリによって保護されていない
プロセスのための任意のアクセス権。
.It Dv ACL_OTHER_OBJ
.Dv ACL_OTHER
と同じです。
各々の ACL エントリは、厳密に、1 つの
.Dv ACL_USER_OBJ
と 1 つの
.Dv ACL_GROUP_OBJ
と 1 つの
.Dv ACL_OTHER
を含まなければなりません。
.Dv ACL_USER ,
.Dv ACL_GROUP
または
.Dv ACL_OTHER
が存在する場合には、厳密に 1 つの
.Dv ACL_MASK
エントリが存在するべきです。
.El
.It Vt uid_t Va ae_id
この ACL がアクセスパーミションを記述しているユーザのユーザ ID。
.It Vt acl_perm_t Va ae_perm
このフィールドは、この ACL に適合するプロセスが関連したファイルの
アクセスのために、どの種類のアクセスかを定義します。
.Bl -tag -width ".Dv ACL_POSIX1E_BITS"
.It Dv ACL_EXECUTE
プロセスは関連したファイルの実行が可能です。
.It Dv ACL_WRITE
プロセスは関連したファイルへの書込みが可能です。
.It Dv ACL_READ
プロセスは関連したファイルからの読込みが可能です。
.It Dv ACL_PERM_NONE
プロセスは関連したファイルへの読込み、書込みまたは実行のパーミションを
所有していません。
.El
.El
.Pp
.Sh 実装に関する注
.Bd -literal
typedef mode_t *acl_permset_t;
/* 内部の ACL 構造体 */
struct acl {
int acl_cnt;
struct acl_entry acl_entry[ACL_MAX_ENTRIES];
};
/* 外部の ACL 構造体 */
struct acl_t_struct {
struct acl ats_acl;
int ats_cur_entry;
};
typedef struct acl_t_struct *acl_t;
/*
* ae_tag フィールドに有効な値
*/
#define ACL_UNDEFINED_TAG 0x00000000
#define ACL_USER_OBJ 0x00000001
#define ACL_USER 0x00000002
#define ACL_GROUP_OBJ 0x00000004
#define ACL_GROUP 0x00000008
#define ACL_MASK 0x00000010
#define ACL_OTHER 0x00000020
#define ACL_OTHER_OBJ ACL_OTHER
/*
* acl_type_t 引数のために有効な値
*/
#define ACL_TYPE_ACCESS 0x00000000
#define ACL_TYPE_DEFAULT 0x00000001
#define ACL_TYPE_AFS 0x00000002
#define ACL_TYPE_CODA 0x00000003
#define ACL_TYPE_NTFS 0x00000004
#define ACL_TYPE_NWFS 0x00000005
/*
* ae_perm フィールドに可能なフラグ
*/
#define ACL_EXECUTE 0x0001
#define ACL_WRITE 0x0002
#define ACL_READ 0x0004
#define ACL_PERM_NONE 0x0000
#define ACL_PERM_BITS (ACL_EXECUTE | ACL_WRITE | ACL_READ)
#define ACL_POSIX1E_BITS (ACL_EXECUTE | ACL_WRITE | ACL_READ)
/*
* acl_get_entry() のための entry_id に可能な値
*/
#define ACL_FIRST_ENTRY 0
#define ACL_NEXT_ENTRY 1
/*
* ae_id フィールドの中の未定義の値
*/
#define ACL_UNDEFINED_ID ((uid_t)-1)
.Ed
.Sh 関連項目
.Xr acl 3 ,
.Xr vaccess_acl_posix1e 9 ,
.Xr VFS 9 ,
.Xr vaccess 9 ,
.Xr VOP_ACLCHECK 9 ,
.Xr VOP_GETACL 9 ,
.Xr VOP_SETACL 9

View file

@ -1,5 +1,5 @@
.\"-
.\" Copyright (c) 1999 Robert N. M. Watson
.\" Copyright (c) 1999, 2000, 2001 Robert N. M. Watson
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" %FreeBSD: src/share/man/man9/extattr.9,v 1.1.2.4 2001/12/17 11:30:18 ru Exp %
.\" %FreeBSD: src/share/man/man9/extattr.9,v 1.10 2002/05/16 05:21:58 trhodes Exp %
.\"
.\" $FreeBSD$
.Dd December 23, 1999
@ -42,7 +42,23 @@
この追加のデータのセマンティクスは、"name=value" ("名前=値") のペアで、
名前は定義されても定義されなくても良く、定義されていれば、0 バイト以上の
任意のバイナリデータに関連付けられます。
このデータの読み込みは、
拡張属性の名前は名前空間の集合の中に存在します。
拡張属性上の個々の操作は、操作を参照するために名前空間を供給することが
要求されています。
複数の名前空間の中に同じ名前が存在する場合には、その名前に関連付けられた
拡張属性は、独立して格納され、操作されます。
次の 2 つの名前空間が普遍的に定義されていますが、個々のファイルシステムは
追加の名前空間を実装することが可能で、またこれら
.Dv EXTATTR_NAMESPACE_USER ,
.Dv EXTATTR_NAMESPACE_SYSTEM
の名前空間を実装しないことも可能です。
これらの属性のセマンティクスは以下を意図しています。
ユーザ属性データは、ファイルまたはディレクトリの中のデータに関連付けられた
通常の任意および必須の保護によって、保護されます。
システム属性データは、これらの属性への直接的なアクセスまたは操作には
適切な特権が要求されることによって、保護されます。
.Pp
拡張属性データの読み込みは、
.Xr VOP_READ 9
の形式で、明示されたメタデータの連続した領域を返します。
一方、書込みは、
@ -58,7 +74,7 @@
.Pp
拡張属性は、ヌルで終端された文字列を使用して名前付けされます。
名前は大文字と小文字を区別するかもしれませんし、しないかもしれませんが、
これはファイルシステムのセマンティクスに依存します。
これは潜在的なファイルシステムのセマンティクスに依存します。
適切な vnode 拡張属性の呼び出しは、
.Xr VOP_GETEXTATTR 9
および
@ -66,9 +82,20 @@
です。
.Sh 関連項目
.Xr VFS 9 ,
.Xr VFS_EXTATTRCTL 9 ,
.Xr VOP_GETEXTATTR 9 ,
.Xr VOP_SETEXTATTR 9
.Sh 作者
このマニュアルページは
.An Robert Watson
が書きました。
.Sh バグ
現在は拡張属性アクセスインタフェースは、属性のトータルの大きさを返せないか、
呼び出し側によって提供されたバッファ空間が全ての利用可能なデータを保持する
ためには不足であることを示します。
加えて、このインタフェースは現在の利用可能な属性の組を取り出す仕組みを
提供していません。既に、
.Dv NULL
の属性名を与えることで、渡されたファイルまたはディレクトリのための
定義された属性のリストをもたらすべきであると提案されていますが、
現在は実装されていません。

View file

@ -22,28 +22,37 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" %FreeBSD: src/share/man/man9/make_dev.9,v 1.2.2.3 2001/12/17 11:30:18 ru Exp %
.\" %FreeBSD: src/share/man/man9/make_dev.9,v 1.12 2002/02/11 01:21:29 dd Exp %
.\"
.\" $FreeBSD$
.Dd September 25, 1999
.Dd May 27, 2001
.Os
.Dt MAKE_DEV 9
.Sh 名称
.Nm make_dev ,
.Nm destroy_dev
.Nd 新しいデバイスのための dev_t の作成と削除
.Nm make_dev_alias ,
.Nm destroy_dev ,
.Nm dev_depends
.Nd デバイスのための
.Vt dev_t
および DEVFS 登録の管理
.Sh 書式
.In sys/types.h
.In sys/param.h
.In sys/conf.h
.Ft dev_t
.Fn make_dev "struct cdevsw *cdevsw" "int minor" "uid_t uid" "gid_t gid" "int perms" "char *fmt" ...
.Fn make_dev "struct cdevsw *cdevsw" "int minor" "uid_t uid" "gid_t gid" "int perms" "const char *fmt" ...
.Ft dev_t
.Fn make_dev_alias "dev_t pdev" "const char *fmt" ...
.Ft void
.Fn destroy_dev "dev_t dev"
.Ft void
.Fn dev_depends "dev_t pdev" "dev_t cdev"
.Sh 解説
.Fn make_dev
関数は新しいデバイスのための
.Fa dev_t
構造体を作成します。
DEVFS が利用可能の場合には、新しいデバイスの存在も通知されます。
そのデバイスは
.Va uid
によって所有され、
@ -80,16 +89,49 @@
#endif
.Ed
.Pp
.Fn make_dev_alias
関数は
.Fn make_dev
から返された
.Ft dev_t
をとり、このデバイスのための別の名前 (別名) を作成します。
.Fn make_dev
の呼出しの前の
.Fn make_dev_alias
の呼出しは、誤りです。
.Pp
.Fn destroy_dev
関数は、
関数は
.Fn make_dev
から返された
.Fa dev_t
をとり、そのデバイスの登録を削除します。
.Fn make_dev_alias
で作成されたデバイスで
.Fn destroy_dev
を呼出さないでください。
.Pp
.Fn dev_depends
関数は 2 つのデバイス間の親子関係を確立します。
このネット効果は、親デバイスの
.Fn destroy_dev
は、もしあれば、結果としてその子デバイスの破壊に終わります。
1 つのデバイスは同時に親にも子にもなれ、
そのため、完全な階層構造を構築することが可能です。
.Sh 歴史
.Fn make_dev
および
.Fn destroy_dev
関数は
.Fx 4.0
で初めて登場しました。
ではじめて登場しました。
関数
.Fn make_dev_alias
.Fx 4.1
ではじめて登場しました。
関数
.Fn dev_depends
.Fx 5.0 .
ではじめて登場しました。

View file

@ -34,7 +34,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.\" %FreeBSD: src/share/man/man9/mi_switch.9,v 1.7.2.4 2001/12/17 11:30:18 ru Exp %
.\" %FreeBSD: src/share/man/man9/mi_switch.9,v 1.16 2002/08/13 14:51:17 ru Exp %
.\"
.\" $FreeBSD$
.Dd November 24, 1996
@ -42,36 +42,40 @@
.Os
.Sh 名称
.Nm mi_switch ,
.Nm cpu_switch
.Nd 別のプロセスコンテキストへのスイッチ
.Nm cpu_switch ,
.Nm cpu_throw
.Nd 別のスレッドコンテキストへのスイッチ
.Sh 書式
.In sys/param.h
.In sys/proc.h
.Ft void
.Fn mi_switch "void"
.Ft void
.Fn cpu_switch "struct proc *p"
.Fn cpu_switch "void"
.Ft void
.Fn cpu_throw "void"
.Sh 解説
.Fn mi_switch
関数はマシン非依存なプロセスコンテキストスイッチの前処理を実装しています。
関数はマシン非依存なスレッドコンテキストスイッチの前処理を実装しています。
横取り不可能なカーネルモード実行の方針の結果として、カーネル内の数少ない
区別された場所からのみ呼び出されます。
3 つの主な
いくつかの主な
.Nm
の使用は以下に挙げられます。
.Bl -enum -offset indent
.It
.Xr sleep 9
および
.Xr sleep 9 ,
.Xr tsleep 9
および
.Xr msleep
の中から、あるリソースが利用可能になるのを待つために
現在のプロセスが自発的に CPU を放棄するとき。
現在のスレッドが自発的に CPU を放棄するとき。
.It
トラップ (例えば、システムコール、デバイス割り込み) の取り扱いの後で、
カーネルがユーザモード実行のために戻る準備のとき。
通常この場合は、現在のプロセスのシグナル配置の中の変化の検出の後で
マシン依存のトラップハンドリングコードによって取り扱われるか、
より高い優先度のプロセスが実行可能になったかもしれないときです。
より高い優先度のスレッドが実行可能になったかもしれないときです。
後者のイベントはマシン定義の
.Fn need_resched
の呼び出しによるマシン非依存のスケジューリングルーチンによって伝達されます。
@ -79,11 +83,21 @@
シグナルハンドラコード
.Xr ( issignal 9
を参照) の中で、プロセスを停止させるシグナルが届けられた場合。
.It
スレッドが
.Xr thread_exit 9
の中で終了し、プロセッサの制御が次の実行可能のスレッドに渡されることが
可能なとき。
.It
.Xr thread_suspend_check 9
中で、全体としてのプロセスの停止状態のために、
スレッドが実行を停止する必要がある
場合。
.El
.Pp
.Fn mi_switch
はプロセス構造体の中に現在のプロセスが実行された時間量を記録して、
そのプロセスに割当てられている CPU の時間リミット
そのスレッドに割当てられている CPU の時間リミット
.Xr ( getrlimit 2
を参照) に照らしてこの値を検査します。
ソフトリミットの超過はそのプロセスに

View file

@ -50,7 +50,7 @@
* CSRG の KNF (Kernel Normal Form, カーネル標準書式) に基づいています。
*
* @(#)style 1.14 (Berkeley) 4/28/95
* $\&FreeBSD: src/share/man/man9/style.9,v 1.32.2.19 2002/04/14 19:28:03 asmodai Exp $
* $\&FreeBSD: src/share/man/man9/style.9,v 1.95 2002/11/01 16:20:31 rwatson Exp $
*/
/*
@ -76,20 +76,25 @@ C/C++
すべての VCS (バージョン管理システム) リビジョン識別子は、
存在すれば維持します。
これには、ファイルの来歴を示す複数の ID も含みます。
一般的に、
.So Li $ Sc
も含めて、ID はそのままとします。
外部からの VCS ID の前に
.Qq Li "From"
を付ける理由はありません。
ほとんどの非
.Fx
の VCS ID は、
コメント中ではタブでインデントされているでしょう
一般的に、外来の ID またはその下部構造は編集しません。
さもなければ
.Dq Li ( "#if defined(LIBC_SCCS)"
のように) 囲まれていない場合には、全ての互換性のない小片を隠すため、および
その ID をオブジェクトファイルから追い出しておくために、両方を
.Dq Li "#if 0 ... #endif"
の中に囲みます。
ファイルの名前が変更された場合には、外来の VCS ID の前に
.Dq Li "From: "
のみを追加します
.Bd -literal
#if 0
#ifndef lint
static char sccsid[] = "@(#)style 1.14 (Berkeley) 4/28/95";
#endif /* not lint */
#endif
#include <sys/cdefs.h>
__RCSID("@(#)style 1.14 (Berkeley) 4/28/95");
__FBSDID("$\&FreeBSD: src/share/man/man9/style.9,v 1.32.2.19 2002/04/14 19:28:03 asmodai Exp $");
__FBSDID("$\&FreeBSD: src/share/man/man9/style.9,v 1.95 2002/11/01 16:20:31 rwatson Exp $");
.Ed
.Pp
ヘッダファイルの前に、空行を 1 行付けます。
@ -167,11 +172,6 @@ __FBSDID("$\&FreeBSD: src/share/man/man9/style.9,v 1.32.2.19 2002/04/14 19:28:03
.\" という ANSI のスタイルと衝突します。
.\" これは MALLOC() については言えないし、インライン関数を使う時の
.\" 一般的なやりかたではありません。
マクロが 1 行以上必要な場合は、ブレース
.Ql ( \&{
.Ql \&} )
を使用します。
バックスラッシュは右揃えします。こうすると読みやすくなります。
マクロが複合文をカプセル化する場合には、それを
.Ic do
@ -186,7 +186,74 @@ __FBSDID("$\&FreeBSD: src/share/man/man9/style.9,v 1.32.2.19 2002/04/14 19:28:03
#define MACRO(x, y) do { \e
variable = (x) + (y); \e
(y) += 2; \e
} while(0)
} while (0)
.Ed
.Pp
コードが
.Ic #ifdef
または
.Ic #if
を使用して条件付きでコンパイルされるときには、
どこで条件付きでコンパイルされるコードが終了するのかを
読む人が容易に識別することが可能にするために、それに続く適合する
.Ic #endif
または
.Ic #else
にコメントを追加しても構いません。
このコメントは (主観的に) 長い部分、20 行以上の部分、またはネストされた
.Ic #ifdef
の連続が読む人を混乱させるかもしれないとき、にのみ使用されるべきです。
たとえコンパイルされない領域が小さくなるかもしれないでも、
lint の目的のために条件付きでコンパイルされない個所のために、
例外が作られても構いません。
そのコメントは
.Ic #endif
または
.Ic #else
から 1 つの空白によって分離されるべきです。
短い条件付きでコンパイルされる部分のために、
終わりのコメントを使用するべきではありません。
.Pp
.Ic #endif
のためのコメントは対応する
.Ic #iF
または
.Ic #ifdef
で使用されている表現に合わせるべきです。
.Ic #else
および
.Ic #elif
のためのコメントは先行する
.Ic #if
および/または
.Ic #elif
文に使用されている表現の反対に合わせるべきです。
コメントの中では、補助表現
.Dq Li defined(FOO)
.Dq Li FOO
と省略されます。
コメントの目的のためには、
.Dq Ic #ifndef Li FOO
.Dq Ic #if Li !defined(FOO)
とみなされます。
.Bd -literal
#ifdef KTRACE
#include <sys/ktrace.h>
#endif
#ifdef COMPAT_43
/* 大きな部分が、または他の条件付きのコードがここに */
#else /* !COMPAT_43 */
/* またはここに */
#endif /* COMPAT_43 */
#ifndef COMPAT_43
/* 更に別の大きな部分が、または他の条件付きのコードがここに */
#else /* COMPAT_43 */
/* またはここに */
#endif /* !COMPAT_43*/
.Ed
.Pp
列挙値は全て大文字を使用します。
@ -194,13 +261,20 @@ __FBSDID("$\&FreeBSD: src/share/man/man9/style.9,v 1.32.2.19 2002/04/14 19:28:03
enum enumtype { ONE, TWO } et;
.Ed
.Pp
宣言の中では、型に関係付けられたトークンを除いて、
アスタリスクと隣接したトークンの間には空白文字を置きません。
(これらの識別子は基本の型の名前、型の修飾語句、および今宣言されようとしている
もの以外の typedef 名です。)
これらの識別子はアスタリスクから 1 つの空白で分離します。
.Pp
構造体の中で変数を宣言する時には、
使用順、サイズ順、アルファベット順にソートして宣言します。
最初の区分は通常適用しませんが、例外があります。
各宣言は、それぞれ独立した行にて行います。
構造体の名前の位置を、あなたの判断で読み易いように、
タブ 1 個または 2 個を使用して揃えてください。
ほとんどのメンバを揃えるのに十分であれば、単一のタブを使用すべきです。
少なくとも 90% のメンバの名前を揃えるのに十分な場合には、
1 つだけのタブを使用するべきです。
非常に長い型の後の名前は、単一の空白で区切られるべきです。
.Pp
重要な構造体は、それが使用されるファイルの先頭で宣言されるか、
@ -248,7 +322,7 @@ LIST_HEAD(, foo) foohead; /*
で終る typedef を避けてください。
.Bd -literal
/* 構造体名と typedef を一致させます */
typedef struct bar {
typedef struct bar {
int level;
} BAR;
typedef int foo; /* これは foo です */
@ -265,22 +339,15 @@ typedef const long baz; /*
.Pp
カーネルの別の部分から使用される関数は、
関連のあるインクルードファイルの中でプロトタイプされます。
関数プロトタイプは、異なる順序の使用を強制する理由がない場合には、
なるべくアルファベット順の論理的な順序で整列されるべきです。
.Pp
複数のモジュールでローカルに使用される関数は、
.Qq Pa extern.h
等の分離したヘッダファイルの中に置かれます。
.Pp
一般にソースファイルが K&R 旧約聖書コンパイラで
コンパイル可能である (べき) 時にのみ、
インクルードファイル
.Aq Pa sys/cdefs.h
.Dv __P
マクロを使用します。
新しいコードでの
.Dv __P
マクロの使用は反対されていますが、
既存のファイルに対する修正はそのファイルの規約と首尾一貫しているべきです。
マクロは使用しません。
.Pp
ファイルの 50% かそれ以上を巻き込んだ修正の場合は、
一般にコードは
@ -329,10 +396,9 @@ static void usage(void);
int
main(int argc, char *argv[])
{
char *ep;
long num;
int ch;
char *ep;
.Ed
.Pp
一貫性のために、オプションの解析には
@ -381,7 +447,11 @@ main(int argc, char *argv[])
予約語
.Pq Ic if , while , for , return , switch
の後にスペースを入れます。
何も伴わないかただ 1 つの文を伴う制御文は、ブレースを使用しません。
何も伴わないかただ 1 つの文を伴う制御文は、ブレース
.Ql ( \&{
および
.Ql \&} )
を使用しません。
1 つの文が 複数行である文の場合には、これは許されます。
無限ループは
.Ic while
@ -395,7 +465,7 @@ main(int argc, char *argv[])
stmt;
for (;;) {
z = a + really + long + statement + that + needs +
two lines + gets + indented + four + spaces +
two + lines + gets + indented + four + spaces +
on + the + second + and + subsequent + lines;
}
for (;;) {
@ -420,10 +490,10 @@ main(int argc, char *argv[])
第 2 レベルのインデントは 4 文字のスペースです。
長い分を折り返す必要がある場合、オペレータを行末に置きます。
.Bd -literal
while (cnt < 20 && this_variable_name_is_too_long_for_its_own_good &&
while (cnt < 20 && this_variable_name_is_too_long &&
ep != NULL)
z = a + really + long + statement + that + needs +
two lines + gets + indented + four + spaces +
two + lines + gets + indented + four + spaces +
on + the + second + and + subsequent + lines;
.Ed
.Pp
@ -483,6 +553,7 @@ main(int argc, char *argv[])
.Ed
.Pp
関数の型は、関数自身に先行する行にあるべきです。
関数の本体の開始のブレースは、単独で 1 行であるべきです。
.Bd -literal
static char *
function(int a1, int a2, float fl, int a4)
@ -519,6 +590,11 @@ ANSI C
この規則は
.Xr indent 1
が理解しないことに注意してください。
.Ic sizeof
は常に括弧をつけて書かれます。
冗長な括弧の規則は
.Fn sizeof var
の事例には適用されません。
.Pp
.Dv NULL
は、好まれるヌルポインタ定数です。
@ -563,6 +639,9 @@ if (!*p)
を返すルーチンでは、
戻り値をどのポインタ型にもキャストしてはなりません。
.Pp
.Ic return
文の値は括弧で囲まれているべきです。
.Pp
.Xr err 3
または
.Xr warn 3

View file

@ -23,39 +23,34 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" %FreeBSD: src/share/man/man9/zone.9,v 1.9.2.4 2002/05/02 20:01:29 asmodai Exp %
.\" %FreeBSD: src/share/man/man9/zone.9,v 1.21 2002/05/30 11:37:39 ru Exp %
.\"
.\" $FreeBSD$
.Dd January 27, 2001
.Dd May 18, 2002
.Dt ZONE 9
.Os
.Sh 名称
.Nm zbootinit ,
.Nm zinitna ,
.Nm zinit ,
.Nm zalloc ,
.Nm zfree ,
.Nm zalloci ,
.Nm zfreei ,
.Nm uma_zcreate ,
.Nm uma_zalloc ,
.Nm uma_zfree ,
.Nm uma_zdestroy
.Nd ゾーンアロケータ
.Sh 書式
.In sys/param.h
.In sys/queue.h
.In vm/vm_zone.h
.In vm/uma.h
.Ft uma_zone_t
.Fo uma_zcreate
.Fa "char *name" "int size"
.Fa "uma_ctor ctor" "uma_dtor dtor" "uma_init uminit" "uma_fini fini"
.Fa "int align" "u_int16_t flags"
.Fc
.Ft "void *"
.Fn uma_zalloc "uma_zone_t zone" "int flags"
.Ft void
.Fn zbootinit "vm_zone_t z" "char *name" "int size" "void *item" "int nitems"
.Ft int
.Fn zinitna "vm_zone_t z" "struct vm_object *obj" "char *name" "int size" "int nentries" "int flags" "int zalloc"
.Ft vm_zone_t
.Fn zinit "char *name" "int size" "int nentries" "int flags" "int zalloc"
.Ft void *
.Fn zalloc "vm_zone_t z"
.Fn uma_zfree "uma_zone_t zone" "void *item"
.Ft void
.Fn zfree "vm_zone_t z" "void *item"
.Ft void *
.Fn zalloci "vm_zone_t z"
.Ft void
.Fn zfreei "vm_zone_t z" "void *item"
.Fn uma_zdestroy "uma_zone_t zone"
.Sh 解説
ゾーンアロケータは動的に大きさが決められる類似した大きさの項目の集合を
管理するための効率的なインタフェースを提供します。
@ -74,7 +69,7 @@
型が固定となるゾーンの特性を使用したい場合、
ゾーンアロケータが内部で使用する先頭 2 つのポインタを
この構造体が予約しておく必要があります。
.Bd -literal
.Bd -literal -offset indent
struct my_item {
struct my_item *z_rsvd1;
struct my_item *z_rsvd2;
@ -88,108 +83,42 @@ struct my_item {
最近解放されたものが内容として残っているでしょうが、
前述のフィールドは例外です。
.Pp
ゾーンはブートプロセスがどれだけ進捗しているかに依存して、
2 つの流儀のうちの一方で作成されます。
.Pp
VM システムが完全に初期化されている場合には、
.Fn zinit
を使用して動的に割当てられたゾーンが作成できます。
.Fn uma_zcreate
関数は、これから項目が割当てられることが可能な新しいゾーンを作成します。
.Fa name
引数はゾーンのための短い記述的な名前へのポインタであるべきです。
これは統計とデバッギング目的のために使用されます。
.Fa size
および
.Fa nentries
はそれぞれ、ゾーンによって保持される項目の大きさおよびそのゾーンの
初期の大きさ (項目数で) です。
割り込みコンテキストの中でゾーンから項目が割当てられる機会がある
場合には、
引数はデバッグおよびステータスのためのテキストのゾーン名です。
このメモリは、ゾーンの割当てが解放されるまでは、解放されるべきではありません。
.Pp
項目はそのゾーンへのポインタを伴なう
.Fn uma_zalloc
の呼出しによって割当てられ、
.Fa flags
引数は
.Dv ZONE_INTERRUPT
に設定されるべきです。
この場合、ゾーンは決して
.Fa nentries
項目よりも大きくならないことに注意してください。
他の全ての場合には
.Fa flags
は 0 に設定されるべきです。
最後の引数
.Fa zalloc
はゾーンが一杯になる度にそのゾーンが大きくなるべき VM ページの数を示します。
.Pp
VM システムが未だ完全に初期化されていない場合には、
ゾーンアロケータは項目に分け与えるための VM ページを
動的に割当てることができません。そのため、呼び出し側が静的な項目のプールを
供給する必要があります。
この場合、2 つの段階で初期化が完了します。最初に、ゾーンの最初の使用の前に
.Fn zbootinit
が呼び出され、後で VM システムが起動したときに、
.Fn zinitna
の呼び出しによってそのゾーンの初期化が完了されます。
.Pp
.Fn zbootinit
への最初の引数は初期化されるべき静的な
.Vt "struct vm_zone"
へのポインタです。
2 番目と 3 番目はゾーンの名前と保持される項目の大きさです。
4 番目の引数はゾーンが完全に初期化されるまでの間にゾーンアロケータが
そこから引き出すであろう静的な項目の配列へのポインタです。
.Fa nitems
引数は配列中の項目数です。
.Pp
.Fa zinitna
への引数は
.Fa zinit
へのものと同じですが、初期化されるべきゾーンへのポインタ、および
.Dv ZONE_INTERRUPT
の場合にそこからページを割当てるための
.Vt "struct vm_object"
へのポインタが加わっています。
.Pp
ゾーンから項目を割当てるためには、単純にそのゾーンのポインタを伴なって
.Fn zalloc
を呼び出します。これは項目へのポインタを、または、ゾーンの中の全ての
項目が使用中で且つアロケータがゾーンを大きくできないまれな場合には、
引数に
.Xr malloc 9
として文書化された選択されたフラグを設定されます。
その項目はそのゾーンに解放し戻されます。
成功の場合には項目へのポインタを返します。
ゾーン中の全項目が使用中で且つアロケータがゾーンを拡張できない稀な場合か、
.Dv M_NOWAIT
が明示されている場合、
.Dv NULL
を、返します。
.Fn zalloc
は割り込みセーフではないことに注意してください。
割り込みセーフな割当てのためには
.Fn zalloc
と同じセマンティクスを持つ
.Fn zalloci
を使用します。
を返します。
.Pp
項目はそのゾーンへのポインタおよびその項目へのポインタを伴なった
.Fn zfree
を呼び出しによって、割当てられていたゾーンに解放し戻されます。
.Fn zalloci
が使用されて行なわれた割当ての場合には対応する
.Fn zfreei
関数を使用します。
.Fn uma_zfree
の呼び出しによって、割当てられていたゾーンに解放し戻されます。
.Pp
空である作成されたゾーンは、
.Fn uma_zdestroy
を使用して、そのゾーンのために割当てられた全てのメモリを解放して、
破壊されることが可能です。
そのゾーンから
.Fn uma_zalloc
によって割当てられた項目は、その前に
.Fn uma_zfree
によって解放されなければなりません。
.Sh 戻り値
.Fn zinitna
関数は成功時には 1 をそして失敗時には 0 を返します。
唯一の失敗の場合は割り込みセーフなゾーンのためのアドレス空間を
前もって割当てられないことです。
.Pp
.Fn zinit
関数は完全に初期化された
.Vt "struct vm_zone"
へのポインタを、または
.Vt "struct vm_zone"
.Fn malloc
できなかった場合か
.Dv ZONE_INTERRUPT
フラグが設定されていて
.Fn zinitna
がアドレス空間の前割当てに失敗した場合に
.Dv NULL
を、返します。
.Pp
.Fn zalloc
.Fn uma_zalloc
関数は項目へのポインタを、またはゾーンの未使用項目が不足してアロケータが
ゾーンを拡張できない場合に
.Dv NULL
@ -200,12 +129,21 @@ VM
ゾーンアロケータは
.Fx 3.0
ではじめて登場しました。
スラブアロケータとしての機能のため、
.Fx 5.0
で根本的に変更されました。
.Sh 作者
.An -nosplit
ゾーンアロケータは
.An John S. Dyson
が書きました。
ゾーンアロケータは、スラブアロケータとしての機能のため、
.An Jeff Roberson Aq jeff@FreeBSD.org
が大部分を書き直しました。
.Pp
このマニュアルページは
.An Dag-Erling Co\(:idan Sm\(/orgrav Aq des@FreeBSD.org
が書きました。
UMA のために
.An Jeroen Ruigrok van der Werven Aq asmodai@FreeBSD.org
が変更しました。