Catch up with 5.0-CURRENT-20021105-JPSNAP
Submitted by: Akira Ikeuchi <yr6a-ikuc@asahi-net.or.jp>
This commit is contained in:
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
|
@ -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
|
||||
|
|
|
@ -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
|
||||
の属性名を与えることで、渡されたファイルまたはディレクトリのための
|
||||
定義された属性のリストをもたらすべきであると提案されていますが、
|
||||
現在は実装されていません。
|
||||
|
|
|
@ -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 .
|
||||
ではじめて登場しました。
|
||||
|
|
|
@ -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
|
||||
を参照) に照らしてこの値を検査します。
|
||||
ソフトリミットの超過はそのプロセスに
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
が変更しました。
|
||||
|
|
Loading…
Reference in a new issue