プログラマーがプログラムを移行するのを待っている64ビットエラーについて話すと、私はしばしば非難を耳にします。「ええ、そうです、これはあなたのWindowsで、こんなものです。 「。
「まあ、いや、私の好奇心の強い読者。」
Linuxカーネルの64ビットエラーに関する今日の投稿。
カーネルトラッキングシステム(バグトラッキングシステム)を備えたすばらしいサイトには、
バグ16603 (64ビットシステムで4 GBを超えるデータの送信)の説明が含まれています。 問題の本質は簡単です。「Linuxのsend()関数を使用してデータを送信すると、データサイズが大きすぎる場合にエラーが発生します。 glibcの関数は次のようになります。
ssize_t send(int sockfd、const void * buf、size_t len、intフラグ);
すべてが正しく、サイズはmemsize-type
size_tとして渡されます。 ただし、この引数はmsgheader構造体に格納され、その後、行はtcp_sendmsg関数の内部に入ります。
while(--iovlen> = 0){
int seglen = iov-> iov_len;
unsigned char __user * from = iov-> iov_base;
ここでは、長さはすでにintに格納されていますが、これはもちろん良くありません。 つまり、5ギガバイトのsend()ブロックで送信すると1ギガバイトのみが送信され、4ギガバイトのブロックを送信しても何も生成されません(「ゼロに丸める」ため)。
もちろん、回避策は明確です-0x8000000以下の長さを指定しますが、これは間違いであり、もちろん修正する必要があります。
はい、これは90年代の例ではありません。 このバグは2010年8月にオープンし、カーネルバージョン2.5に属します。 そして(2010年10月11日)は閉じていません。 そして、あなたはLinuxに64ビットの問題はないと言います...