| Предыдущий | Следующий |
| MACH_SEND_INVALID_NOTIFY | MACH_SEND_NO_BUFFER |
MACH_SEND_INVALID_MEMORY
Внестрочная память оказалась непригодной
MACH_SEND_INVALID_MEMORY возникает, когда тело сообщения описывает внестрочную память, недоступную отправителю для чтения в момент отправки. Адрес может быть недопустимым, неотображённым, защищённым от требуемого доступа либо использоваться с размером и сочетанием дескрипторов, которые не задают допустимый диапазон. Результат относится к телу сообщения, а не только к буферу заголовка.
Внестрочные дескрипторы привлекательны тем, что Mach может эффективно передавать большие области с помощью механизмов виртуальной памяти. Одновременно они делают важными правила времени жизни: приложение должно сохранять память действительной, пока отправка не вернёт результат, определяющий владение. Интерфейс относит этот результат к случаям, когда сообщение могло быть частично или полностью уничтожено, поэтому безопаснее сформировать запрос заново, чем предполагать, что дескрипторы сохранились.
Как исследовать
- Проверьте адрес, длину, защиту и время жизни выделения для каждого внестрочного дескриптора.
- Убедитесь, что другой поток не удалил область из карты, не использовал её повторно и не изменил защиту во время формирования запроса.
- При использовании параметров освобождения и копирования дескриптора явно учитывайте владение данными.
- Сократите неудачное сообщение до одного дескриптора и проверьте структуру ABI, прежде чем исследовать гипотезы о нехватке ресурсов ядра.
Ссылки
- Справочник интерфейса ядра Mach: mach_msg
- Исходный код Apple XNU: mach/message.h
- Руководство Apple по программированию ядра: обзор Mach
Нужно найти другой код? Найти другой код состояния или ошибки.