0

很难说出这个问题,但我会尝试。我想测试我的 USB 连接的性能,因此我在一个嵌入式设备上使用 gadgetfs,所以我可以只写一个文件描述符并将数据发送到主机。但是当我想发送大量数据时,我无法分配尽可能多的数据。

write(int fildes, const void *buf, size_t nbyte);

有没有办法将指针传递到内存中可以实际读取nbyte字节的某个位置?我无法分配我想要发送的大小的数组或向量。导致我收到“无法分配内存”错误。

4

2 回答 2

4

如果您的操作系统有MAP_ANONYMOUS或者/dev/zero您可以将mmap其放入您的虚拟地址空间,直至最大可能的映射并从那里读取。

#include <sys/mman.h>

void * zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

这会将长度的连续映射分配nbytes到单个归零的只读页面,因此实际上不使用任何物理内存。您可以读取整个数组(并且只会得到零),但您不能写入它。

尽管由于物理硬件限制,大多数系统会限制您的最大连续虚拟映射。当前的 x86_64 Linux 一般支持 64TB 长映射。

注意:某些系统(例如 OS X,可能其他基于 BSD 的系统有,MAP_ANON而不是MAP_ANONYMOUS,请查阅man 2 mmap以找出确切的系统)。

如果MAP_ANONYMOUS您的系统不支持,但是/dev/zero等效的方法是:

void * zeroed_memory;
int fd = open("/dev/zero", O_RDONLY);
if (fd > 0) {
    zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE, fd, 0);
}
于 2013-06-06T10:31:01.393 回答
2

write函数将获取您提供的任何地址,并(尝试)nbyte从该地址开始写入字节。只要可以读取内存,这应该可以正常工作。

如果您要发送超过几千字节的数据,通常最好以相对较小的大小(例如 4KB)进行多次写入,并使用循环来完成写入。

于 2013-06-06T09:46:02.340 回答