Пишется модуль для ядра. Вообщем тут надо передать из одной функции в
другой целое число. Но при передаче вылетает сегфолт.
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'е.
Вообщем и встал вопрос - что делать? Неуж то есть какая то особенность в С по сравнению с С++?
Заранее спасибо!!!
cyclon ★★★★★
03.07.05 16:12:49 MSD