锁的问题

软件和网站开发以及相关技术探讨
回复
头像
zongzw
帖子: 94
注册时间: 2008-03-31 16:12

锁的问题

#1

帖子 zongzw » 2008-10-15 20:51

大家好看一下,spin_lock是干什么的,什么情况下用,我下面的这个情况老是死机,但我不知道为什么。~~

代码: 全选

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <asm/atomic.h>
#include <asm/semaphore.h>
#include <asm/io.h>
#include <asm/system.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/jiffies.h>
#include <linux/init.h>
#include <linux/net.h>
#include <linux/types.h>
#include <linux/skbuff.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netdevice.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/mutex.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/version.h>
#include <net/udp.h>
#include <net/tcp.h>
#include <net/icmp.h>

spinlock_t mylock;
static int i = 1;
int lock_flags;

static unsigned int 
lock_mylock(unsigned int hook,
			struct sk_buff **pskb,
			const struct net_device *in, 
			const struct net_device *out,
			int (*okfn)(struct sk_buff *))
{
	if(0==i%10)
	{
		//i++;
		printk(KERN_EMERG"lock_mylock : i is %d\n", i);
	}
	
	if(0 != spin_trylock(&mylock))
	{
	  spin_unlock(&mylock);
	  printk(KERN_EMERG"hook locked success: i is %d\n", i);
	}
	else
	{
	  printk(KERN_EMERG"hook locked failed: i is %d\n", i);		
	}
	
	i++;
	return 0;
}

static struct nf_hook_ops mylock_ops = 
{ 
	.hook     = lock_mylock,
	.owner    = THIS_MODULE,
	.pf       = PF_INET,
	.hooknum  = NF_IP_PRE_ROUTING,//NF_IP_FORWARD,
	.priority = NF_IP_PRI_FIRST,//NF_IP_PRI_FILTER-2,
};

int test_mod_init(void)
{
	int ret;
	printk("test_mod_init : start\n");
	
	mylock = SPIN_LOCK_UNLOCKED;

	lock_flags =1;
	spin_lock(&mylock);

	ret = nf_register_hook(&mylock_ops);
	
  if (ret < 0)
	{
		printk("filter_ops ERROR\n");
		return ret;
	}
	
	spin_unlock(&mylock);

	printk("test_mod_init : stop\n");
	return 0;
}

void test_mod_exit(void)
{
	nf_unregister_hook(&mylock_ops);
}

module_init(test_mod_init);
module_exit(test_mod_exit);

//------------------------------------
//Makefile
MODULE_NAME :=lock_mod

RESMAN_CORE_OBJS :=mod.o

$(MODULE_NAME)-objs := $(RESMAN_CORE_OBJS)

obj-m  :=$(MODULE_NAME).o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
	#mv ./rule.ko ../../../bin/
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
	rm -f ./Module.symvers *~

运行时使用ping操作激发钩子函数的运行。

呜呜呜。。。
回复