実際のプログラムでの64ビットコードの問題:Linuxはどうですか?

プログラマーがプログラムを移行するのを待っている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ビットの問題はないと言います...



All Articles