无法理解gadgetfs中的部分代码

时间:2013-12-21 22:11:23

标签: c++ c usb

位于以下位置的示例文件“usb.c”中

http://www.linux-usb.org/gadget/usb.c

init_device函数内部,我无法理解作者想要将缓冲区转换为指针的原因。这是一个缩短的代码段:

char buf [4096], *cp = &buf [0];
int fd;
int status = 0;
char *DEVNAME = "musb-hdrc";

if (status < 0) {
    fprintf (stderr, "?? don't recognize /dev/gadget %s device\n", "iso");
    return status;
}

fd = open (DEVNAME, O_RDWR);
if (fd < 0) {
    perror (DEVNAME);
    return -errno;
}

*(__u32 *)cp = 0;   /* tag for this format */
cp += 4;

/* write configs */
cp = build_config (cp, hs_eps);

/* and device descriptor at the end */
memcpy (cp, &device_desc, sizeof device_desc);
cp += sizeof device_desc;

status = write (fd, &buf [0], cp - &buf [0]);

char buf [4096], *cp = &buf [0]; int fd; int status = 0; char *DEVNAME = "musb-hdrc"; if (status < 0) { fprintf (stderr, "?? don't recognize /dev/gadget %s device\n", "iso"); return status; } fd = open (DEVNAME, O_RDWR); if (fd < 0) { perror (DEVNAME); return -errno; } *(__u32 *)cp = 0; /* tag for this format */ cp += 4; /* write configs */ cp = build_config (cp, hs_eps); /* and device descriptor at the end */ memcpy (cp, &device_desc, sizeof device_desc); cp += sizeof device_desc; status = write (fd, &buf [0], cp - &buf [0]);

作者想要创建吗?不会写入数组的第一个元素的地址只是写入数组?看起来当他真正使用他写给*cp的内容时,他最终还是会使用缓冲区......

此外,他究竟在做什么:

*cp

那是某种指向指针的指针吗?为什么要为它添加4然后再将其写入?

我觉得我理解这个程序中发生的大部分事情,但有些事让我感到困惑......

2 个答案:

答案 0 :(得分:1)

这意味着“将cp强制转换为__u32 *,然后退出(外部*)并指定0。 这样做是为了写入正确的字节数(4个字节,假设__u32是32位类型)。

答案 1 :(得分:1)

作者创建cp,以便他们有一个指向数组的指针。然后他们可以用cp += 4;移动指针(我们将看到为什么步骤为4秒)并在这个新位置处进行操作。

*(__u32 *)cp = 0;首先将指针强制转换为类型__u32*,我只能假设它是指向4字节无符号整数的指针。然后,他们取消引用此指针并将值0写入它指向的对象。请记住,缓冲区由char组成,大小为1个字节,指针cpchar*。他们将指针转换为__u32*,这样他们就可以一次写入4个字节的缓冲区。因此,当cp指向缓冲区中的第一个元素时,它们最终将缓冲区的前4个字节设置为0.这就是为什么它们将指针移动到4个元素,以便它们可以处理后面的所有内容。前4个字节。