我必须从基于Linux的嵌入式主板上的struct iw_point
变量中的指针访问数据。 struct
中包含的指针属于__user
类型。但是当我尝试访问该位置时,程序会保持segfaulting。
当我查看该指针指向的内存位置时,我注意到该位置不在于必须从该位置读取的进程的地址空间(通过读取/proc/pid/maps
获得): / p>
00400000-0048c000 r-xp 00000000 1f:04 83 /root/aravind/smapp
0049b000-0049c000 rw-p 0008b000 1f:04 83 /root/aravind/smapp
指针返回的位置是E80000,它不在上面返回的范围内。
这是否意味着该位置位于程序的地址空间之外,首先触发指针返回(指针由ioctl调用返回)?
答案 0 :(得分:2)
SIOCGIWSCAN ioctl使用您输入的空间
iwr.u.data.pointer = p;
iwr.u.data.length = BUFSZ;
请求返回扫描的网络信息,因为ioctl无法在用户空间中分配返回区域。检查您是否正确初始化了此指针和数据长度(建议使用4k缓冲区)。如果你没有,你可能会得到这样的未定义结果。
另请确保始终检查ioctl
的返回值 - 如果出现错误,请不要尝试访问返回区域。
如果你做了所有这些并且它仍然没有返回有效指针:仍然有许多驱动程序不能正确支持无线扩展。
另外一些代码会让答案变得更容易 - 正如你所说的那样,如果不经常思考和猜测就很难回答。