最近内核态和用户态传递参数出现了一些问题
1.假设传递16K的数据打印信息,发现只打印了4k数据
typedef struct {
unsigned int type;
unsigned int addr;
unsigned int len;
unsigned int cmd;
unsigned int *prv;
}fpga_opt_t;
static int wmsc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
fpga_opt_t tmp;
fpga_opt_t *ptmp = &tmp;
switch(cmd)
{
case 3094:
printk("\nwmsc_write is write ram is:\n");
copy_from_user((unsigned char *)ptmp,(unsigned char *)arg,sizeof(fpga_opt_t));
start =4093;
for( i=start; i<(start +16); i++){
if( i%8 ==0)
printk("\n");
printk("0x%04x ",*( (unsigned char *)( ( (fpga_opt_t *)ptmp)->prv +i)) );
}
break;
}
解决方法:因为结构体中是数组指针,所以需要copy两次
2.在ioctl中copy_from_user出现死机
typedef struct {
unsigned int type;
unsigned int addr;
unsigned int len;
unsigned int cmd;
unsigned int prv[8192];
}fpga_opt_t;
static int wmsc_ioctl(struct
inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
fpga_opt_t tmp;
fpga_opt_t *ptmp = &tmp;
switch(cmd)
{
case 3094:
printk("\nwmsc_write is write ram is:\n");
copy_from_user((unsigned char *)ptmp,(unsigned char *)arg,sizeof(fpga_opt_t));
start =4093;
for( i=start; i<(start +16); i++){
if( i%8 ==0)
printk("\n");
printk("0x%04x ",*( (unsigned char *)( ( (fpga_opt_t *)ptmp)->prv +i)) );
}
break;
}
原因是数据量太大,超出栈大小。
解决方法:fpga_opt_t tmp;定义为全局变量
本文详细介绍了内核态与用户态传递参数时遇到的问题,包括数据打印错误和ioctl死机现象,并提供了有效的解决方法。通过深入分析数据量过大导致的栈溢出问题,提出将结构体定义为全局变量作为解决方案。
604

被折叠的 条评论
为什么被折叠?



