Как написать, чтобы обработать большой объем данных - PullRequest
1 голос
/ 27 декабря 2011

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

Я использовал функцию int read_proc(char *buf,char **start,off_t offset,int count, int *eof, void *data) для экспорта данных.И я написал данные как:

    length =sprintf(buf,"The RESTART_SYSCALL address is %x\n",syscall_table[__NR_restart_syscall]);
    length +=sprintf(buf+length,"The EXIT address is %x\n",syscall_table[__NR_exit]);
    length +=sprintf(buf+length,"The FORK address is %x\n",syscall_table[__NR_fork]);   
    length +=sprintf(buf+length,"The READ address is %x\n",syscall_table[__NR_read]);
    length +=sprintf(buf+length,"The WRITE address is %x\n",syscall_table[__NR_write]);
    length +=sprintf(buf+length,"The OPEN address is %x\n",syscall_table[__NR_open]);
    length +=sprintf(buf+length,"The CLOSE address is %x\n",syscall_table[__NR_close]);
    length +=sprintf(buf+length,"The WAITPID address is %x\n",syscall_table[__NR_waitpid]);
    length +=sprintf(buf+length,"The CREAT address is %x\n",syscall_table[__NR_creat]);
    length +=sprintf(buf+length,"The LINK address is %x\n",syscall_table[__NR_link]);
    length +=sprintf(buf+length,"The UNLINK address is %x\n",syscall_table[__NR_unlink]);
    length +=sprintf(buf+length,"The EXECVE address is %x\n",syscall_table[__NR_execve]);
    length +=sprintf(buf+length,"The TIME address is %x\n",syscall_table[__NR_time]);
    length +=sprintf(buf+length,"The MKNOD address is %x\n",syscall_table[__NR_mknod]);
    length +=sprintf(buf+length,"The LCHOWN address is %x\n",syscall_table[__NR_lchown]);
    length +=sprintf(buf+length,"The BREAK address is %x\n",syscall_table[__NR_break]);
    length +=sprintf(buf+length,"The OLDSTAT address is %x\n",syscall_table[__NR_oldstat]);
    length +=sprintf(buf+length,"The LSEEK address is %x\n",syscall_table[__NR_lseek]);
    length +=sprintf(buf+length,"The GETPID address is %x\n",syscall_table[__NR_getpid]);
-----------------------------------
---------------------------------
---------------------------------

Я прочитал, что по умолчанию экспортируется только один PAGE_SIZE, то есть 4 КБ.Я сослался на LDD, чтобы найти способ экспортировать большое количество данных.Но я не мог понять, что там написано.Может ли кто-нибудь помочь мне в этом.

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Вы можете использовать оболочку «seq file» (linux / seq_file.h).
Это позволяет вам определить функцию обратного вызова, которая возвращает одну строку данных, и Linux вызывает этот обратный вызов столько раз, сколько необходимо.
Если каждая строка меньше 4K, это довольно просто.Я не уверен, что он поддерживает большие строки.

1 голос
/ 27 декабря 2011

Взгляните на средства отладки , доступные в ядре. Вероятно, вы можете экспортировать больше данных, чем 4 КБ через файл в debugfs.

Если это не помогает, передача данных через сокеты netlink также может быть вариантом для вашей задачи.

...