1. 目录
net -- 链路层驱动
netinet -- tcp/ip堆栈
module -- 模块家目录
xxx -- 单独建立一个目录,从其他目录拷贝
一个Makefile就可以了,修改里面的文件
3. 修改/sys/i386/files文件,模块定义
对应核配置文件中的pseudo-device xxxxx
3. "opt_xxx.h" 的定义,开关宏定义, 对应核配置文件中的OPTIONS XXX
修改/sys/i386/options文件
4. config -d 目录 kern.conf,到指定目录下编译内核
5. 初始调试时,不要将模块编译到内核中,稳定后再编译到内核中。
修改/sys/modules/Makefile
6. 模块源文件中尽量使用static定义全局变量,避免冲突
对于多源文件共享变量,不要使用static定义
7. 钩子函数挂接位置
链路层: if_ethersubr.c
tcp/ip层: ip_output.c ip_input.c tcp_output.c tcp_input.c
8. 钩子定义
#ifdef _KERNEL
typedef int myfunc_t(args...);
extern myfunc_t *myfunc_ptr;
#endif /* _KERNEL */
附值:myfunc_ptr = myfunc;
使用:myfunc_ptr(args...)
9. 头文件的引用顺序
很多头文件必须顺序引用,否则报错。尤其要注意xxx_var.h之类的。
10. 对于数组指针要仔细判断区间范围,避免溢出。特别是sysctl变量