日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
MAKE_DEV(9) FreeBSD カーネル開発者マニュアル MAKE_DEV(9) 名称 make_dev, make_dev_cred, make_dev_credf, make_dev_p, make_dev_s, make_dev_alias, make_dev_alias_p, destroy_dev, destroy_dev_sched, destroy_dev_sched_cb, destroy_dev_drain, dev_depends -- デバイスのための cdev と DEVFS 登録を管理する 書式 #include <sys/param.h> #include <sys/conf.h> void make_dev_args_init(struct make_dev_args *args); int make_dev_s(struct make_dev_args *args, struct cdev **cdev, const char *fmt, ...); int make_dev_alias_p(int flags, struct cdev **cdev, struct cdev *pdev, const char *fmt, ...); void destroy_dev(struct cdev *dev); void destroy_dev_sched(struct cdev *dev); void destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg); void destroy_dev_drain(struct cdevsw *csw); void dev_depends(struct cdev *pdev, struct cdev *cdev); 古いインタフェース struct cdev * make_dev(struct cdevsw *cdevsw, int unit, uid_t uid, gid_t gid, int perms, const char *fmt, ...); struct cdev * make_dev_cred(struct cdevsw *cdevsw, int unit, struct ucred *cr, uid_t uid, gid_t gid, int perms, const char *fmt, ...); struct cdev * make_dev_credf(int flags, struct cdevsw *cdevsw, int unit, struct ucred *cr, uid_t uid, gid_t gid, int perms, const char *fmt, ...); int make_dev_p(int flags, struct cdev **cdev, struct cdevsw *devsw, struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, ...); struct cdev * make_dev_alias(struct cdev *pdev, const char *fmt, ...); 解説 make_dev_s() 関数は、cdev 引数に返される新しいデバイスのための cdev 構造 体を作成します。また、それは新しいデバイスの存在を devfs(5) に通知して、 対応するノードを作成します。これに加えて、devctl(4) 通知が送信されます。 関数は、デバイス作成のためのパラメータを指定する、構造体 struct make_dev_args args を取ます: struct make_dev_args { size_t mda_size; int mda_flags; struct cdevsw *mda_devsw; struct ucred *mda_cr; uid_t mda_uid; gid_t mda_gid; int mda_mode; int mda_unit; void *mda_si_drv1; void *mda_si_drv2; }; 使用する前に、要求された値で満たされ、構造体は、将来のカーネルインタ フェース拡張がドライバのソースコードまたはバイナリインタフェースに影響し ないことを保証する、make_dev_args_init() 関数によって初期化されなければな りません。 作成されたデバイスは、args.mda_gid としてグループの所有権で args.mda_uid によって所有されます。名前は、fmt と拡張と printf(9) がそれを印刷する次の 引数です。名前は、/dev または、他の devfs(5) マウントポイント下のパスを決 定して、サブディレクトリを指示するスラッシュ `/' 文字を含みます。 args.mda_mode で指定されるファイルのパーミッションは、<sys/stat.h> に定義 されています。 #define S_IRWXU 0000700 /* 所有者のための RWX マスク #define S_IRUSR 0000400 /* 所有者のための R */ #define S_IWUSR 0000200 /* 所有者のための W */ #define S_IXUSR 0000100 /* 所有者のための X */ #define S_IRWXG 0000070 /* グループのための RWX マスク */ #define S_IRGRP 0000040 /* グループのための R */ #define S_IWGRP 0000020 /* グループのための W */ #define S_IXGRP 0000010 /* グループのための X */ #define S_IRWXO 0000007 /* その他のための RWX マスク */ #define S_IROTH 0000004 /* その他のための R */ #define S_IWOTH 0000002 /* その他のための W */ #define S_IXOTH 0000001 /* その他のための X */ #define S_ISUID 0004000 /* 実行時のセットユーザ ID */ #define S_ISGID 0002000 /* 実行時のセットグループ ID */ #define S_ISVTX 0001000 /* スティッキビット */ #ifndef _POSIX_SOURCE #define S_ISTXT 0001000 #endif args.mda_cr 引数は、初期化している struct cdev の si_cred メンバに格納さ れる資格証明を指定します。 args.mda_flags 引数は、make_dev_s() の動作を変更します。現在、次の値が受 け付けられます: MAKEDEV_REF 作成されたデバイスを参照 MAKEDEV_NOWAIT sleep しません、呼び出しは、失敗します MAKEDEV_WAITOK malloc を満たすために関数は、sleep するこ とができます MAKEDEV_ETERNAL 作成されたデバイスは、決して破壊されません MAKEDEV_CHECKNAME デバイス名が不正であるか、または既に存在す るなら、エラーを返します MAKEDEV_NOWAIT, MAKEDEV_WAITOK と MAKEDEV_CHECKNAME 値だけが、 make_dev_alias_p() 関数のために受け付けられます。 MAKEDEV_WAITOK, MAKEDEV_NOWAIT のいずれも指定されなければ、MAKEDEV_WAITOK フラグが仮定されます。 devfs_lookup(9) が cdev への参照を落す直後に破壊されるところで競合を避け るために、作成されたデバイスが、検索のために応答でデバイスを作成すると き、dev_clone(9) イベントハンドラは、MAKEDEV_REF フラグを指定するものとし ます。 MAKEDEV_ETERNAL フラグによって、カーネルは、システムコールを cdevsw メ ソッド呼び出しに変換するとき、いくつかのロックを獲得できません。 destroy_dev() が返された cdev で決して呼び出されないことを保証するのは、 ドライバの作者の責任です。利便性のために、カーネルにコンパイルするか、ま たはローダブルモジュールとしてロード (アンロード) することができるコード に対して MAKEDEV_ETERNAL_KLD フラグを使用します。 MAKEDEV_CHECKNAME フラグが指定されず、デバイス名が不正であるか、または既 に存在しているなら、パニックが起こります。 次の形式の make_dev_p() 使用は、 struct cdev *dev; int res; res = make_dev_p(flags, &dev, cdevsw, cred, uid, gid, perms, name); 次のコードと同等です。 struct cdev *dev; struct make_dev_args args; int res; make_dev_args_init(&args); args.mda_flags = flags; args.mda_devsw = cdevsw; args.mda_cred = cred; args.mda_uid = uid; args.mda_gid = gid; args.mda_mode = perms; res = make_dev_s(&args, &dev, name); 同様に、make_dev_credf() 関数呼び出しは、次と同等です。 (void) make_dev_s(&args, &dev, name); 言い換えると、make_dev_credf() は、呼び出し側が返り値を得ることを許可せ ず、INVARIANTS オプションでコンパイルされたカーネルで、関数は、デバイスが 成功して作成されたと断言します。 make_dev_cred() 関数は、次の呼び出しと同等です。 make_dev_credf(0, cdevsw, unit, cr, uid, gid, perms, fmt, ...); make_dev() 関数呼び出しは、次と同じです。 make_dev_credf(0, cdevsw, unit, NULL, uid, gid, perms, fmt, ...); make_dev_alias_p() 関数は、make_dev() から返された cdev を取り、このデバ イスのために別の (エイリアスされる) 名前を作成します。make_dev() を呼び出 す前に make_dev_alias_p() を呼び出すことは、エラーです。 make_dev_alias() 関数は、make_dev_alias() と同様ですが、それは、結果のエ イリアシング *cdev を返し、エラーを返しません。 make_dev_s() と make_dev_alias_p() によって返された cdev には、状態を格納 するために利用可能な、2 つのフィールド si_drv1 と si_drv2 があります。両 方のフィールドは、タイプ void * であり、make_dev_s() 引数の構造体の args.mda_si_drv1 と args.mda_si_drv2 メンバを満たすことによって cdev 割り 付けで同時に初期化することができるか、または古いインタフェースを使用して いるなら、cdev が割り付けられた後に満たされます。後者の場合に、ドライバ は、初期化されていない si_drv1 と si_drv2 自体にアクセスしている競合を処 理するべきです。これらは、unit 引数を、dev2unit() で取得できる、 make_dev() に置き換えるようにを設計されています。 destroy_dev() 関数は、make_dev() から返された cdev を取り、そのデバイスの ための登録を破壊します。破壊イベントに関する通知が、devctl(4) に送られま す。make_dev_alias() で作成されたデバイスで destroy_dev() を呼び出さない でください。 dev_depends() 関数は、2 つのデバイスの間の親子関係を確立します。ネットの 影響は、親デバイスの destroy_dev() が、存在しているなら、(複数の) 子供の デバイスも破壊する結果となります。デバイスは、同時に親と子供であるかもし れないので、完全な階層構造を構築することは可能です。 destroy_dev_sched_cb() 関数は、安全なコンテキストで指定された cdev のため に destroy_dev() の実行をスケジュールします。destroy_dev() が終了した後 に、供給された cb が NULL でないなら、コールバック cb が、引数 arg で呼び 出されます。destroy_dev_sched() 関数は、次と同じです。 destroy_dev_sched_cb(cdev, NULL, NULL); d_close() ドライバの方法は、直接 destroy_dev() を呼び出すことができませ ん。そうすることは、destroy_dev() が、ドライバの方法に任せるすべてのス レッドを待つとき、デッドロックを引き起こします。また、destroy_dev() は、 スリープするので、スリープ不可能なロックは、呼び出しにわたって保持されま せん。destroy_dev_sched() 関数ファミリは、これらの問題を克服します。 デバイスドライバは、cdevsw として供給された csw があるすべてのデバイスが 破壊されるまで、待つために、destroy_dev_drain() 関数を呼び出します。ドラ イバは、destroy_dev_sched() がすべての例示されたデバイスを呼び出すことを 知っていますが、destroy_dev() が実際にそれらのすべてが終了するまで、モ ジュールのアンロードを延期するのが必要があるとき、役に立ちます。 戻り値 成功するなら、make_dev_s() と make_dev_p() は、0 を返し、そうでければ、そ れらは、エラーを返します。成功するなら、make_dev_credf() は、有効な cdev ポインタを返し、そうでければ、NULL を返します。 エラー make_dev_s(), make_dev_p() と make_dev_alias_p() 呼び出しは、次の場合に失 敗して、デバイスは、登録されません: [ENOMEM] MAKEDEV_NOWAIT フラグが指定され、メモリ割り付け要求を 満たすことができませんでした。 [ENAMETOOLONG] MAKEDEV_CHECKNAME フラグが指定され、提供されたデバイス 名が、SPECNAMELEN より長いです。 [EINVAL] MAKEDEV_CHECKNAME フラグが指定され、提供されたデバイス 名が空であり、"." または ".." パス構成要素を含むか、ま たは `/' で終っています。 [EINVAL] MAKEDEV_CHECKNAME フラグが指定され、提供されたデバイス 名が不正な文字を含んでいます。 [EEXIST] MAKEDEV_CHECKNAME フラグが指定され、提供されたデバイス 名が既に存在しています。 関連項目 devctl(4), devfs(5), dev_clone(9) 歴史 make_dev() と destroy_dev() 関数は、FreeBSD 4.0 ではじめて登場しました。 関数 make_dev_alias() は、FreeBSD 4.1 ではじめて登場しました。関数 dev_depends() は、FreeBSD 5.0 ではじめて登場しました。関数 make_dev_credf(), destroy_dev_sched(), destroy_dev_sched_cb() は、 FreeBSD 7.0 ではじめて登場しました。関数 make_dev_p() は、FreeBSD 8.2 で はじめて登場しました。関数 make_dev_s() は、FreeBSD 11.0 ではじめて登場し ました。 FreeBSD 11.2 March 2, 2016 FreeBSD 11.2