【问题标题】:VxWorks passing struct address into ioctlVxWorks 将结构地址传递给 ioctl
【发布时间】:2021-05-03 21:23:49
【问题描述】:

我正在尝试将结构的地址作为ioctl() 的第三个参数传递。当我尝试在 my_ioctl() 中读取结构成员时,我无法访问它们。我在将地址传递给 ioctl() 之前读取了地址,然后将 my_ioctl() 内的地址转换为结构指针类型并将其分配给新的指针变量。然后,当我再次读取地址时,它与我最初传入的地址不匹配。

所以

MY_STRUCT struct;

MY_STRUCT *pStruct = &struct;  

printf("address before ioctl: x%08X\n", (int)pStruct);

if(ioctl(fd, command, (int)pStruct) < 0)

。 . .

然后在驱动中


int my_ioctl(struct dev *pDev, int cmd, int arg)

MY_STRUCT *pStruct = (MY_STRUCT*)arg;

printf("addr in ioctl: x08X\n", pStruct);
   
   switch(cmd) 

。 . .

为什么地址变了?

【问题讨论】:

  • 你需要做copy_from_user
  • @stark 我已经在 linux 驱动程序中看到过,但是 vxworks 是否也有 copy_from_user 函数?
  • 在第二个 printf() 中,格式中缺少 %。是错字吗?

标签: c driver ioctl vxworks


【解决方案1】:

将指针转换为整数是一种不好的做法。比如在x86_64上,一个指针是8字节长,一个整数是4字节长...

根据this documentioctl() 的第三个参数具有适合目标架构的类型:

第三个参数可选,推荐_Vx_ioctl_arg_t类型,那么对于VxWorks 32-bits,这是一个32-bits类型,对于VxWorks 64-bits,这是一个64-bits类型。

【讨论】:

  • 确实如此。我刚刚查看了 ioLib.h,对于我的系统,_Vx_ioctl_arg_t 被定义为 int。我将演员表更改为 (_Vx_ioctl_arg_t) 只是为了正确,但结果仍然相同。
  • 架构是什么:64位还是32位?
  • 请用您所做的编辑您的答案,因为将“if (ioctl(fd, command, (int)pStruct)
  • 它是 32 位的,这就是为什么我说 _Vx_ioctl_arg_t 与 int 相同。 _Vx_ioctl_arg_t 被定义为 int 所以没关系。它不会改变行为。无论如何,编译器都会用 int 替换 _Vx_ioctl_arg_t。
【解决方案2】:

几个月前我遇到了同样的问题。这里的问题很可能是某些 IOCTL cmds 被 vxWorks 阻止/已经使用(在版本 7 SR620 上测试)。

检查您是否获得 cmd 代码 64。如果您获得 64 作为 cmd 您的地址,那么您获得的最有可能是垃圾。

一位同事检查了通过的 ioctl cmds,发现 cmds 2,3,7,14,15,19,20,21,.. 应该通过,但不能保证这些命令代码对您有效。

【讨论】:

  • 是的,我与 vxworks 支持技术人员进行了交谈,结果就是这样。碰巧我看到这个问题时传递的 cmd 是分配一块内存并传递该地址而不是结构地址。看起来我的结构被破坏了,但实际上它是完全不同的内存块。我必须为我的所有 cmds 添加一个偏移量,以将它们全部推过 vxworks 预定义的 cmds。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2019-09-19
相关资源
最近更新 更多