Введение

В вычислительной технике ошибка шины — это сбой, генерируемый аппаратным обеспечением, уведомляющий операционную систему (ОС) о том, что процесс пытается получить доступ к области памяти, к которой центральный процессор (ЦП) не имеет физического доступа: недействительный адрес для шины адресов, отсюда и название. В современных системах на большинстве архитектур ошибки шины встречаются значительно реже, чем ошибки сегментации, которые возникают главным образом из-за нарушений доступа к памяти: проблем с логическим адресом или правами доступа. На платформах, соответствующих стандарту POSIX, ошибка шины обычно приводит к отправке процессу, вызвавшему ошибку, сигнала SIGBUS. SIGBUS также может быть вызван любой общей аппаратной ошибкой, обнаруженной компьютером, однако ошибка шины редко указывает на физическую неисправность аппаратного обеспечения компьютера — чаще всего она вызвана ошибкой в программном обеспечении. Ошибки шины также могут возникать при определенных ошибках подкачки; подробности см. ниже.

Адрес отсутствует

Программное обеспечение инструктирует процессор читать или записывать по конкретному физическому адресу памяти. Соответственно, процессор устанавливает этот физический адрес на своей адресной шине и запрашивает все остальное оборудование, подключенное к процессору, откликнуться, если они отвечают за этот конкретный адрес. Если никакое другое оборудование не отвечает, процессор генерирует исключение, сообщая о том, что запрошенный физический адрес не распознан всей компьютерной системой. Следует отметить, что это относится только к физическим адресам памяти. Попытка доступа к неопределенному адресу виртуальной памяти обычно рассматривается как ошибка сегментации, а не ошибка шины, хотя, если блок управления памятью (MMU) является отдельным, процессор не сможет определить разницу.

Неравномерный доступ

Большинство процессоров используют байтовую адресацию, где каждый уникальный адрес памяти соответствует 8-битному байту. Большинство процессоров могут обращаться к отдельным байтам по каждому адресу памяти, но обычно не могут обращаться к более крупным единицам (16 бит, 32 бита, 64 бита и т. д.), если эти единицы не "выровнены" по определенной границе (платформа x86 является заметным исключением). Например, если многобайтовые обращения должны быть выровнены по 16 бит, адреса (в байтах) 0, 2, 4, 6 и т. д. считаются выровненными и, следовательно, доступными, а адреса 1, 3, 5 и т. д. – невыровненными. Аналогично, если многобайтовые обращения должны быть выровнены по 32 бита, адреса 0, 4, 8, 12 и т. д. считаются выровненными и, следовательно, доступными, а все адреса между ними – невыровненными. Попытка обращения к единице данных, превышающей размер байта, по невыровненному адресу может привести к ошибке шины. Некоторые системы могут использовать гибридный подход в зависимости от используемой архитектуры. Например, для оборудования, основанного на мэйнфрейме IBM System/360, включая IBM System z, Fujitsu B8000, RCA Spectra и UNIVAC Series 90, инструкции должны быть выровнены по 16-битной границе, то есть адреса выполнения должны начинаться с четного байта. Попытки перехода по нечетному адресу приводят к исключению спецификации. Однако данные могут быть извлечены из любого адреса памяти и могут быть объемом в один байт или больше, в зависимости от инструкции. Процессоры обычно обращаются к данным по всей ширине своей шины данных. Для обращения к байтам они обращаются к памяти по всей ширине шины данных, а затем используют маскирование и сдвиг для адресации отдельного байта. Системы допускают эту неэффективную процедуру, поскольку она является важной функцией для большинства программ, особенно для обработки строк. В отличие от байтов, более крупные единицы данных могут занимать два выровненных адреса и, следовательно, требовать более одного обращения к шине данных. Процессоры могут поддерживать это, но такая функциональность редко требуется непосредственно на уровне машинного кода, поэтому разработчики процессоров обычно избегают ее реализации и вместо этого выдают ошибки шины при невыровненном доступе к памяти.

Ошибки в настройке страницы

FreeBSD, Linux и Solaris могут генерировать ошибку шины, когда виртуальные страницы памяти не могут быть подкачаны, например, если они стали недоступны (например, при обращении к файлу, отображенному в память, или при выполнении бинарного образа, который был усечен во время работы программы), Ненадежный источник: дата=июнь 2016 года, или потому, что только что созданный файл, отображенный в память, не может быть физически выделен из-за нехватки места на диске.