- 論壇徽章:
- 0
|
原帖由 mq110 于 2005-12-7 12:42 發(fā)表
內(nèi)核進程和用戶進程 共享內(nèi)存了 你如何實現(xiàn)互斥???
你說的<<Unix環(huán)境高級編程>>只是提到了System V 共享內(nèi)存的方式。他是用戶態(tài)的。。不是我說的內(nèi)核進程和用戶進程共享內(nèi)存的方式。
可能我誤解你的意思了!
但是偶認(rèn)為,包過濾函數(shù)與用戶空間操作函數(shù)之間共享規(guī)則:
1、可以通過共享空間來完成的,在Win下邊做防火墻,偶就是這樣子做的;至于linux下內(nèi)核與用戶進程共享內(nèi)存的互斥,到是沒有做過。實現(xiàn)不行,用最笨的方法,自己實現(xiàn)互斥鎖應(yīng)該是可以的吧,回頭我做做測試先。
2、netfilter在實現(xiàn)的時候,應(yīng)該是使用 find_table_lock來實現(xiàn)的,不過偶沒有認(rèn)真地跟下去看這個函數(shù)了。如果我沒有分析錯的話,iptables通過調(diào)用setsockopt函數(shù),進過層層調(diào)用,最后是
nf_sockopts(),它事實上是操作了:
static struct nf_sockopt_ops ipt_sockopts
= { { NULL, NULL }, PF_INET, IPT_BASE_CTL, IPT_SO_SET_MAX+1, do_ipt_set_ctl,
IPT_BASE_CTL, IPT_SO_GET_MAX+1, do_ipt_get_ctl, 0, NULL };
因為在這個結(jié)構(gòu)中,封裝了set/get函數(shù)。比如get,它把內(nèi)核空間的規(guī)則拷貝到用戶這間:
static int
do_ipt_get_ctl(struct sock *sk, int cmd, void *user, int *len)
……
case IPT_SO_GET_ENTRIES: {
struct ipt_get_entries get;
if (*len < sizeof(get)) {
duprintf("get_entries: %u < %u\n", *len, sizeof(get));
ret = -EINVAL;
} else if (copy_from_user(&get, user, sizeof(get)) != 0) {
ret = -EFAULT;
} else if (*len != sizeof(struct ipt_get_entries) + get.size) {
duprintf("get_entries: %u != %u\n", *len,
sizeof(struct ipt_get_entries) + get.size);
ret = -EINVAL;
} else
ret = get_entries(&get, user);
break;
}
進入get_entries
static int
get_entries(const struct ipt_get_entries *entries,
struct ipt_get_entries *uptr)
{
int ret;
struct ipt_table *t;
t = find_table_lock(entries->name, &ret, &ipt_mutex);
if (t) {
duprintf("t->private->number = %u\n",
t->private->number);
if (entries->size == t->private->size)
ret = copy_entries_to_user(t->private->size,
t, uptr->entrytable);
else {
duprintf("get_entries: I've got %u not %u!\n",
t->private->size,
entries->size);
ret = -EINVAL;
}
up(&ipt_mutex);
} else
duprintf("get_entries: Can't find %s!\n",
entries->name);
return ret;
}
find_table_lock用于返回查找的表的元素,同時第三個參數(shù)應(yīng)該即為互斥鎖,應(yīng)該就是你所關(guān)心的。不過前一遍看它時并沒有仔細地分析它。我看完第二遍的時候,或許可以寫個詳盡的分析出來。
[ 本帖最后由 獨孤九賤 于 2005-12-7 13:16 編輯 ] |
|