分类: LINUX
2010-06-10 10:31:17
下面对dazuko这个设备驱动进行分析,现在发现很多程序都喜欢使用状态机,用它来实现程序中的流程控制(另一个经典的使用状态机的例子是lighttpd,一个web服务器,也曾经看过它的代码,准备过几天写一点学习感受吧)
昨天准备写很多,但一晚上没写出什么东西,而且思路不清楚,还是自己理解的不够好。这里我以问答方式写一下对程序的理解。
1.怎么实现了hook函数
在加载dazuko模块时,执行了init_module(),在这个函数中用自己实现的sys_xxxxx来替代了sys_call_table[]中的系统函数,以此来实现了hook(第一次看见这种方法,很强大,通过类似的方式可以实现很多功能)。
2.怎么和用户态的查毒软件交互
在一个应用中,可能要开启多个查毒软件的进程,每个进程都向dazuko进行注册,实际上注册就是一次打开该字符设备的操作。在dazuko_device_open()中将该进程保存到一个表中,这张表就是slots,
它的每一项记录为
struct slot_t
{
/* A representation of a daemon. It holds
* all information about the daemon, the
* file that is scanned, and the state of
* the scanning process. */
int id;
int pid; /* pid of our daemon */
int state;
int response;
int event;
int o_flags;
int o_mode;
int kuid; /* user id of the kernel process */
int kpid; /* process id of the kernel process */
int filenamelength; /* not including terminator */
char *filename;
struct semaphore mutex;
};
这个结构保存一个查毒软件当前处于什么状态,是正在监听、正在分析一个文件等等。这其中涉及状态机,贴图如下。
在dazuko截获到一个文件操作时,它从这个表中寻找一个当前处于FREE状态查毒进程,并把这个文件的相关信息告知该进程,由这个进程来分析文件。
dazuko和查毒软件之间的交互通过
|
实现,cmd是KEY, param是VALUE
3.最新版本和1.0.0的不同
最新版本中通过定义新的接口封装了底层的函数,这样对用户来讲更方便编程了。例如在1.0.0的
|
4.多个wait_queue的作用
static struct wait_queue *wait_kernel_waiting_for_free_slot;
可能表中的所有查毒软件都正在工作,这个wait_queue的作用就是等待一个查毒软件进程完成任务,并再次可用
static struct wait_queue *wait_kernel_waiting_while_daemon_works;
这个是查毒软件当前正处于分析状态,内核必须等待知道查毒软件完成分析,并告知结果
static struct wait_queue *wait_daemon_waiting_for_work;
这个是查毒软件当前正处于FREE状态,也就是监听状态,等待dazuko告诉它文件访问事件的发生
static struct wait_queue *wait_daemon_waiting_for_free;
查毒软件告诉了dazuko模块它的分析结果,必须等待dazuko模块给它的确认,由dazuko将它的状态从DONE转为FREE。
5.一个很好的编程技巧
struct hash_t
{
struct hash_t *next;
struct file *file;
int dirty;
int namelen;
char name[1]; /* this MUST be at the end of the struct */
};
这里定义一个字符数组,但长度为1,如果有一个filename要保存,可以这样操作
struct hash_t *new = malloc(sizeof(struct hash_t) + strlen(filename));
new -> namelen = strlen(filename);
memcpy(new -> name, filename, new -> namelen);
6.WAIT和WAKEUP down和up
用wait和wakeup来实现在dazuko和查毒软件之间的控制流程,因为他们之间是类似ababa这样一个执行过程。
Down和Up mutex的作用就是在修改和赋值时要保护临界区,在每个结构都有一个mutex变量。
总结:
记得以前看过文章说内核里你可以为所欲为,不会像用户态有所限制,但在内核态里你必须更加小心,处处陷进。这个2000多行代码中用了很多问题6中所指的方法。
整体看过这个代码后,发现里面主要东西就是hook,用自己的函数代替系统函数,按照自己逻辑处理问题。
使用了状态机,在一次change_state(from_state, to_state)中,用到了from_state,如果在改变的时候不处于from_state,则表明出错
好了。就这些。。告一段落。准备看查毒软件代码,因为原打算就是看查毒的了。中途杀出程咬金了。
文件:
dazuko_2003.pdf(一个官方的说明文档)
大小:
95KB
下载:
下载
一个网站
文件:
dazuko-1.0.0.tar (源代码)
大小:
60KB
下载:
下载