LINUX.ORG.RU

Передача и вывод int в ядре.


0

0

Пишется модуль для ядра. Вообщем тут надо передать из одной функции в
другой целое число. Но при передаче вылетает сегфолт.

Jul  3 16:02:22 dell kernel: Unable to handle kernel NULL pointer dereference at virtual address 00000002
Jul  3 16:02:22 dell kernel:  printing eip:
Jul  3 16:02:22 dell kernel: c01d32c9
Jul  3 16:02:22 dell kernel: *pde = 00000000
Jul  3 16:02:22 dell kernel: Oops: 0000 [#1]
Jul  3 16:02:22 dell kernel: Modules linked in: netfw speedstep_lib freq_table thermal processor fan button battery ac rfcomm irtty_sir hidp sir_dev irda l2cap crc_ccitt snd_pcm_oss snd_mixer_oss snd_seq_midi snd_seq_midi_event snd_seq hci_usb bluetooth evdev joydev sg st sr_mod pcmcia edd ipt_state ip6t_REJECT ipt_REJECT iptable_mangle iptable_filter ip6table_mangle ip_nat_ftp iptable_nat ip_conntrack_ftp ip_conntrack ip_tables ip6table_filter ip6_tables ipv6 snd_es1968 gameport snd_ac97_codec snd_pcm snd_timer snd_page_alloc snd_mpu401_uart snd_rawmidi snd_seq_device snd soundcore video1394 ohci1394 uhci_hcd yenta_socket i2c_piix4 intel_agp rsrc_nonstatic i2c_core agpgart usbcore pcmcia_core raw1394 ieee1394 capability parport_pc lp parport sd_mod scsi_mod dm_mod reiserfs ide_cd cdrom ide_disk piix ide_core
Jul  3 16:02:22 dell kernel: CPU:    0
Jul  3 16:02:22 dell kernel: EIP:    0060:[<c01d32c9>]    Tainted: G     U VLI
Jul  3 16:02:22 dell kernel: EFLAGS: 00010006   (2.6.11.4-20a-default)
Jul  3 16:02:22 dell kernel: EIP is at vsnprintf+0x39/0x510
Jul  3 16:02:22 dell kernel: eax: c03b61df   ebx: 00000400   ecx: 00000002   edx: 00000400
Jul  3 16:02:22 dell kernel: esi: c03b61e0   edi: c8c40595   ebp: c03b65df   esp: c640bef4
Jul  3 16:02:22 dell kernel: ds: 007b   es: 007b   ss: 0068
Jul  3 16:02:22 dell kernel: Process insmod (pid: 6552, threadinfo=c640a000 task=c65a75a0)
Jul  3 16:02:22 dell kernel: Stack: c6030560 f801bf80 c640bf14 00000400 c03b61e0 00000002 00000400 00000246
Jul  3 16:02:22 dell kernel:        c8c40595 c8c413d0 c01d37ac c640bf50 c640bf50 c011a1cc c640bf50 c640bf9c
Jul  3 16:02:22 dell kernel:        00000002 c8c40595 c011a18f 00000002 c640bf50 c8c4006a 00000002 c8c4057e
Jul  3 16:02:22 dell kernel: Call Trace:
Jul  3 16:02:22 dell kernel:  [<c01d37ac>] vscnprintf+0xc/0x20
Jul  3 16:02:22 dell kernel:  [<c011a1cc>] vprintk+0x2c/0x100
Jul  3 16:02:22 dell kernel:  [<c011a18f>] printk+0xf/0x20
Jul  3 16:02:22 dell kernel:  [<c8c4006a>] set_chain+0x6a/0xc0 [netfw]
Jul  3 16:02:22 dell kernel:  [<c8c401b5>] test+0x55/0x60 [netfw]
Jul  3 16:02:22 dell kernel:  [<c0110074>] acpi_copy_wakeup_routine+0x14/0xa0
Jul  3 16:02:22 dell kernel:  [<c8c401fc>] netfw_init+0x3c/0x40 [netfw]
Jul  3 16:02:22 dell kernel:  [<c012e9a4>] sys_init_module+0x104/0x180
Jul  3 16:02:22 dell kernel:  [<c0102c49>] sysenter_past_esp+0x52/0x79
Jul  3 16:02:22 dell kernel: Code: 54 24 0c 0f 88 8e 00 00 00 8b 74 24 10 8b 44 24 0c 89 4c 24 14 8d 6c 30 ff 89 f0 48 39 c5 73 0b 89 f2 83 cd ff f7 da 89 54 24 0c <80> 39 00 75 1a eb 40 39 ee 77 06 88 06 8b 4c 24 14 46 89 c8 41

Я сначалу не мог понять в чём причина, но потом решил вывести через printk все переменные которые передаются в функцию. И увидел что сегволт вылетает именно при попытке вывести переменную int.

int set_chain (int act, char table[], int id, char *par[], char *arg[], int num)
{
	int i;
	for(i = 0; i <= num_tables - 1; i++)
	{
		if(!strcmp(tables[i].tab_name,table)) printk("FOUND\n");// tables[0].set_rule(act,id,par,arg,num);
// 		printk((char)act);
// 		printk("\n");
		printk(table);
		printk("\n");
// 		printk(id);
// 		printk("\n");
		printk(par[0]);
		printk("\n");
		printk(arg[0]);
		printk("\n");
// 		printk(num);
// 		printk("\n");
	}
	return ADD_SUCCESS;
}

Все переменные целого типа закоментировал, но если разкоментировать вывод хотя бы одной, то будет сег. ВСЕ char ВЫВОДЯТСЯ НОРМАЛЬНО.
А вызов такой:

void test(void)
{
	char tab[] = "input";
	char *par[] = {{"from"},{"to"}};
	char *arg[] = {{"ip_from"},{"ip_to"}};
	int n = 2;
	set_chain(ADD_RULE,tab,666,par,arg,n);
}

А поскольку при вызове tables[0].set_rule(act,id,par,arg,num) так же вылетает сегфолт то я пришёл к выводу что проблемма именно в integer'е.

Вообщем и встал вопрос - что делать? Неуж то есть какая то особенность в С по сравнению с С++?

Заранее спасибо!!!
★★★★★

Ответ на: комментарий от Murr

Ну короче пока хрен с ним, первый вывод был ошибочен, виновато не int
а указатель на функцию, вернее почему-от его отсутствие. Есть структура

struct netfw_table{
	char* name;			//module name
	char* tab_name;		//name of parametr
	void (* set_rule) (void);	//point to function
};

заполнена так

	in_table.name = "input";
	in_table.tab_name = "input";
	in_table.set_rule = input_set_rule;
	table_register(in_table);

а сама функция input_set_rule задаётся так

void input_set_rule(void)
{
	printk("TEST!!!\n");
}

вызов такой

tables[0].set_rule();

(Для простоты убрал все аргументы функций).
Если внимательно посмотреть лог, то там видно что указатель оказывается нулевой,
что здесь не так, подскажите ПЛЗ!!!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Всё разобрался.

Пы.Сы. пропустил одно место, где происходит передача указателя :)

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.