Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Что означает сообщение "ошибка шины" и 9X_unix-utils чем оно отличается от segmentation fault?

326
1

  • Я хотел бы добавить простое объяснение для обоих: ошибка сегментации означает, что вы пытаетесь получить доступ к памяти, к которой вам не разрешено (например, это не часть вашей программы). Однако ошибка шины о ...
14
Общее количество ответов: 14

Ответ #1

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

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

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

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

PS: Чтобы 9X_sigsegv быть более точным, не манипулирование самим 9X_segfault указателем вызовет проблемы. Он обращается 9X_c к памяти, на которую указывает (разыменование).

309
4

  • В моем случае метод static_cast привязал параметр void * к объекту, который хранит обратный вызов (один атрибут указывает на объект, а другой - на метод). Затем вызывается обратный вызов. Однако то, что было передано как void *, было чем-то соверше ...

Ответ #2

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Сбой при доступе к памяти, к которой вам 9X_unix не разрешен доступ. Он доступен только для 9X_unix-programming чтения, у вас нет разрешения и т. Д.

Ошибка 9X_bus-error шины пытается получить доступ к памяти, которой 9X_unix-programming не может быть. Вы использовали адрес, который 9X_segfault не имеет значения для системы, или неправильный 9X_unix-utils адрес для этой операции.

105
0

Ответ #3

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

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

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

#include  /* O_ constants */
#include  /* ftruncate */
#include  /* 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

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

POSIX describes SIGBUS как:

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

mmap spec говорит, что:

Ссылки 9X_sigsegv в диапазоне адресов, начинающиеся с pa и 9X_segfault продолжающиеся в течение len байтов на целые 9X_unix страницы, следующие за концом объекта, должны 9X_segmentation-fault приводить к доставке сигнала SIGBUS.

И shm_open says that он 9X_segfault генерирует объекты размером 0:

Размер объекта 9X_unix-programming общей памяти равен нулю.

Итак, в *map = 0 мы касаемся 9X_unix-utils конца выделенного объекта.

Невыровненные обращения к памяти стека в ARMv8 aarch64

Это было упомянуто 9X_unix-programming по адресу: What is a bus error? для SPARC, но здесь я приведу 9X_unix-programming более воспроизводимый пример.

Все, что вам 9X_c нужно, это автономная программа на 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

Затем 9X_sigsegv эта программа вызывает SIGBUS в Ubuntu 18.04 9X_unix aarch64, ядро ​​Linux 4.15.0 в ThunderX2 server machine.

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

Ошибка 9X_unix-programming кажется необязательной и управляется полями 9X_sigsegv SCTLR_ELx.SA и SCTLR_EL1.SA0, я обобщил соответствующие документы 9X_unix-utils a bit further here.

23
0

Ответ #4

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

От: Here

11
1

  • Зависит от неприятных трюков, которые вы делаете со своим кодом. Вы можете вызвать ошибку шины / ловушку выравнивания, если сделаете что-то глупое, например, выполните математические вычисления с указателем, а затем привед ...

Ответ #5

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

В системах POSIX вы также можете получить сигнал 9X_sigsegv SIGBUS, когда по какой-либо причине кодовая страница 9X_segfault не может быть загружена.

9
2

  • Это часто случается, когда я обновляю файл .so во время выполнения проц ...

Ответ #6

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Я согласен со всеми приведенными выше ответами. Вот 9X_unix-programming мои 2 цента за ошибку АВТОБУСА:

Ошибка шины 9X_c не обязательно должна возникать из-за инструкций 9X_segfault в программном коде. Это может произойти, когда 9X_segmentation-fault вы запускаете двоичный файл, и во время 9X_unix-utils выполнения двоичный файл изменяется (перезаписывается 9X_segmentation-fault сборкой или удаляется и т. Д.).

Проверка, так ли это

Простой способ 9X_unix-programming проверить, является ли это причиной, - запустить 9X_sigsegv несколько экземпляров одного и того же двоичного 9X_segfault файла из выходного каталога сборки и запустить 9X_segfault сборку после их запуска. Оба запущенных 9X_unix экземпляра аварийно завершили бы сбой с 9X_unix-programming ошибкой SIGBUS вскоре после завершения сборки 9X_segmentation-fault и замены двоичного файла (того, что оба 9X_segmentation-fault экземпляра работают в данный момент).

Основная причина

Это 9X_c связано с тем, что ОС меняет местами страницы 9X_unix памяти, и в некоторых случаях двоичный файл 9X_unix может быть загружен в память не полностью. Эти 9X_unix-utils сбои происходят, когда ОС пытается получить 9X_c следующую страницу из того же двоичного 9X_segfault файла, но двоичный файл изменился с момента 9X_sigsegv последнего чтения.

7
0

Ответ #7

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Классический случай ошибки шины возникает 9X_unix на определенных архитектурах, таких как 9X_unix-programming SPARC (по крайней мере, некоторые SPARC, возможно, это 9X_sigsegv было изменено), когда вы выполняете несогласованный 9X_bus-error доступ. Например:

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

Этот фрагмент кода пытается 9X_sigsegv записать 32-битное целочисленное значение 9X_c 0xdeadf00d по адресу, который (скорее всего) неправильно 9X_segfault выровнен, и вызовет ошибку шины на архитектурах, которые 9X_bus-error "придирчивы" в этом отношении. Между 9X_unix-programming прочим, Intel x86 не такой архитектурой. Это 9X_unix позволит получить доступ (хотя и медленнее).

5
3

  • @Supercat: Дело в том, что на X86 это сходит с рук. Вы попробуете это на ARM, MIPS, Power и т. Д., И с в ...

Ответ #8

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

#include 
#include 

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

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

4
1

  • "foo" хранится в сегменте памяти, доступном только для чтения, поэтому запись в него невозможна. Это не ...

Ответ #9

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

4
0

Ответ #10

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

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

2
0

Ответ #11

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Обычно это означает несогласованный доступ.

Попытка 9X_sigsegv получить доступ к памяти, которая физически 9X_bus-error отсутствует, также приведет к ошибке шины, но 9X_segfault вы не увидите этого, если используете процессор 9X_segfault с MMU и ОС, которая не содержит ошибок, потому 9X_bus-error что вы этого не сделаете. иметь любую несуществующую 9X_sigsegv память, отображаемую в адресное пространство 9X_bus-error вашего процесса.

2
1

  • У моего i7 определенно есть MMU, но я все еще сталкивался с этой ошибкой при изучении C в OS X (передача неинициализированного указателя на `scan ...

Ответ #12

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Во-первых, SIGBUS и SIGSEGV не являются 9X_unix-utils конкретным типом ошибок, а представляют 9X_segmentation-fault собой группы или семейства ошибок. Вот почему 9X_segmentation-fault вы обычно видите номер сигнала (si_no) и 9X_sigsegv код сигнала (si_code).

Они также зависят 9X_sigsegv от операционной системы и архитектуры относительно 9X_bus-error того, что именно может их вызвать.

В целом 9X_bus-error можно так сказать. SIGSEGV связан с сопоставлениями 9X_unix памяти (разрешения, без сопоставления), то 9X_segfault есть с ошибкой mmu.

SIGBUS - это когда сопоставление 9X_c памяти выполнено успешно и вы столкнулись 9X_segmentation-fault с проблемой с базовой системой памяти (нехватка 9X_sigsegv памяти, нет памяти в этом месте, выравнивание, smmu 9X_segfault предотвращает доступ и т. д.), то есть ошибка 9X_sigsegv шины ..

SIGBUS также может быть с файлами 9X_unix-utils mmapped, если файл исчезает из системы, например. вы 9X_segfault размещаете файл на съемном носителе, и он 9X_c отключается.

Хорошее место для изучения платформы 9X_bus-error - это заголовок siginfo.h, чтобы получить 9X_unix представление о подтипах сигналов. например 9X_segfault для linux На этой странице представлен обзор. https://elixir.bootlin.com/linux/latest/source/include/uapi/asm-generic/siginfo.h#L245

/*
 * SIGSEGV si_codes
 */
#define SEGV_MAPERR 1   /* address not mapped to object */
#define SEGV_ACCERR 2   /* invalid permissions for mapped object */
#define SEGV_BNDERR 3   /* failed address bound checks */
#ifdef __ia64__
# define __SEGV_PSTKOVF 4   /* paragraph stack overflow */
#else
# define SEGV_PKUERR    4   /* failed protection key checks */
#endif
#define SEGV_ACCADI 5   /* ADI not enabled for mapped object */
#define SEGV_ADIDERR    6   /* Disrupting MCD error */
#define SEGV_ADIPERR    7   /* Precise MCD exception */
#define SEGV_MTEAERR    8   /* Asynchronous ARM MTE error */
#define SEGV_MTESERR    9   /* Synchronous ARM MTE exception */
#define NSIGSEGV    9

/*
 * SIGBUS si_codes
 */
#define BUS_ADRALN  1   /* invalid address alignment */
#define BUS_ADRERR  2   /* non-existent physical address */
#define BUS_OBJERR  3   /* object specific hardware error */
/* hardware memory error consumed on a machine check: action required */
#define BUS_MCEERR_AR   4
/* hardware memory error detected in process but not consumed: action optional*/
#define BUS_MCEERR_AO   5
#define NSIGBUS     5

Последнее 9X_segmentation-fault замечание: все сигналы также могут генерироваться 9X_bus-error пользователем, например убийство. Если он 9X_unix-programming создан пользователем, то si_code - SI_USER. Поэтому 9X_segmentation-fault специальные источники получают отрицательные 9X_segfault si_codes.

/*
 * si_code values
 * Digital reserves positive values for kernel-generated signals.
 */
#define SI_USER     0       /* sent by kill, sigsend, raise */
#define SI_KERNEL   0x80        /* sent by the kernel from somewhere */
#define SI_QUEUE    -1      /* sent by sigqueue */
#define SI_TIMER    -2      /* sent by timer expiration */
#define SI_MESGQ    -3      /* sent by real time mesq state change */
#define SI_ASYNCIO  -4      /* sent by AIO completion */
#define SI_SIGIO    -5      /* sent by queued SIGIO */
#define SI_TKILL    -6      /* sent by tkill system call */
#define SI_DETHREAD -7      /* sent by execve() killing subsidiary threads */
#define SI_ASYNCNL  -60     /* sent by glibc async name lookup completion */

#define SI_FROMUSER(siptr)  ((siptr)->si_code <= 0)
#define SI_FROMKERNEL(siptr)    ((siptr)->si_code > 0)

2
0

Ответ #13

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

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

Я 9X_segfault использую кросс-компилятор GCC ARM gnueabihf 9X_segfault из 64-разрядной версии Ubuntu.

1
1

  • Как это отвечает на вопрос?<p> ...

Ответ #14

Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?

Моя причина ошибки шины в Mac OS X заключалась 9X_unix-utils в том, что я пытался выделить около 1 МБ 9X_unix в стеке. Это хорошо работало в одном потоке, но 9X_unix-programming при использовании openMP это приводит к 9X_segfault ошибке шины, потому что Mac OS X имеет очень 9X_unix-programming ограниченный stack size for non-main threads.

1
0