我编写了一个内核模块,它将一些数据导出到创建的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]);
-----------------------------------
---------------------------------
---------------------------------

我看到默认情况下只有一个页面大小,即4KB被导出。我参考了ldd来找到如何导出大量数据。但我不明白上面写的是什么。有人能帮我一下吗?

最佳答案

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

关于linux - 如何写入处理大量数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8641095/

10-09 06:59
查看更多