Linux参数传递

本文详细介绍了内核态与用户态传递参数时遇到的问题,包括数据打印错误和ioctl死机现象,并提供了有效的解决方法。通过深入分析数据量过大导致的栈溢出问题,提出将结构体定义为全局变量作为解决方案。

最近内核态和用户态传递参数出现了一些问题

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;定义为全局变量

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值