0

質問を表現するのは難しいですが、試してみます。USB接続のパフォーマンスをテストしたいので、アンベッドデバイスでgadgetfsを使用しているので、ファイル記述子への書き込みを行うだけで、データがホストに送信されます。しかし、大量のデータを送信したい場合、必要なだけのデータを割り当てることができません。

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

nbyte実際にバイトを読み取ることができるメモリ内のどこかにポインターを渡す方法はありますか? 送信したいサイズの配列またはベクトルを割り当てることができません。「メモリを割り当てられません」というエラーが表示されます。

4

2 に答える 2

4

OSが持っている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 に答える