2011-12-27 87 views
1

我编写了一个内核模块,用于将一些数据量导出到创建的proc条目中。如果数据量较少,我可以轻松创建一个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,即4kb导出。我介绍了LDD以找出如何导出大量数据。但我无法理解那里写的是什么。任何人都可以帮助我。

+0

我会看看例如'/ proc/self/maps'或'/ proc/vmallocinfo'。他们可能每次写一行,并保持某种状态。 – 2011-12-27 06:32:02

回答

3

您可以使用“seq文件”包装器(linux/seq_file.h)。
这使您可以定义一个返回一行数据的回调函数,并且Linux根据需要多次调用此回调函数。
如果每行都在4K以下,那就很简单。我不确定它是否支持更大的行数。

1

看看在内核中可用的debugfs facilities。您可能可以通过debugfs中的文件导出比4k更多的数据。

如果这没有帮助,通过netlink套接字传输数据也可能是您的任务的选项。