我编写了内核模块,它执行nf_register_hook并使用字符设备机制将抓取的数据包通过设备读取挂钩获取到用户空间.我使用全局缓冲区和缓冲区变量,这就是为什么我需要在新数据包到来或用户阅读我的设备时锁定它.我使用了splinlock_irqsave和spin_unlock_irqrestore(&locker,flags),但是我的模块陷入死锁并且系统死机.
unsigned int main_hook(unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int(*okfn)(struct sk_buff*)) {
unsigned long flags;
spin_lock_irqsave(&locker,flags);
...
spin_unlock_irqrestore(&locker,flags);
}
ssize_t sniffer_dev_read(struct file *filep, char *buff, size_t count, loff_t *offp) {
spin_lock_irqsave(&locker,flags);
...
spin_unlock_irqrestore(&locker,flags);
}
main_hook is registered in nf_register_hook()
sniffer_dev_read is registered in register_chrdev
Run Code Online (Sandbox Code Playgroud)
当用户从设备读取时,系统进入死锁状态.想法?或者可能是irq保存/恢复与netfiler hook/char设备读取不兼容,我必须在这里使用特殊锁定?
我有我的测试代码(研究WP循环不变量),它在数组单元格中添加两个长整数,每个数字的表示形式:
int main(int argc, const char * argv[]) {
char a[32], b[32];//size can be very big
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s %s", a, b);
unsigned int size1 = strlen(a);
unsigned int size2 = strlen(b);
//code to reverse a string. currently proved
reverse(a, size1);
reverse(b, size2);
for (unsigned int i = 0; i < size1; i++) a[i]-='0'; //move from chars to integers
for (unsigned int j = 0; j < size2; j++) b[j]-='0';
unsigned int maxsize = size1;
if …Run Code Online (Sandbox Code Playgroud)