デバイスドライバは、動的にロード可能である必要があります。ドライバは、メモリーリソースの節約に役立つように、アンロード可能にもなっています。また、アンロード可能なドライバは、テスト、デバッグ、パッチ適用がより容易でもあります。
ドライバのロードとアンロードをサポートするには、各デバイスドライバが _init(9E)、_fini (9E)、および _info (9E) エントリポイントを実装する必要があります。次の例は、ロード可能なドライバインタフェースの標準的な実装を示しています。
使用例 6-1 ロード可能なインタフェースのセクションstatic void *statep; /* for soft state routines */
static struct cb_ops xx_cb_ops; /* forward reference */
static struct dev_ops xx_ops = {
DEVO_REV,
0,
xxgetinfo,
nulldev,
xxprobe,
xxattach,
xxdetach,
xxreset,
nodev,
&xx_cb_ops,
NULL,
xxpower,
ddi_quiesce_not_needed,
};
static struct modldrv modldrv = {
&mod_driverops,
"xx driver v1.0",
&xx_ops
};
static struct modlinkage modlinkage = {
MODREV_1,
&modldrv,
NULL
};
int
_init(void)
{
int error;
ddi_soft_state_init(&statep, sizeof (struct xxstate),
estimated_number_of_instances);
/* further per-module initialization if necessary */
error = mod_install(&modlinkage);
if (error != 0) {
/* undo any per-module initialization done earlier */
ddi_soft_state_fini(&statep);
}
return (error);
}
int
_fini(void)
{
int error;
error = mod_remove(&modlinkage);
if (error == 0) {
/* release per-module resources if any were allocated */
ddi_soft_state_fini(&statep);
}
return (error);
}
int
_info(struct modinfo *modinfop)
{
return (mod_info(&modlinkage, modinfop));
}