当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 锁的问题
帖子发表于 : 2008-10-15 20:51 
头像

注册: 2008-03-31 16:12
帖子: 94
送出感谢: 0 次
接收感谢: 0 次
大家好看一下,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操作激发钩子函数的运行。

呜呜呜。。。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译