Bus error что значит

What does the "bus error" message mean, and how does it differ from a segmentation fault?

mmap minimal POSIX 7 example

«Bus error» happens when the kernel sends SIGBUS to a process.

A minimal example that produces it because ftruncate was forgotten:

#include <fcntl.h> /* O_ constants */
#include <unistd.h> /* ftruncate */
#include <sys/mman.h> /* mmap */

int main() {
    int fd;
    int *map;
    int size = sizeof(int);
    char *name = "/a";

    shm_unlink(name);
    fd = shm_open(name, O_RDWR | O_CREAT, (mode_t)0600);
    /* THIS is the cause of the problem. */
    /*ftruncate(fd, size);*/
    map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    /* This is what generates the SIGBUS. */
    *map = 0;
}

Run with:

gcc -std=c99 main.c -lrt
./a.out

Tested in Ubuntu 14.04.

POSIX describes SIGBUS as:

Access to an undefined portion of a memory object.

The mmap spec says that:

References within the address range starting at pa and continuing for len bytes to whole pages following the end of an object shall result in delivery of a SIGBUS signal.

And shm_open says that it generates objects of size 0:

The shared memory object has a size of zero.

So at *map = 0 we are touching past the end of the allocated object.

Unaligned stack memory accesses in ARMv8 aarch64

This was mentioned at: What is a bus error? for SPARC, but here I will provide a more reproducible example.

All you need is a freestanding aarch64 program:

.global _start
_start:
asm_main_after_prologue:
    /* misalign the stack out of 16-bit boundary */
    add sp, sp, #-4
    /* access the stack */
    ldr w0, [sp]

    /* exit syscall in case SIGBUS does not happen */
    mov x0, 0
    mov x8, 93
    svc 0

That program then raises SIGBUS on Ubuntu 18.04 aarch64, Linux kernel 4.15.0 in a ThunderX2 server machine.

Unfortunately, I can’t reproduce it on QEMU v4.0.0 user mode, I’m not sure why.

The fault appears to be optional and controlled by the SCTLR_ELx.SA and SCTLR_EL1.SA0 fields, I have summarized the related docs a bit further here.

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:22, 21 мая 2019.

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

Содержание

  • 1 Причины возникновения
    • 1.1 Недействующий адрес
    • 1.2 Несогласованный доступ
    • 1.3 Ошибка страницы
    • 1.4 Несуществующий сегмент(x86)
  • 2 Источники

Причины возникновения

Существует 4 основных причины возникновения данной ошибки.
Рассмотрим каждую из них.

Недействующий адрес

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

Несогласованный доступ

В основном центральные процессоры (CPU) являются байт-адресуемыми, где каждый уникальный адрес памяти ссылается на 8-битный байт . Большинство из них могут получить доступ к отдельным байтам из каждого адреса памяти, но они, как правило, не могут получить доступ к более крупным блокам (16 бит, 32 бит, 64 бит и т. д.) без «выравнивания» структуры данных этих блоков к определенной границе.
К примеру, если многобайтовый доступ должен быть 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 могут сигнализировать об ошибке шины, когда страницы виртуальной памяти не могут быть выгружены, например, потому, что она исчезла (например, доступ к файлу с отображением памяти или выполнение двоичного образа, который был усечен во время работы программы), или потому, что только что созданный файл с отображением памяти не может быть физически выделен, потому что диск заполнен.

Несуществующий сегмент(x86)

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

Источники

  1. https://stackoverflow.com/questions/212466/what-is-a-bus-error
  2. https://www.geeksforgeeks.org/segmentation-fault-sigsegv-vs-bus-error-sigbus/
  3. https://studfiles.net/preview/307512/page:15/

From Wikipedia, the free encyclopedia

In computing, a bus error is a fault raised by hardware, notifying an operating system (OS) that a process is trying to access memory that the CPU cannot physically address: an invalid address for the address bus, hence the name. In modern use on most architectures these are much rarer than segmentation faults, which occur primarily due to memory access violations: problems in the logical address or permissions.

On POSIX-compliant platforms, bus errors usually result in the SIGBUS signal being sent to the process that caused the error. SIGBUS can also be caused by any general device fault that the computer detects, though a bus error rarely means that the computer hardware is physically broken—it is normally caused by a bug in software.[citation needed] Bus errors may also be raised for certain other paging errors; see below.

Causes[edit]

There are at least three main causes of bus errors:

Non-existent address[edit]

Software instructs the CPU to read or write a specific physical memory address. Accordingly, the CPU sets this physical address on its address bus and requests all other hardware connected to the CPU to respond with the results, if they answer for this specific address. If no other hardware responds, the CPU raises an exception, stating that the requested physical address is unrecognized by the whole computer system. Note that this only covers physical memory addresses. Trying to access an undefined virtual memory address is generally considered to be a segmentation fault rather than a bus error, though if the MMU is separate, the processor cannot tell the difference.

Unaligned access[edit]

Most CPUs are byte-addressable, where each unique memory address refers to an 8-bit byte. Most CPUs can access individual bytes from each memory address, but they generally cannot access larger units (16 bits, 32 bits, 64 bits and so on) without these units being «aligned» to a specific boundary (the x86 platform being a notable exception).

For example, if multi-byte accesses must be 16 bit-aligned, addresses (given in bytes) at 0, 2, 4, 6, and so on would be considered aligned and therefore accessible, while addresses 1, 3, 5, and so on would be considered unaligned. Similarly, if multi-byte accesses must be 32-bit aligned, addresses 0, 4, 8, 12, and so on would be considered aligned and therefore accessible, and all addresses in between would be considered unaligned. Attempting to access a unit larger than a byte at an unaligned address can cause a bus error.

Some systems may have a hybrid of these depending on the architecture being used. For example, for hardware based on the IBM System/360 mainframe, including the IBM System z, Fujitsu B8000, RCA Spectra, and UNIVAC Series 90, instructions must be on a 16-bit boundary, that is, execution addresses must start on an even byte. Attempts to branch to an odd address results in a specification exception.[1] Data, however, may be retrieved from any address in memory, and may be one byte or longer depending on the instruction.

CPUs generally access data at the full width of their data bus at all times. To address bytes, they access memory at the full width of their data bus, then mask and shift to address the individual byte. Systems tolerate this inefficient algorithm, as it is an essential feature for most software, especially string processing. Unlike bytes, larger units can span two aligned addresses and would thus require more than one fetch on the data bus.
It is possible for CPUs to support this, but this functionality is rarely required directly at the machine code level, thus CPU designers normally avoid implementing it and instead issue bus errors for unaligned memory access.

Paging errors[edit]

FreeBSD, Linux and Solaris can signal a bus error when virtual memory pages cannot be paged in, e.g. because it has disappeared (e.g. accessing a memory-mapped file or executing a binary image which has been truncated while the program was running),[2][unreliable source?] or because a just-created memory-mapped file cannot be physically allocated, because the disk is full.

Non-present segment (x86)[edit]

On x86 exists an older memory management
mechanism known as segmentation.
If the application loads segment register with the selector
of non-present segment (which under POSIX-compliant OSes
can only be done with an assembly language), the exception
is generated. Some OSes used that for swapping, but under
Linux this generates SIGBUS.

Example[edit]

This is an example of unaligned memory access, written in the C programming language with AT&T assembly syntax.

#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__("pushfnorl $0x40000,(%esp)npopf");
# elif defined(__x86_64__) 
     /* Enable Alignment Checking on x86_64 */
    __asm__("pushfnorl $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;
}

Compiling and running the example on a POSIX compliant OS on x86 demonstrates the error:

$ 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

The GDB debugger shows that the immediate value 0x2a is being stored at the location stored in the EAX register, using X86 assembly language. This is an example of register indirect addressing.

Printing the low order bits of the address shows that it is not aligned to a word boundary («dword» using x86 terminology).

References[edit]

  1. ^ z/Architecture Principles of Operation, SA22-7832-04, Page 6-6, Fifth Edition (September, 2005) IBM Corporation, Poukeepsie, NY, Retrievable from http://publibfp.dhe.ibm.com/epubs/pdf/a2278324.pdf (Retrieved December 31, 2015)
  2. ^ «What is SIGBUS — Object specific hardware error?».

Содержание

  1. Национальная библиотека им. Н. Э. Баумана Bauman National Library
  2. Персональные инструменты
  3. Ошибка на шине (Операционные Системы)
  4. Содержание
  5. Причины возникновения
  6. Недействующий адрес
  7. Несогласованный доступ
  8. Ошибка страницы
  9. Несуществующий сегмент(x86)
  10. Что такое ошибка шины?
  11. Ошибка Data_Bus_Error в Windows 10 — Как исправить?
  12. Как исправить Data Bus Error в Windows 10
  13. 1. Диагностика ОЗУ
  14. 2. Сканирование Диска и Sys
  15. 3. Оборудование
  16. Troubleshooting Bus Error Crashes
  17. Available Languages
  18. Bias-Free Language
  19. Contents
  20. Introduction
  21. Prerequisites
  22. Requirements
  23. Components Used
  24. Conventions
  25. Identifying Bus Error Crashes
  26. Troubleshooting Bus Error Crashes
  27. Troubleshooting Bus Error Crashes on 68000 Processor Platforms
  28. Troubleshooting Bus Error Crashes on RISC Processor Platforms
  29. Special Types of Bus Error Crashes
  30. Troubleshooting Techniques for Bus Error Exception Boot Loops
  31. Cisco IOS Software Loaded Does Not Support Installed Hardware
  32. Software Failure
  33. Mis-seated Hardware
  34. Hardware Failure
  35. Information to Collect if You Open a Service Request

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Ошибка на шине (Операционные Системы)

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

Содержание

Причины возникновения

Существует 4 основных причины возникновения данной ошибки. Рассмотрим каждую из них.

Недействующий адрес

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

Несогласованный доступ

В основном центральные процессоры (CPU) являются байт-адресуемыми, где каждый уникальный адрес памяти ссылается на 8-битный байт . Большинство из них могут получить доступ к отдельным байтам из каждого адреса памяти, но они, как правило, не могут получить доступ к более крупным блокам (16 бит, 32 бит, 64 бит и т. д.) без «выравнивания» структуры данных этих блоков к определенной границе. К примеру, если многобайтовый доступ должен быть 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 могут сигнализировать об ошибке шины, когда страницы виртуальной памяти не могут быть выгружены, например, потому, что она исчезла (например, доступ к файлу с отображением памяти или выполнение двоичного образа, который был усечен во время работы программы), или потому, что только что созданный файл с отображением памяти не может быть физически выделен, потому что диск заполнен.

Несуществующий сегмент(x86)

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

Источник

Что такое ошибка шины?

Что означает сообщение об ошибке шины и чем оно отличается от сегфоута?

В настоящее время ошибки шины встречаются редко на x86 и возникают, когда ваш процессор не может даже попытаться получить доступ к памяти, как правило:

  • использование инструкции процессора с адресом, который не удовлетворяет его требованиям выравнивания.

Ошибки сегментации возникают при доступе к памяти, которая не принадлежит вашему процессу, они очень распространены и обычно являются результатом:

  • используя указатель на то, что было освобождено.
  • используя неинициализированный, следовательно, фиктивный указатель.
  • используя нулевой указатель.
  • переполнение буфера.

PS: если быть более точным, это не манипулирование самим указателем, который вызовет проблемы, это доступ к памяти, на которую он указывает (разыменование).

Segfault обращается к памяти, к которой у вас нет доступа. Это только для чтения, у вас нет разрешения и т.д .

Ошибка шины пытается получить доступ к памяти, которая не может быть там. Вы использовали адрес, который не имеет смысла для системы, или неправильный адрес для этой операции.

mmap минимальный пример POSIX 7

«Ошибка шины» возникает, когда ядро ​​отправляет SIGBUS процесс.

Минимальный пример, который производит это, потому что ftruncate был забыт:

Протестировано в Ubuntu 14.04.

POSIX описывает SIGBUS как:

Доступ к неопределенной части объекта памяти.

Спецификация mmap говорит, что:

Ссылки в пределах диапазона адресов, начинающиеся с pa и продолжающиеся для длинных байтов до целых страниц после конца объекта, должны привести к доставке сигнала SIGBUS.

И shm_open говорит, что генерирует объекты размером 0:

Объект общей памяти имеет нулевой размер.

Таким образом, *map = 0 мы касаемся конца выделенного объекта.

Нераспределенный доступ к памяти стека в ARMv8 aarch64

Это было упомянуто в: Что такое ошибка шины? для SPARC, но здесь я приведу более воспроизводимый пример.

Все, что вам нужно, это отдельная программа aarch64:

Затем эта программа вызывает SIGBUS на Ubuntu 18.04 aarch64, ядре Linux 4.15.0 на сервере ThunderX2 .

К сожалению, я не могу воспроизвести его в пользовательском режиме QEMU v4.0.0, я не уверен почему.

Неисправность , как представляется, по желанию и контролируются SCTLR_ELx.SA и SCTLR_EL1.SA0 полями, я обобщил связанные документы немного дальше здесь .

Я полагаю, что ядро ​​вызывает SIGBUS, когда приложение демонстрирует смещение данных на шине данных. Я думаю, что, поскольку большинство [?] Современных компиляторов для большинства процессоров дополняют / выравнивают данные для программистов, проблемы выравнивания в прошлом (по крайней мере) смягчаются, и, следовательно, в наши дни SIGBUS не видят слишком часто (AFAIK).

Вы также можете получить SIGBUS, если по какой-то причине невозможно вставить кодовую страницу.

Один классический случай ошибки шины возникает в некоторых архитектурах, таких как SPARC (по крайней мере, некоторые SPARC, возможно, это было изменено), когда вы делаете неправильный доступ. Например:

Этот фрагмент кода пытается записать 32-разрядное целочисленное значение 0xdeadf00d в адрес, который (скорее всего) не выровнен должным образом, и сгенерирует ошибку шины на архитектурах, которые «разборчивы» в этом отношении. Intel x86, кстати, не такая архитектура, она позволила бы доступ (хотя и выполнял его медленнее).

Конкретный пример ошибки шины, с которой я только что столкнулся при программировании C на OS X:

В случае, если вы не помните, документы strcat добавляют второй аргумент к первому, изменяя первый аргумент (переверните аргументы, и все работает нормально). В Linux это дает ошибку сегментации (как и ожидалось), но в OS X это дает ошибку шины. Зачем? Я действительно не знаю.

Это зависит от вашей ОС, процессора, компилятора и, возможно, других факторов.

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

Обычно это означает неприсоединенный доступ.

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

Я получал ошибку шины, когда корневой каталог был на 100%.

Причиной ошибки шины в Mac OS X было то, что я попытался выделить около 1 МБ в стеке. Это хорошо работало в одном потоке, но при использовании openMP это приводит к ошибке шины, потому что Mac OS X имеет очень ограниченный размер стека для неосновных потоков .

Я согласен со всеми ответами выше. Вот мои 2 цента относительно ошибки шины:

Ошибка BUS не должна возникать из инструкций в коде программы. Это может произойти, когда вы запускаете двоичный файл и во время выполнения двоичный файл изменяется (перезаписывается сборкой или удаляется и т. Д.).

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

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

Чтобы добавить к ответу blxtd выше, также возникают ошибки шины, когда ваш процесс не может попытаться получить доступ к памяти определенной «переменной» .

Заметили « непреднамеренное » использование переменной «i» в первом «цикле for»? Вот что в этом случае вызывает ошибку шины.

Я только что обнаружил, что на процессоре ARMv7 вы можете написать некоторый код, который выдает ошибку сегментации в неоптимизированном состоянии, но при компиляции с -O2 выдает ошибку шины (оптимизируйте больше).

Я использую кросс-компилятор GCC ARM gnueabihf из Ubuntu 64 бит.

Типичное переполнение буфера, которое приводит к ошибке шины,

Здесь, если размер строки в двойных кавычках («») больше размера буфера, это дает ошибку шины.

Источник

Ошибка Data_Bus_Error в Windows 10 — Как исправить?

Data_Bus_Error — ошибка BSOD синего экрана, которая может содержать в себе код 0x0000002E и появиться она в основном из-за оборудования. Это может быть оперативная память или диск.

Как исправить Data Bus Error в Windows 10

Давайте разберем, что делать и как исправить ошибку Data Bus Error на синем экране при загрузке Windows 10.

1. Диагностика ОЗУ

Нажмите Win+R и введите mdsched.exe, чтобы запустить диагностику ОЗУ. Выберите «Выполнить перезагрузку и проверку» и следуйте рекомендациям автоматического помощника на экране.

  • Если ошибки будут найдены и Windows 10 не сможет их исправить, то обратитесь к полному руководству по диагностике ошибок в ОЗУ .

2. Сканирование Диска и Sys

Воспользуемся инструментами по автоматическому сканированию диска и системных файлов. Если будут обнаружены ошибки, то по возможности, будут автоматически исправлены. Запустите командную строку от имени администратора и введите ниже 3 команды по порядку, после чего перезагрузите компьютер:

3. Оборудование

Если выше программные способы не помогли исправить ошибку Data Bus Error. то нужно приступить к физическому вмешательству оборудования.

  1. В первую очередь, извлеките все USB-устройства, как флешка, принтер и т.п. с USB портов компьютера или ноутбука, после чего перезагрузите систему.
  2. Если вы меня недавно компоненты для ПК, то попробуйте вернуть старый компонент вместо нового.
  3. Проверьте в корпусе ПК, что все фишки к жесткому диску и материнской платы присоединены плотно.
  4. Извлеките планку ОЗУ и вставьте её в другой порт, только продуйте от пыли все слоты. Если у вас несколько планок ОЗУ, то можно по очереди вставлять в разные слоты или меняя местами, чтобы выявить виновника.

Источник

Troubleshooting Bus Error Crashes

Available Languages

Bias-Free Language

The documentation set for this product strives to use bias-free language. For the purposes of this documentation set, bias-free is defined as language that does not imply discrimination based on age, disability, gender, racial identity, ethnic identity, sexual orientation, socioeconomic status, and intersectionality. Exceptions may be present in the documentation due to language that is hardcoded in the user interfaces of the product software, language used based on RFP documentation, or language that is used by a referenced third-party product. Learn more about how Cisco is using Inclusive Language.

Contents

Introduction

This document explains how to identify bus error crashes and how to troubleshoot those crashes depending on the type of processor you have in your Cisco router.

Prerequisites

Requirements

Cisco recommends that you read Troubleshooting Router Crashes before proceeding with this document.

Components Used

The information in this document is based on these software and hardware versions:

All Cisco IOS® software versions

All Cisco routers

Note: This document does not apply to Cisco Catalyst switches or MGX platforms.

The information in this document was created from the devices in a specific lab environment. All of the devices used in this document started with a cleared (default) configuration. If your network is live, make sure that you understand the potential impact of any command.

Conventions

Refer to the Cisco Technical Tips Conventions for more information on document conventions.

Identifying Bus Error Crashes

The system encounters a bus error when the processor tries to access a memory location that either does not exist (a software error) or does not respond properly (a hardware problem). A bus error can be identified from the output of the show version command provided by the router if not power-cycled or manually reloaded.

If you have the output of a show version or show technical-support command (from enable mode) from your Cisco device, you can use it to display potential issues and fixes. In order to use it, you must be a registered customer, be logged in, and have JavaScript enabled.

At the console prompt, this error message can also be seen during a bus error:

After this, the router reloads. In some cases, however, the router goes into a loop of crashes and reloads and manual intervention is required to break out of this loop.

Another related issue is a Versatile Interface Processor (VIP) crash. If this problem occurs, error messages similar to these are logged:

Finally, another bus error crash type is a line card crash on a Cisco 12000 Series Internet Router. If this problem occurs, error messages similar to these are logged in the show context output:

If you have the output of a show context command from your Cisco device, you can use Cisco CLI Analyzer to display potential issues and fixes. To use Cisco CLI Analyzer, you must be a registered customer, be logged in, and have JavaScript enabled.

Troubleshooting Bus Error Crashes

The first thing to do is to find out which memory location (also known as the «address» or «address operand») the router tried to access when the bus error occurred. With this information, you have an indication as to whether the fault lies with the Cisco IOS Software or the router hardware. In the example, «System restarted by bus error at PC 0x30EE546, address 0xBB4C4», the memory location that the router tried to access is 0xBB4C4. Do not confuse this with the program counter (PC) value above.

The second thing to do is determine the type of processor in the router. Memory address locations for routers differ depending on the type of processor. There are two main types of processors in Cisco routers:

68000 Processors

This is part of a show version output that indicates that the router has a 68000 processor:

Router platforms that have 68000 processors include:

Cisco 1000 Series Routers

Cisco 1600 Series Routers

Cisco 2500 Series Routers

Cisco 4000 Series Routers

Route Processor (RP) Modules on Cisco 7000 (RP) Series Routers

Reduced Instruction Set Computing (RISC) Processors

This is part of a show version output that indicates that the router has a RISC processor:

The R in (R4700) indicates a RISC processor.

Router platforms that have RISC processors include:

Cisco 3600 Series Routers

Cisco 4500 Series Routers

Cisco 4700 Series Routers

Route Switch Processor (RSP) Modules on Cisco 7500 Series and Cisco 7000 (RSP7000) Series Routers

Network Processor Engine (NPE) Modules on Cisco 7200 Series Routers

Multilayer Switch Feature Card (MSFC) on the Cisco 7600 Series Routers or Catalyst 6000 Switch

Performance Routing Engine (PRE) Modules on Cisco 10000 Series Internet Routers

Gigabit Route Processor (GRP) Modules on Cisco 12000 Series Internet Routers

Once you have determined the address and the processor type, you can start with more detailed troubleshooting.

Troubleshooting Bus Error Crashes on 68000 Processor Platforms

With the address accessed by the router when the bus error occurred, use the show region command to determine the memory location the address corresponds to. If the address reported by the bus error does not fall within the ranges displayed in the show region output, this means that the router tried to access an address that is not valid. This indicates that it is a Cisco IOS Software problem. Use the Cisco CLI Analyzer (registered customers only) to decode the output of the show stacks command and identify the Cisco IOS Software bug that causes the bus error.

On the other hand, if the address falls within one of the ranges in the show region output, it means that the router accessed a valid memory address, but the hardware corresponding to that address does not respond properly. This indicates a hardware problem.

Here is an example of the show region output:

Note: In some earlier Cisco IOS Software versions, this command is not available. The show region output is part of the show tech-support output from Cisco IOS Software Release 12.0(9).

Addresses are displayed in hexadecimal format. The addresses that fall within the «Start» and «End» ranges are valid memory addresses.

Main corresponds to main memory or dynamic RAM (DRAM).

iomem corresponds to input/output (I/O) memory, which means different parts for different platforms. For example, DRAM for the Cisco 2500, shared RAM (SRAM) for the Cisco 4000.

Still using the previous example, System restarted by bus error at PC 0x30EE546, address 0xBB4C4, this bus error crash comes from a Cisco 2500 router with the show region output. The address 0xBB4C4 is equivalent to 0x000BB4C4. Using the show region output, this address falls within the range of «main», or more specifically, «main:heap» or 0x000666B4-0x007FEFFF. As mentioned earlier, «main» corresponds to the main memory or the DRAM, so the DRAM chips need to be checked.

If this is a new router, or if the router has been moved from one location to another, the memory chips often become loose. It’s a good idea to reseat or firmly push the memory chips into the slot. Most of the time, this is sufficient for solving this type of crash.

For bus error crashes with addresses that do not fall within the show region address ranges, use the Cisco CLI Analyzer to decode the output of the show stacks command and identify the Cisco IOS Software bug that is causing the bus error. If you are uncertain which bug ID may match or which Cisco IOS software version contains the fix for the problem, upgrading your Cisco IOS software to the latest version in your release train is one option that often resolves the issue since this usually contains the fix for a large number of bugs.

If you have the output of a show stacks or show technical-support (from enable mode) command from your Cisco device, you can use Cisco CLI Analyzer to display potential issues and fixes. To use Cisco CLI Analyzer, you must be a registered customer, be logged in, and have JavaScript enabled.

Troubleshooting Bus Error Crashes on RISC Processor Platforms

It is recommended that you read the section on Troubleshooting Bus Error Crashes on 68000 Processor Platforms before you proceed with this section.

On RISC processors, Cisco IOS Software uses virtual addresses through the use of the Translation Lookaside Buffer (TLB) that translates virtual addresses into physical addresses. The address reported by bus errors on RISC processors is therefore the virtual address as opposed to the physical address used by the 68000 processors.

The output of the show region command must be used to check the address reported by the bus error. To illustrate this, let’s take the following example:

Using the show region command output below, you can verify that 0xC is not a valid virtual address, and you can conclude that the bus error was caused by a software problem. Use the Cisco CLI Analyzer (registered customers only) to decode the output of the show stacks or show technical-support (from enable mode) command and identify the Cisco IOS Software bug that is causing the bus error.

Another advantage of using the show region command is that the memory mapping depends on the amount of memory installed on the router. For example, if you have 64 MB of DRAM (64 x 1024 x 1024 = 67108864 bytes = 0x4000000 bytes), the DRAM range is 0x60000000 — 0x63FFFFFF for 64 MB. This is confirmed with the show region command:

If you have a bus error at 0x65FFFFFF, the show region output takes the amount of memory into account and tells you that it’s an illegal address (software bug).

Use the show region command to verify whether the address indicated by the bus error is within the address ranges used by the router.

If the address falls within a virtual address range, replace the hardware corresponding to this range.

If the address does not fall within a virtual address range, use the Cisco CLI Analyzer (registered customers only) to decode the output of the show stacks or the show technical-support (from enable mode) command and identify the Cisco IOS software bug that is causing the bus error.

Give serious consideration to installing the most recent maintenance release of the Cisco IOS Software train that you are currently running.

Special Types of Bus Error Crashes

A special type of bus error crash is when the crash is caused by a corrupted program counter (PC). The PC value is the location of the instruction which the processor was executing when the bus error occured. When a bus error caused by a corrupted PC occurs, the following message appears on the console:

In this case, the PC has jumped to the address 0x0 (probably because of a null pointer), but this is not where the instruction is located. This is a software problem so there is no need to check with the show region command.

On other RISC platforms (Cisco 3600, 4500, and so forth), you get a SegV exception when jumping to an illegal PC, not a bus error.

Another type of bus error crash that occurs from time to time is when the PC value is equal to the address value. For instance:

From the crashinfo file:

Notice the k1 register value is 0x14 (hexadecimal) which is equal to 20 in decimal. This points to a Cache Parity Exception. In this particular case, the parity error is not handled properly and is being masked by a bus error. The router has crashed due to a software bus error in the function handling a Cache Parity Exception.

You should consider this crash as a regular processor memory parity error crash and follow the recommendations given in Processor Memory Parity Errors (PMPEs).

You should also consider upgrading the Cisco IOS software release to a version which has a fix for CSCdv68388 — «Change cache error exception handler to resume not crash» which has been fixed since Cisco IOS Software Release 12.2(10).

Troubleshooting Techniques for Bus Error Exception Boot Loops

This section focuses on general troubleshooting techniques for bus error exception boot loops:

Cisco IOS software loaded does not support installed hardware

Cisco IOS Software Loaded Does Not Support Installed Hardware

Verify that all network cards are supported by the Cisco IOS software. The Software Advisor (registered customers only) gives you the minimum versions of Cisco IOS software needed for hardware. Verify, also, that the bootflash image supports the hardware installed if you have a router that supports a boot image such as the Cisco 7200 or Cisco 7500 series router.

Software Failure

On 2600 and 3600 routers, the router’s I/O memory is configurable as a percentage of the main memory. If the I/O memory settings are inappropriate for the installed network modules or WAN interface cards (WICs), the 2600/3600 platform may have trouble booting and may crash with bus errors.

If a software configuration change has recently been made, and the router is in a booting loop, a software bug may be causing this issue.

If the router is not able to boot up, you can bypass the configuration to identify whether that is causing the issue. Follow these steps:

Break into ROMMON by sending the break sequence to the router during the first 60 seconds of boot up.

From ROM Monitor, use the confreg command to change the configuration register to a setting, such as 0x2142, to ignore the router’s configuration:

If the router boots without any errors, there is a configuration issue causing the problem. Verify that your configuration is supported in the Cisco IOS software and by the hardware. If it is supported, use the Bug Toolkit (registered customers only) to identify any software bugs that you may be experiencing. Give serious consideration to installing the most recent maintenance release of the Cisco IOS software train that you are currently running.

Mis-seated Hardware

If you are experiencing a bus error exception booting loop, it may be caused by mis-seated hardware. For lower-end platforms such as the 3600 or 4000 router, reseat the network modules/network processors.

For higher-end platforms such as the 7200 or 7500 routers, reseat the processor, VIP, port adapters, or line card that is reloading due to a bus error exception.

Hardware Failure

The information contained in the bus error does not help to isolate the hardware. Therefore, it is important to remove and reinsert cards to find the problem hardware. Here are some recommended steps to isolate the problem:

**If the router does not experience the continuous loop after following the troubleshooting steps above, then the problem may have been caused by a mis-seated network module. It is recommended that you monitor the router for 24 hours to be sure that the router continues to function without experiencing the issue again.

Information to Collect if You Open a Service Request

If you still need assistance after following the troubleshooting steps above and want to open a case with Cisco Technical Support, be sure to include the following information for troubleshooting a bus error or bus error exception:
  • Troubleshooting performed before opening the case
  • show technical-support output (if possible, in enable mode)
  • show log output or console captures, if available
  • crashinfo file (if present and not already included in the show technical-support output)
  • show region output (if not already included in the show technical-support output)

Attach the collected data to your case in non-zipped, plain text format (.txt). You can attach information to your case by uploading it using the Case Query Tool (registered customers only) . If you cannot access the Case Query Tool, you can attach the relevant information to your case by sending it to attach@cisco.com with your case number in the subject line of your message.

Note: Do not manually reload or power-cycle the router before collecting the above information unless required to troubleshoot a bus error exception as this can cause important information to be lost that is needed for determining the root cause of the problem.

Источник

  • Печать

Страницы: [1]   Вниз

Тема: Bus error (решено)  (Прочитано 8525 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн
Belyaev Nikolay

Привет всем.

Проблема такая. запуская apache2 и… тут же вылетает ошибка Bus error. Логов не создаётся. Причём программу я удалил (через purge и удалил всё что было в /etc/apache2 ) и просто случайно запустил и опять Bus error. Перед этим была проблема с диском — «слишком много ошибок» и делал проверку вручную 1.3% от всего что находится в / было исправлено  ??? Ошибка похоже не в apache, а в системе в принципе. чего делать?  :-

« Последнее редактирование: 19 Декабря 2008, 09:44:22 от Belyaev Nikolay »

«Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете»
Махатма Ганди


Оффлайн
digiwhite

А более подробного текста ошибки нету?


Оффлайн
Belyaev Nikolay

в том-то и беда :(
я просто не понимаю почему не удалился полностью apache…

« Последнее редактирование: 18 Декабря 2008, 17:35:29 от Belyaev Nikolay »

«Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете»
Махатма Ганди


Оффлайн
digiwhite

Так, а что вы случайно запустили снова после удаления apache?


Оффлайн
Belyaev Nikolay

apache2
причём от пользователя…
и тутже получил ошибку Bus Error

«Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете»
Махатма Ганди


Оффлайн
axe

Bus error — это какая-то глобальная ошибка? Software или hardware? Линукс жив остается? каким образом она «возникает»?


Оффлайн
Belyaev Nikolay

пока заметил её только при работе с apache. в логах (смотрю файлы на изменение в /var/log) НИГДЕ ничего не добавляется. пробовал запускать апач с максимальным выводом ошибок, тоже ничего.


через 25 мин
попытался обновиться с 8.04 до 8.10
хотел скинуть инфу на другой комп, вызвал smbclient и опять bus error… ппц точняк потёрло что-н.
Кстати причина сбоя я обнаружил надеюсь это тольк она. Память не прошла memtest, переставил модули в другие слота всё ок.
сейчас идёт обновление. надеюсь поможет

« Последнее редактирование: 19 Декабря 2008, 08:58:39 от Belyaev Nikolay »

«Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете»
Махатма Ганди


Оффлайн
digiwhite


Оффлайн
Belyaev Nikolay

нет похоже проблемы с материнкой. но пока денежек на замену не дают :(
переставил в другие разьёмы всё ок

«Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете»
Махатма Ганди


Оффлайн
Belyaev Nikolay

всё. обновился. и всё нормуль
похоже действительно память мне реально подпортила инфу на жёстком диске :(

вопрос, хотя он из области «чтобы было бы», но всё равно инетресно

Сейчас я обновился и переустановил все пакеты. А что бы надо было делать, если не было возможности обновиться? удалить какой-н глобальный переустановить какой-н глобальный пакет… но какой?

«Сначала они вас игнорируют, потом смеются над вами, потом борются с вами, а потом вы побеждаете»
Махатма Ганди


  • Печать

Страницы: [1]   Вверх

When trying to reboot a Linux server I got the typical ‘System going down for reboot now’, but the server has not rebooted. I have tried:

reboot
shutdown -r now

The runlevel command returns 5. Any other options for getting this server to reboot? This is a remote machine, so I don’t want to just shut it down if I can avoid that.

I am trying to reboot because of a journal abort on /, so / is read-only. Most commands now return ‘bus error’

asked Aug 24, 2009 at 13:06

Kyle Brandt's user avatar

Kyle BrandtKyle Brandt

82.8k71 gold badges302 silver badges444 bronze badges

2

Kyle, I’m not quite sure if this is what you’re looking for (since it’s like pressing the reset button), but this has helped me in situations where a server refused to reboot:

echo 1 > /proc/sys/kernel/sysrq  
echo b > /proc/sysrq-trigger

The first line is for enabling SysRq, and the second one is for rebooting.

See emergency reboot or shutdown with magic commands for more details.

answered Aug 24, 2009 at 13:21

mfriedman's user avatar

5

What does the end of dmesg output?

From the description is sounds like you may have a serious hardware issue that will prevent you from being able to reboot, as the commends you’ve given should have done the job for you already.

Otherwise the only think I know of is issuing commands directly to init using telinit, but I thought that that was what shutdown and reboot both basically did anyway.

answered Aug 24, 2009 at 13:14

Bart Silverstrim's user avatar

Bart SilverstrimBart Silverstrim

31.2k9 gold badges65 silver badges87 bronze badges

2

This kind of problem can occur if the disk subsystem is not available due to a RAID controller failure or hard disk failure. Binaries and libraries which are still in memory/disk cache can still be run but any other binary fails with IO errors or other fatal errors. If the reboot binary is still runnable then reboot -fn will force an immediate warm boot of the system. If the hardware is still functional you should be back in about 5-10 minutes, otherwise the system will be offline until someone can physically get to it to repair/replace it.

answered Aug 24, 2009 at 17:44

mtinberg's user avatar

mtinbergmtinberg

1,80310 silver badges9 bronze badges

answered Aug 24, 2009 at 13:10

CK.'s user avatar

CK.CK.

1,1636 silver badges10 bronze badges

Sounds to me like the binaries that would be running the shutdown are all corrupted. What does init 0 do?

I would try to gracefully kill important processes, remount all your filesystems read-only, and yank the power.

answered Aug 24, 2009 at 13:19

chris's user avatar

chrischris

11.9k6 gold badges41 silver badges51 bronze badges

1

reboot -n -f

blah blah… need 15 characters

answered Aug 24, 2009 at 13:29

Thomas's user avatar

ThomasThomas

1,45611 silver badges16 bronze badges

Что такое ошибка шины?


Что означает сообщение об ошибке шины и чем оно отличается от сегфоута?



Ответы:


В настоящее время ошибки шины встречаются редко на x86 и возникают, когда ваш процессор не может даже попытаться получить доступ к памяти, как правило:

  • использование инструкции процессора с адресом, который не удовлетворяет его требованиям выравнивания.

Ошибки сегментации возникают при доступе к памяти, которая не принадлежит вашему процессу, они очень распространены и обычно являются результатом:

  • используя указатель на то, что было освобождено.
  • используя неинициализированный, следовательно, фиктивный указатель.
  • используя нулевой указатель.
  • переполнение буфера.

PS: если быть более точным, это не манипулирование самим указателем, который вызовет проблемы, это доступ к памяти, на которую он указывает (разыменование).







Segfault обращается к памяти, к которой у вас нет доступа. Это только для чтения, у вас нет разрешения и т.д …

Ошибка шины пытается получить доступ к памяти, которая не может быть там. Вы использовали адрес, который не имеет смысла для системы, или неправильный адрес для этой операции.


mmap минимальный пример POSIX 7

«Ошибка шины» возникает, когда ядро ​​отправляет SIGBUSпроцесс.

Минимальный пример, который производит это, потому что ftruncateбыл забыт:

#include <fcntl.h> /* O_ constants */
#include <unistd.h> /* ftruncate */
#include <sys/mman.h> /* mmap */

int main() {
    int fd;
    int *map;
    int size = sizeof(int);
    char *name = "/a";

    shm_unlink(name);
    fd = shm_open(name, O_RDWR | O_CREAT, (mode_t)0600);
    /* THIS is the cause of the problem. */
    /*ftruncate(fd, size);*/
    map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    /* This is what generates the SIGBUS. */
    *map = 0;
}

Бежать с:

gcc -std=c99 main.c -lrt
./a.out

Протестировано в Ubuntu 14.04.

POSIX описывает SIGBUS как:

Доступ к неопределенной части объекта памяти.

Спецификация mmap говорит, что:

Ссылки в пределах диапазона адресов, начинающиеся с pa и продолжающиеся для длинных байтов до целых страниц после конца объекта, должны привести к доставке сигнала SIGBUS.

И shm_open говорит, что генерирует объекты размером 0:

Объект общей памяти имеет нулевой размер.

Таким образом, *map = 0мы касаемся конца выделенного объекта.

Нераспределенный доступ к памяти стека в ARMv8 aarch64

Это было упомянуто в: Что такое ошибка шины? для SPARC, но здесь я приведу более воспроизводимый пример.

Все, что вам нужно, это отдельная программа aarch64:

.global _start
_start:
asm_main_after_prologue:
    /* misalign the stack out of 16-bit boundary */
    add sp, sp, #-4
    /* access the stack */
    ldr w0, [sp]

    /* exit syscall in case SIGBUS does not happen */
    mov x0, 0
    mov x8, 93
    svc 0

Затем эта программа вызывает SIGBUS на Ubuntu 18.04 aarch64, ядре Linux 4.15.0 на сервере ThunderX2 .

К сожалению, я не могу воспроизвести его в пользовательском режиме QEMU v4.0.0, я не уверен почему.

Неисправность , как представляется, по желанию и контролируются SCTLR_ELx.SAи SCTLR_EL1.SA0полями, я обобщил связанные документы немного дальше здесь .


Я полагаю, что ядро ​​вызывает SIGBUS, когда приложение демонстрирует смещение данных на шине данных. Я думаю, что, поскольку большинство [?] Современных компиляторов для большинства процессоров дополняют / выравнивают данные для программистов, проблемы выравнивания в прошлом (по крайней мере) смягчаются, и, следовательно, в наши дни SIGBUS не видят слишком часто (AFAIK).

От: Здесь



Вы также можете получить SIGBUS, если по какой-то причине невозможно вставить кодовую страницу.




Один классический случай ошибки шины возникает в некоторых архитектурах, таких как SPARC (по крайней мере, некоторые SPARC, возможно, это было изменено), когда вы делаете неправильный доступ. Например:

unsigned char data[6];
(unsigned int *) (data + 2) = 0xdeadf00d;

Этот фрагмент кода пытается записать 32-разрядное целочисленное значение 0xdeadf00dв адрес, который (скорее всего) не выровнен должным образом, и сгенерирует ошибку шины на архитектурах, которые «разборчивы» в этом отношении. Intel x86, кстати, не такая архитектура, она позволила бы доступ (хотя и выполнял его медленнее).







Конкретный пример ошибки шины, с которой я только что столкнулся при программировании C на OS X:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char buffer[120];
    fgets(buffer, sizeof buffer, stdin);
    strcat("foo", buffer);
    return 0;
}

В случае, если вы не помните, документы strcatдобавляют второй аргумент к первому, изменяя первый аргумент (переверните аргументы, и все работает нормально). В Linux это дает ошибку сегментации (как и ожидалось), но в OS X это дает ошибку шины. Зачем? Я действительно не знаю.




Это зависит от вашей ОС, процессора, компилятора и, возможно, других факторов.

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

-Адам


Обычно это означает неприсоединенный доступ.

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



Я получал ошибку шины, когда корневой каталог был на 100%.


Причиной ошибки шины в Mac OS X было то, что я попытался выделить около 1 МБ в стеке. Это хорошо работало в одном потоке, но при использовании openMP это приводит к ошибке шины, потому что Mac OS X имеет очень ограниченный размер стека для неосновных потоков .


Я согласен со всеми ответами выше. Вот мои 2 цента относительно ошибки шины:

Ошибка BUS не должна возникать из инструкций в коде программы. Это может произойти, когда вы запускаете двоичный файл и во время выполнения двоичный файл изменяется (перезаписывается сборкой или удаляется и т. Д.).

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

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



Чтобы добавить к ответу blxtd выше, также возникают ошибки шины, когда ваш процесс не может попытаться получить доступ к памяти определенной «переменной» .

for (j = 0; i < n; j++) {
    for (i =0; i < m; i++) {
        a[n+1][j] += a[i][j];
    }
}

Заметили « непреднамеренное » использование переменной «i» в первом «цикле for»? Вот что в этом случае вызывает ошибку шины.



Я только что обнаружил, что на процессоре ARMv7 вы можете написать некоторый код, который выдает ошибку сегментации в неоптимизированном состоянии, но при компиляции с -O2 выдает ошибку шины (оптимизируйте больше).

Я использую кросс-компилятор GCC ARM gnueabihf из Ubuntu 64 бит.



Типичное переполнение буфера, которое приводит к ошибке шины,

{
    char buf[255];
    sprintf(buf,"%s:%sn", ifname, message);
}

Здесь, если размер строки в двойных кавычках («») больше размера буфера, это дает ошибку шины.


Data_Bus_Error — ошибка BSOD синего экрана, которая может содержать в себе код 0x0000002E и появиться она в основном из-за оборудования. Это может быть оперативная память или диск.

BSOD ошибка Data_Bus_Error Windows 10

Как исправить Data Bus Error в Windows 10

Давайте разберем, что делать и как исправить ошибку Data Bus Error на синем экране при загрузке Windows 10.

1. Диагностика ОЗУ

Нажмите Win+R и введите mdsched.exe, чтобы запустить диагностику ОЗУ. Выберите «Выполнить перезагрузку и проверку» и следуйте рекомендациям автоматического помощника на экране.

  • Если ошибки будут найдены и Windows 10 не сможет их исправить, то обратитесь к полному руководству по диагностике ошибок в ОЗУ.

Диагностика озу

2. Сканирование Диска и Sys

Воспользуемся инструментами по автоматическому сканированию диска и системных файлов. Если будут обнаружены ошибки, то по возможности, будут автоматически исправлены. Запустите командную строку от имени администратора и введите ниже 3 команды по порядку, после чего перезагрузите компьютер:

chkdsk C: /f /r /x
DISM.exe /Online /Cleanup-image /Restorehealth
sfc /scannow

CHKDSK проверка и восстановление жесткого диска

3. Оборудование

Если выше программные способы не помогли исправить ошибку Data Bus Error. то нужно приступить к физическому вмешательству оборудования.

  1. В первую очередь, извлеките все USB-устройства, как флешка, принтер и т.п.  с USB портов компьютера или ноутбука, после чего перезагрузите систему.
  2. Если вы меня недавно компоненты для ПК, то попробуйте вернуть старый компонент вместо нового.
  3. Проверьте в корпусе ПК, что все фишки к жесткому диску и материнской платы присоединены плотно.
  4. Извлеките планку ОЗУ и вставьте её в другой порт, только продуйте от пыли все слоты. Если у вас несколько планок ОЗУ, то можно по очереди вставлять в разные слоты или меняя местами, чтобы выявить виновника.

Смотрите еще:

  • Исправьте ошибку KERNEL DATA INPAGE в Windows 10
  • Как исправить ошибку ACPI_BIOS_ERROR в Windows 10
  • Способы устранение ошибки IRQL_GT_ZERO в Windows
  • Как исправить VIDEO_DXGKRNL_FATAL_ERROR в Windows 10
  • Ошибка Kernel_Mode_Heap_Corruption в Windows 10

[ Telegram | Поддержать ]

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Segmentation fault(SIGSEGV) and Bus error(SIGBUS) are signals generated when serious program error is detected by the operating system and there is no way the program could continue to execute because of these errors.
    1) Segmentation Fault (also known as SIGSEGV and is usually signal 11) occur when the program tries to write/read outside the memory allocated for it or when writing memory which can only be read.In other words when the program tries to access the memory to which it doesn’t have access to. SIGSEGV is abbreviation for “Segmentation Violation”. 
    Few cases where SIGSEGV signal generated are as follows, 
    -> Using uninitialized pointer 
    -> De-referencing a NULL pointer 
    -> Trying to access memory that the program doesn’t own (eg. trying to access an array element 
    out of array bounds). 
    -> Trying to access memory which is already de-allocated (trying to use dangling pointers). 
    Please refer this article for examples.
    2) Bus Error (also known as SIGBUS and is usually signal 10) occur when a process is trying to access memory that the CPU cannot physically address.In other words the memory tried to access by the program is not a valid memory address.It caused due to alignment issues with the CPU (eg. trying to read a long from an address which isn’t a multiple of 4). SIGBUS is abbreviation for “Bus Error”.
    SIGBUS signal occurs in below cases, 
    -> Program instructs the CPU to read or write a specific physical memory address which is not valid / Requested physical address is unrecognized by the whole computer system. 
    -> Unaligned access of memory (For example, if multi-byte accesses must be 16 bit-aligned, addresses (given in bytes) at 0, 2, 4, 6, and so on would be considered aligned and therefore accessible, while addresses 1, 3, 5, and so on would be considered unaligned.)
    The main difference between Segmentation Fault and Bus Error is that Segmentation Fault indicates an invalid access to a valid memory, while Bus Error indicates an access to an invalid address. 
    Below is an example of Bus Error taken from wikipedia.
     

    C

    #include <stdlib.h>

    int main(int argc, char **argv)

    {

    #if defined(__GNUC__)

    # if defined(__i386__)

        __asm__("pushfnorl $0x40000,(%esp)npopf");

    # elif defined(__x86_64__)

        __asm__("pushfnorl $0x40000,(%rsp)npopf");

    # endif

    #endif

        char *cptr = malloc(sizeof(int) + 1);

        int *iptr = (int *) ++cptr;

        *iptr = 42;

        return 0;

    }

    Output : 

    Bad memory access (SIGBUS) 

    This article is contributed by Prashanth Pangera. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
    Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
     

    Ошибка сегментации шины C

    Два общихОшибка выполнения

    • bus error (core dumped) -Ошибка автобуса (информация сброшена)
    • segmentation fault (core dumped) -Segmentation fault (информация сброшена)

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

    Ошибка — это аномалия, обнаруженная операционной системой, и об этой аномалии сообщается, насколько это возможно, исходя из принципа удобства операционной системы. Точные причины ошибок шины и ошибок сегментации различаются в зависимости от версии операционной системы.Здесь описаны два типа ошибок, которые возникают в SunOS, работающей на архитектуре SPARC, и причины ошибок.

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

    Сигнал генерируется из-за аппаратного прерывания.Программирование прерываний очень сложно, потому что они происходят асинхронно (время их возникновения непредсказуемо). Прочтите основной документ и файл заголовка сигналаusr/include/sys/signal.h

    1. Захватить сигнал на ПК

    Функция обработки сигналов является частью ANSI C и, как и UNIX, также подходит для ПК. Например, программисты ПК могут использоватьsignal() Функция перехвата сигнала Ctrl-Break, чтобы пользователи не прерывали программу таким образом.

    В любом исходном файле, который использует сигналы, перед файлом должна быть добавлена ​​строка#include <singal.h>

    Этого сообщенияcore dumped Частично это происходит из очень раннего прошлого, когда вся память была сделана из колец из оксида железа (то есть сердечников). Полупроводники были основным материалом для изготовления памяти более пятнадцати лет, ноcore Это слово до сих пор используется как синоним памяти.

    сердечник [kɔː (r)]: сущ. ядро, острие, сердечник плода, магнитный сердечник vt. копать сердечник ...
    

    2. Ошибка шины

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

    Наш способ выражения правила «элементы данных не могут пересекать страницы или границы кеша» несколько сомнительный, потому что мы используем термин «выравнивание адресов», чтобы обозначить эту проблему, а не прямо заявлять, что межстраничный доступ к памяти запрещен, но они говорят в то же время вещь. Например, при доступе к 8-байтовым данным типа double адрес может быть только целым числом, кратным 8. Таким образом, двойные данные могут храниться по адресу 24, 8008 или 32768, но не по адресу 1006 (потому что он не делится на 8 без остатка).Размер страницы и кеша тщательно продуман, чтобы при соблюдении правил выравнивания можно было гарантировать, что элемент атомарных данных не пересечет границу страницы или блока кэша.

    2.1 Программа, вызвавшая ошибку шины

    //============================================================================
    // Name        : main
    // Author      : Yongqiang Cheng
    // Version     : Version 1.0.0
    // Copyright   : Copyright (c) 2019 Yongqiang Cheng
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
    	union union_name
    	{
    		char a[10];
    		int i;
    	} union_object;
    
    	printf("argc = %dn", argc);
    
    	for (int idx = 0; idx < argc; ++idx)
    	{
    		printf("argv[%d] --> %sn", idx, argv[idx]);
    	}
    
    	printf("argv[argc] = %pnn", (void*)argv[argc]);
    
    	int *pt = (int *)&(union_object.a[1]);
    	int *pi = (int *)&(union_object.i);
    
    	*pt = 17;
    
    	printf("*pt = %dn", *pt);
    	printf("pt = %pn", pt);
    	printf("pi = %pn", pi);
    
    	return 0;
    }
    
    argc = 1
    argv[0] --> D:visual_studio_workspaceyongqiangDebugyongqiang.exe
    argv[argc] = 00000000
    
    *pt = 17
    pt = 008FFA39
    pi = 008FFA38
    Пожалуйста, нажмите любую клавишу, чтобы продолжить ...
    

    Никаких ошибок в реальной работе не было, Операционная среда выглядит следующим образом:

    Понравилась статья? Поделить с друзьями:
  • Bus error python
  • Bus error core dumped ubuntu
  • Bus error 10 mac os что это
  • Bus ccw rot ошибка
  • Bus busy or hardware error 11 ponyprog