- 论坛徽章:
- 0
|
#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>
/* 无论什么时候,一个KLD被装载进内核或从内核中卸载时,必须调用一个被称为模块事件处理程序的函数。
每个KLD必须包含一个事件处理程序。以下为本例的事件处理程序。*/
static int
load(struct module *module, int cmd, void *arg)
/*关于此函数在中的定义:
typedef int (*modeventhand_t)(module_t, int /* modeventtype_t */, void *);
module_t是一个指向模块的结构指针。
modeventtype_t类型是int,搞不懂。其在<sys/module.h>中的定义为:
typedef enum modeventtype {
MOD_LOAD, /* Set when module is loaded. */
MOD_UNLOAD, /* Set when module is unloaded. */
MOD_SHUTDOWN, /* Set on shutdown. */
MOD_QUIESCE /* Set on quiesce. */
} modeventtype_t;
下面用switch语句判断MOD_LOAD与MOD_UNLOAD时程序的行为。EOPNOTSUPP则表示未定义的操作。*/
{
int error = 0;
switch (cmd) {
case MOD_LOAD:
uprintf("Hello, world!\n");
break;
case MOD_UNLOAD:
uprintf("Good-bye, cruel world!\n");
break;
default:
error = EOPNOTSUPP;
break;
}
return(error);//注意此*modeventhand_t返回的error的值,不出意外应该为"Hello, world!"这样的字符串。
}//本例事件处理函数load完成。
/* hello_mod在下面的DECLARE_MODULE被调用,在此定义。按照 DECLARE_MODULE的定义,你必须为第二个形参data
提供一个moduledata类型的参数。*/
static moduledata_t hello_mod = {
"hello", /* 此处定义模块正式名称 */
load, /* 模块的事件处理函数 */
NULL /* 额外,留空即可。 */
};
/*通过调用 DECLARE_MODULE 宏可以完成必须的把自己链接以及注册到内核中的工作。此宏在中
的定义如下:
#define DECLARE_MODULE(name, data, sub, order) \
MODULE_METADATA(_md_##name, MDT_MODULE, &data, #name); \
SYSINIT(name##module, sub, order, module_register_init, &data) \
struct __hack
name作为字符串传递指定模块的名称。
data作为moduledata 结构传递模块的正式名称和调用的事件处理函数。
moduledata 结构在头文件中定义如下:
typedef struct moduledata {
const char *name; /* module name */
modeventhand_t evhand; /* event handler */
void *priv; /* extra data */
} moduledata_t;
sub它指定系统启动接口,定义了模块的类型。<sys/kernel.h> 头文件中的sysinit_sub_id枚举列表中查看。
根据我们的目的,我们总是设置这个参数为SI_SUB_DRIVERS。SI_SUB_DRIVERS是在注册一个设备驱动程序时使用的。
order参数指定模块在模块子系统中初始化的次序。你可以在<sys/kernel.h>头文件中的sysinit_elem_order 枚举列表中查看它的有效项。
根据我们的目的,我们总是设置这个参数为SI_ORDER_MIDDLE,它在KLD初始化过程中处于中间位置。
*/
DECLARE_MODULE(hello, hello_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
/*如此可知:本例使用DECLARE_MODULE声明了hello模块并调用moduledata类型的hello_mod得到了模块的正式名称和触发的事件处理函数load。根据
惯例讲DECLARE_MODULE的sub和order设置成了SI_SUB_DRIVERS和SI_ORDER_MIDDLE。触发事件处理函数load后便达到了装载时显示"Hello, world!"
卸载时显示"Good-bye, cruel world!"的功能。*/ | 问题有两个:
1,DECLARE_MODULE调用hello_mod后没看到谁最后去调用load了
2,没有哪句话显式的为load形参逐个赋值?
不好意思,新手不会C,今天阅读一个文档卡在这里了。希望各位高人不吝赐教^_^ |
|