Jump to content

Ошибка шины

(Перенаправлено с SIGBUS )

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

На платформах, совместимых с 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-битной границе, то есть адреса выполнения должны начинаться с даже байт. Попытки перехода по нечетному адресу приводят к исключению спецификации. [1] Однако данные могут быть получены по любому адресу в памяти и могут иметь размер одного байта или больше, в зависимости от инструкции.

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

Ошибки страницы [ править ]

FreeBSD , Linux и Solaris могут сигнализировать об ошибке шины, когда страницы виртуальной памяти не могут быть выгружены , например, потому что она исчезла (например, доступ к файлу, отображаемому в памяти , или выполнение двоичного образа , который был усечен во время работы программы), [2] [ ненадежный источник? ] или потому, что только что созданный файл, отображенный в память, не может быть физически выделен, поскольку диск заполнен.

Отсутствующий сегмент (x86) [ править ]

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

Пример [ править ]

Это пример невыровненного доступа к памяти, написанный на языке программирования C с синтаксисом ассемблера AT&T .

#include <stdlib.h>

int main(int argc, char **argv) 
{
    int *iptr;
    char *cptr;
    
#if defined(__GNUC__)
# if defined(__i386__)
    /* Enable Alignment Checking on x86 */
    __asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__) 
     /* Enable Alignment Checking on x86_64 */
    __asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif

    /* malloc() always provides memory which is aligned for all fundamental types */
    cptr = malloc(sizeof(int) + 1);
    
    /* Increment the pointer by one, making it misaligned */
    iptr = (int *) ++cptr;

    /* Dereference it as an int pointer, causing an unaligned access */
    *iptr = 42;

    /*
       Following accesses will also result in sigbus error.
       short *sptr;
       int    i;

       sptr = (short *)&i;
       // For all odd value increments, it will result in sigbus.
       sptr = (short *)(((char *)sptr) + 1);
       *sptr = 100;
    
    */

    return 0;
}

Компиляция и запуск примера в POSIX- совместимой ОС на x86 демонстрирует ошибку:

$ gcc -ansi sigbus.c -o sigbus
$ ./sigbus 
Bus error
$ gdb ./sigbus
(gdb) r
Program received signal SIGBUS, Bus error.
0x080483ba in main ()
(gdb) x/i $pc
0x80483ba <main+54>:    mov    DWORD PTR [eax],0x2a
(gdb) p/x $eax
$1 = 0x804a009
(gdb) p/t $eax & (sizeof(int) - 1)
$2 = 1

Отладчик GDB непосредственное показывает, что значение 0x2a сохраняется в ячейке, хранящейся в EAX регистре , с использованием языка ассемблера X86 . Это пример косвенной адресации регистра.

Печать младших битов адреса показывает, что он не выровнен по границе слова («dword» в терминологии x86).

Ссылки [ править ]

  1. ^ z/Принципы работы архитектуры , SA22-7832-04, стр. 6-6, пятое издание (сентябрь 2005 г.) IBM Corporation, Поукипси, штат Нью-Йорк, можно получить по адресу http://publibfp.dhe.ibm.com/epubs/pdf. /a2278324.pdf Архивировано 22 мая 2022 г. в Wayback Machine (получено 31 декабря 2015 г.).
  2. ^ «Что такое SIGBUS — аппаратная ошибка конкретного объекта?» .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7a91b1cee2f8cfed0f52f643978aef89__1698897420
URL1:https://arc.ask3.ru/arc/aa/7a/89/7a91b1cee2f8cfed0f52f643978aef89.html
Заголовок, (Title) документа по адресу, URL1:
Bus error - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)