Говоря о 64-битных ошибках, которые подстерегают программистов при миграции своих программ, я часто слышу упреки: «Ну да, эта ваша Windows такая… Хорошо, что в Linux с 64-битным кодом проблем больше нет» " — Ан нет, мой пытливый читатель.
Сегодняшний пост посвящен 64-битной ошибке в ядре Linux. Замечательный сайт с системой отслеживания ошибок для разработчиков ядра содержит описание ошибка 16603 (отправка данных > 4 ГБ невозможна в 64-битных системах).
Проблема проста: «Отправка данных с помощью функции Linux send() приводит к ошибке, если размер данных слишком велик.
Функция glibc выглядит следующим образом:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);Все правильно, размер передается как memsize тип 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, но это ошибка и ее конечно надо исправлять.
Да и это не пример из девяностых.
Ошибка была обнаружена в августе 2010 года и относится к версии ядра 2.5. И он еще не закрыт (11 октября 2010 г.
).
А вы говорите, что в Linux нет проблем с 64-битной системой.
Теги: #64-бит #linux #C++
-
Почему Билл Гейтс Ненавидит Луксор
19 Oct, 24 -
Разработчик Мобильных Приложений
19 Oct, 24 -
Ибн Пакуда, Бахья Бен Йосеф
19 Oct, 24 -
Стюарт, Миньон Стюарт
19 Oct, 24