φ(・・*)ゞ ウーン
とうとうこのメモも20回目ですね。今日はs/malloc/kmalloc/とs/free/kfreeで終わるという惨敗っぷりですがwww ↓の初期化でコンパイルエラーになってたのですが、dfbsdはどこでcdevsw構造体を定義しているのか探していて力尽きました\(^o^)/ 一応直し方は分かりましたけどね( ´∀`)bグッ!
static struct cdevsw vmmdevsw = { .d_name = "vmmdev", .d_version = D_VERSION, .d_ioctl = vmmdev_ioctl, .d_mmap = vmmdev_mmap, .d_read = vmmdev_rw, .d_write = vmmdev_rw, };
例えば、このdev/raid/dpt/dpt_control.cで使われているっぽいけど、raidディレクトリのMakefileにdptのディレクトリの指定ないですよねとか、
SUBDIR= aac amr arcmsr asr ciss hptiop hptmv \ iir ips mfi mlx mly mps pst twa twe tws vinum .include <bsd.subdir.mk>
ifdefでコメントアウトされてるとかで使われてる形跡が見つかりませんでしたorz
それで、このvmmdevswが使われるのはmake_dev()の一番目の引数としてですが、この関数はFreeBSDとDragonFly BSDでちょっと違いますね。
FreeBSD9だとsys/conf.hでこのように定義されてます。__printflikeってなんだ?というのはありますが、printfっぽい何かのための定義なんでしょう。const char *_fmt, ...とか引数にありますし。まあ、細かいことは(・ε・)キニシナイ!!
270 struct cdev *make_dev(struct cdevsw *_devsw, int _unit, uid_t _uid, gid_t _gid, 271 int _perms, const char *_fmt, ...) __printflike(6, 7);
DragonFly BSDだとsys/device.hでこうなってます。
cdev_t make_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid, int perms, const char *fmt, ...) __printflike(6, 7);
両者の違いは最初の引数なのですが、dfbsdはこのdev_ops構造体ですね。deb_ops構造体もsys/device.hにいました。
/* * Character device switch table. * * NOTE: positions are hard coded for static structure initialization. */ struct dev_ops { struct { const char *name; /* base name, e.g. 'da' */ int maj; /* major device number */ u_int flags; /* D_XXX flags */ void *data; /* custom driver data */ int refs; /* ref count */ int id; } head; #define dev_ops_first_field d_default d_default_t *d_default; d_open_t *d_open; d_close_t *d_close; d_read_t *d_read; d_write_t *d_write; d_ioctl_t *d_ioctl; d_mmap_t *d_mmap; d_strategy_t *d_strategy; d_dump_t *d_dump; d_psize_t *d_psize; d_kqfilter_t *d_kqfilter; d_clone_t *d_clone; /* clone from base dev_ops */ d_revoke_t *d_revoke; #define dev_ops_last_field d_revoke };
dev_ops_first_fieldで使う関数というか、デフォルトの関数は同じくsys/device.hにいて、このように定義されてます。
d_default_t nodefault; d_open_t noopen; d_close_t noclose; d_read_t noread; d_write_t nowrite; d_ioctl_t noioctl; d_mmap_t nommap; d_strategy_t nostrategy; d_dump_t nodump; d_psize_t nopsize; d_kqfilter_t nokqfilter; d_clone_t noclone; d_revoke_t norevoke; d_open_t nullopen; d_close_t nullclose;
これらの実体はsys/kern_device.cで定義されてます。使わない関数にはNULLじゃなくてデフォルトの関数をセットしろということですね。
ということで答えは大体見えていて、cdevsw構造体をdev_ops構造体に代えてあげれば大体OKじゃないかなーというところです。
今日はdfbsdのソースをgrepしたときにcdevsw構造体が中途半端に見つかったせいでものすごく遠回りした挙句、力尽きた感じです( ´ー`)フゥー...