很难说出这个问题,但我会尝试。我想测试我的 USB 连接的性能,因此我在一个嵌入式设备上使用 gadgetfs,所以我可以只写一个文件描述符并将数据发送到主机。但是当我想发送大量数据时,我无法分配尽可能多的数据。
write(int fildes, const void *buf, size_t nbyte);
有没有办法将指针传递到内存中可以实际读取nbyte
字节的某个位置?我无法分配我想要发送的大小的数组或向量。导致我收到“无法分配内存”错误。
很难说出这个问题,但我会尝试。我想测试我的 USB 连接的性能,因此我在一个嵌入式设备上使用 gadgetfs,所以我可以只写一个文件描述符并将数据发送到主机。但是当我想发送大量数据时,我无法分配尽可能多的数据。
write(int fildes, const void *buf, size_t nbyte);
有没有办法将指针传递到内存中可以实际读取nbyte
字节的某个位置?我无法分配我想要发送的大小的数组或向量。导致我收到“无法分配内存”错误。
如果您的操作系统有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);
}
该write
函数将获取您提供的任何地址,并(尝试)nbyte
从该地址开始写入字节。只要可以读取内存,这应该可以正常工作。
如果您要发送超过几千字节的数据,通常最好以相对较小的大小(例如 4KB)进行多次写入,并使用循环来完成写入。