分类:
2008-04-08 17:06:15
本节介绍的伪设备驱动程序在加载驱动程序时将一个常量字符串写入系统日志。
Quote Of The Day 驱动程序(qotd_1)第一个版本比上一章的 dummy 驱动程序还要简单。dummy 驱动程序包含了驱动硬件所需的所有函数。该 qotd_1 驱动程序仅包含使某一字符串可用于某一用户命令所需的最基本的函数。例如,该 qotd_1 驱动程序没有 cb_ops(9S) 结构。因此,本驱动程序不定义 open(9E)、close(9E)、read(9E) 或 write(9E) 函数。检查一下该 qotd_1 驱动程序的 dev_ops(9S) 结构,可以看到没有定义 getinfo(9E)、attach(9E) 或 detach(9E) 函数。本驱动程序不包含函数声明,因为本驱动程序中定义的所有函数都是在 modctl.h 头文件中声明的。在 qotd_1.c 文件中必须包含 modctl.h 头文件。
该 qotd_1 驱动程序定义了一个全局变量来保存其文本数据。本驱动程序的 _init 入口点使用 函数将该字符串写入系统日志。dummy 驱动程序还使用 cmn_err(9F) 函数来显示消息。qotd_1 驱动程序与 dummy 驱动程序不同,因为 qotd_1 驱动程序将其字符串存储在内核内存中。
将下例中所示的源代码输入一个名为 qotd_1.c 的文本文件中。
#include#include #include #include #include #include #define QOTD_MAXLEN 128 static const char qotd[QOTD_MAXLEN] = "Be careful about reading health books. \ You may die of a misprint. - Mark Twain\n"; static struct dev_ops qotd_dev_ops = { DEVO_REV, /* devo_rev */ 0, /* devo_refcnt */ ddi_no_info, /* devo_getinfo */ nulldev, /* devo_identify */ nulldev, /* devo_probe */ nulldev, /* devo_attach */ nulldev, /* devo_detach */ nodev, /* devo_reset */ (struct cb_ops *)NULL, /* devo_cb_ops */ (struct bus_ops *)NULL, /* devo_bus_ops */ nulldev /* devo_power */ }; static struct modldrv modldrv = { &mod_driverops, "Quote of the Day 1.0", &qotd_dev_ops}; static struct modlinkage modlinkage = { MODREV_1, (void *)&modldrv, NULL }; int _init(void) { cmn_err(CE_CONT, "QOTD: %s\n", qotd); return (mod_install(&modlinkage)); } int _info(struct modinfo *modinfop) { return (mod_info(&modlinkage, modinfop)); } int _fini(void) { return (mod_remove(&modlinkage)); }
将下例中所示的配置信息输入一个名为 qotd_1.conf 的文本文件中。
name="qotd_1" parent="pseudo" instance=0;
编译并连接本驱动程序。使用 -D_KERNEL 选项指示该代码定义了一个内核模块。下例显示了编译和连接 32 位架构的方法:
% cc -D_KERNEL -c qotd_1.c % ld -r -o qotd_1 qotd_1.o |
注意驱动程序的名称 qotd_1 必须与配置文件中的 name 属性匹配。
确保在安装驱动程序时您是用户 root 。
将驱动程序二进制文件复制 /tmp 目录,如中所述。
# cp qotd_1 /tmp # ln -s /tmp/qotd_1 /usr/kernel/drv/qotd_1 |
将配置文件复制到系统的内核驱动程序区。
# cp qotd_1.conf /usr/kernel/drv |
每次加载驱动程序时,该 qotd_1 驱动程序都会向系统日志写入一条消息。 函数将低优先级的消息(如在该 qotd_1 驱动程序中定义的消息)写入 /dev/log。 守护进程从 /dev/log 读取消息,并将低优先级的消息写入/var/adm/messages。
要测试本驱动程序,请留意 /var/adm/messages 中的消息。在一个单独的窗口中,输入下列命令:
% tail -f /var/adm/messages |
在加载驱动程序时要确保您是用户 root。使用 命令可以加载驱动程序:
# add_drv qotd_1 |
在查看 /var/adm/messages 的窗口中应该可以看到下列消息:
date time machine pseudo: [ID 129642 kern.info] pseudo-device: devinfo0 |
最后一行是 入口点中 函数输出的变量的内容。_init(9E) 入口点是在驱动程序加载时调用的。