LINUX.ORG.RU

Сообщения Inversiya

 

Есть ли удалённое счастье? (x11)

Есть удалённый сервер. И появилась необходимость запуска удалённых приложений на нём. Именно приложений, а не всей сессии! Желательно через ssh. Мне нравиться как это реализовано в x11 forwarding. Запускаешь через «$ имя_программы &» и дальше сидишь в консоле... Я даже запустил удалённый xfce-panel с единственной Application menu. очень удобно.. Но есть одно значительное НО... вся эта связка безбожно тормозит и не всегда корректно отрисовывает выпадающие пункты меню. Даже с компрессией это доставляет жуткую боль при работе. ))

Посему вопрос: Есть ли нормальные решения этой задачи? Я понимаю что тема избита... но ответа я так и не нашёл... Есть vnc (в разных вариантах), nomashine и т.д. но всё это для проброса целой сессии.. чего мне не нужно..

P.S. желательно кроссплатформенное решение, т.к. запуск нужен и с win машин.

 , ,

Inversiya
()

блокировка чтения-записи для спин-блокировки KERNEL

Здравствуйте.

Есть вопрос по использованию блокировок чтения-записи для спин-блокировок в ядре. А точнее, как часто можно их захватывать. Выбор пал на спин-блокировки, по причине, не перевода задачи в блокированное состояние и переключение контекста.

Есть структура (двусвязный список), для примера:

struct list {
        rw_lock_t *list_lock;
        char *pointer;
        struct list *next;
        struct list *prev;
}

Для доступа на чтение к pointer захватываем блокировки read_lock и read_unlock соответственно. Происходит это достаточно часто... Может 1000, а может и 10000 раз в секунду (точно не измерял). Соответственно для записи write_lock и write_unlock. Запись происходит редко...

Собственно, в момент захвата блокировки, в рандомный момент ядро падает в панику. т.е. может упасть через минуту работы а может и больше... Падает на ф-ции чтения состояния блокировки, точно не помню как называется.

И по этому вопрос, как часто эти блокировки можно захватывать?

И какое кол-во их(блокировок) можно «наплодить»? т.к. структкра может разростись до 1000-10000 записей...

А может я что-то делаю не так?

UPD: на сколько я помню, падало именно при захвате на запись... но это не точно... т.к. эти изыскания я делала может пол а может год назад. Пока код работает вообще бед блокировок... но этож не тру... )))

Inversiya
()

Динамические масивы в kernel

Господа, прошу помощи!
Есть вот такой кусок кода:

i = 0;
num_line = 0;

list = kmalloc(100, GFP_ATOMIC);

if (!list) {
	logger(3, "tratata");
} else {
	while (i < (int)l) {
		if (buff[i] == 0x0A) {
			if ((int)ksize(list) >= num_line) {
				list[num_line] = (char *)kmalloc((int)(i - offset), GFP_KERNEL);
				if (!list[num_line]) {
					printk (KERN_INFO "Fuck... %d\n", num_line);
				}
			}
			num_line++;
			offset = i + 1;
		}
		i++;
	}
}

Здесь:
l = размер массива buff
0x0A - признак конца строки (\n)

Без этого участка, всё хорошо. А с ним ядро валится то в упс, то в панику... Причём в рандомный момент времени... Может в момент загрузки модуля, может чуть позже, может в момент выгрузки....
Этот код выполняется один раз в момент загрузки модуля....

И теперь вопрос: Что я не так навертел с этим масивом?

вот что в логе: (Здесь по моему грохнулось когда я выгружал модуль...)

Jul  5 13:35:25 test kernel: [  263.678264] Start module filter
Jul  5 13:35:52 test kernel: [  290.720042] num line 100
Jul  5 13:35:52 test kernel: [  290.720428] PGD 183cf067 PUD 1bd77067 PMD 0
Jul  5 13:35:52 test kernel: [  290.720568] Oops: 0000 [#1] SMP
Jul  5 13:35:52 test kernel: [  290.720701] Modules linked in: filter(OF-) xt_nat(F) iptable_nat(F) nf_conntrack_ipv4(F) nf_defrag_ipv4(F) nf_nat_ipv4(F) nf_nat(F) nf_conntrack(F) ip_tables(F) x_tables(F) ext2(F) joydev(F) hid_generic(F) cirrus(F) ttm(F) drm_kms_helper(F) snd_pcm(F) psmouse(F) snd_timer(F) serio_raw(F) drm(F) snd(F) tpm_tis(F) soundcore(F) snd_page_alloc(F) sysimgblt(F) microcode(F) sysfillrect(F) i2c_piix4(F) syscopyarea(F) pcspkr(F) mac_hid(F) usbhid(F) hid(F) floppy(F)
Jul  5 13:35:52 test kernel: [  290.721454] CPU 0
Jul  5 13:35:52 test kernel: [  290.721474] Pid: 1678, comm: rmmod Tainted: GF          O 3.7.6 #1 Bochs Bochs
Jul  5 13:35:52 test kernel: [  290.721724] RIP: 0010:[<ffffffffa01a94e0>]  [<ffffffffa01a94e0>] load_list+0x200/0x2e0 [filter]
Jul  5 13:35:52 test kernel: [  290.721919] RSP: 0018:ffff8800180ade68  EFLAGS: 00010202
Jul  5 13:35:52 test kernel: [  290.722076] RAX: 0000000000000000 RBX: 0000000000000880 RCX: ffffffff81e1eddc
Jul  5 13:35:52 test kernel: [  290.722226] RDX: 000000000000256e RSI: 0000000000000086 RDI: 0000000000000246
Jul  5 13:35:52 test kernel: [  290.722375] RBP: ffff8800180adeb8 R08: 000000000000fffe R09: 0000000000000006
Jul  5 13:35:52 test kernel: [  290.724016] R10: 00000000000001b5 R11: 0000000000000000 R12: ffffffffa01ab000
Jul  5 13:35:52 test kernel: [  290.724016] R13: ffff8800180adf18 R14: 0000000000000000 R15: 0000000000000001
Jul  5 13:35:52 test kernel: [  290.724016] FS:  00007f8815f23700(0000) GS:ffff88001fc00000(0000) knlGS:0000000000000000
Jul  5 13:35:52 test kernel: [  290.724016] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Jul  5 13:35:52 test kernel: [  290.724016] CR2: 0000000000000000 CR3: 000000001bd51000 CR4: 00000000000006f0
Jul  5 13:35:52 test kernel: [  290.724016] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Jul  5 13:35:52 test kernel: [  290.724016] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Jul  5 13:35:52 test kernel: [  290.724016] Process rmmod (pid: 1678, threadinfo ffff8800180ac000, task ffff88001dff1700)
Jul  5 13:35:52 test kernel: [  290.724016] Stack:
Jul  5 13:35:52 test kernel: [  290.724016]  ffff8800180ade88 ffffffff816b25fe 0000000000000000 ffff8800180adee8
Jul  5 13:35:52 test kernel: [  290.724016]  ffff8800180ade98 0000000000000880 ffffffffa01ab000 ffff8800180adf18
Jul  5 13:35:52 test kernel: [  290.724016]  0000000000000000 0000000000000001 ffff8800180adec8 ffffffffa01a95d0
Jul  5 13:35:52 test kernel: [  290.724016] Call Trace:
Jul  5 13:35:52 test kernel: [  290.724016]  [<ffffffff816b25fe>] ? mutex_lock+0x1e/0x50
Jul  5 13:35:52 test kernel: [  290.724016]  [<ffffffffa01a95d0>] cleanup_module+0x10/0x30 [url_filter]
Jul  5 13:35:52 test kernel: [  290.724016]  [<ffffffff810bd33e>] sys_delete_module+0x19e/0x270
Jul  5 13:35:52 test kernel: [  290.724016]  [<ffffffff816b8ffa>] ? do_page_fault+0x3a/0x50
Jul  5 13:35:52 test kernel: [  290.724016]  [<ffffffff816bd699>] system_call_fastpath+0x16/0x1b
Jul  5 13:35:52 test kernel: [  290.724016] Code: 1a a0 bf 03 00 00 00 e8 0f fc ff ff eb cd 8b 35 97 1d 00 00 48 c7 c7 ca a0 1a a0 31 c0 e8 86 87 50 e1 eb 0f 48 8b 05 88 1d 00 00 <48> 8b 38 e8 58 55 fd e0 83 3d 71 1d 00 00 00 79 e8 48 8b 3d 70
Jul  5 13:35:52 test kernel: [  290.724016]  RSP <ffff8800180ade68>
Jul  5 13:35:52 test kernel: [  290.724016] CR2: 0000000000000000
Jul  5 13:35:52 test kernel: [  290.777684] ---[ end trace 65e338c3db344ba2 ]---

 , ,

Inversiya
()

sk_buff Данные из пакета

Пишу (пытаюсь) модуль для ядра (анализ пакетов), но знаний в Си и в сетевой подсистеме Linux маловато...
Не могу вытянуть из sk_buff данные пакета. Точнее там какаято чушь...
Кусок кода

unsigned int Hook_Func(uint hooknum,
                        struct sk_buff *skb,
                        const struct net_device *in,
                        const struct net_device *out,
                        int (*okfn)(struct sk_buff *)  )
{
struct iphdr *ip;
struct tcphdr *tcp;
...................
        memcpy(data, skb->data + sizeof(ip) + sizeof(tcp), skb->data_len);
        printk (KERN_INFO "%s\n", data);
        printk (KERN_INFO "%u\n", skb->len);
        printk (KERN_INFO "%u\n", skb->data_len);
...................
    return NF_ACCEPT
...................

пробовал и так: sprintf (data, «%s», (char*)skb->data);
Игрался и с отступом (sizeof(ip) + sizeof(tcp)) и с размером (skb->data_len)
Выдаёт либо «E», либо такую хрень:

[57414.859619] Data:
[57414.859625] W▒▒▒▒
[57414.859626] 150
[57414.859626] 110

А там HTTP передаётся...

Подскажите пожалуйста где загвоздка

Inversiya
()

RSS подписка на новые темы