Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Что означает сообщение "ошибка шины" и 9X_unix-utils чем оно отличается от segmentation fault?
- Я хотел бы добавить простое объяснение для обоих: ошибка сегментации означает, что вы пытаетесь получить доступ к памяти, к которой вам не разрешено (например, это не часть вашей программы). Однако ошибка шины о ...
Ответ #1
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
В настоящее время ошибки шины на x86 случаются 9X_segmentation-fault редко и возникают, когда ваш процессор не 9X_segmentation-fault может даже попытаться получить запрошенный 9X_segfault доступ к памяти, как правило:
- использование инструкции процессора с адресом, который не удовлетворяет требованиям к выравниванию.
Ошибки сегментации 9X_unix-utils возникают при доступе к памяти, которая 9X_unix не принадлежит вашему процессу. Они очень 9X_sigsegv распространены и обычно являются результатом:
- используя указатель на что-то, что было освобождено.
- с использованием неинициализированного, следовательно, фиктивного указателя.
- с использованием нулевого указателя.
- переполнение буфера.
PS: Чтобы 9X_sigsegv быть более точным, не манипулирование самим 9X_segfault указателем вызовет проблемы. Он обращается 9X_c к памяти, на которую указывает (разыменование).
- В моем случае метод static_cast привязал параметр void * к объекту, который хранит обратный вызов (один атрибут указывает на объект, а другой - на метод). Затем вызывается обратный вызов. Однако то, что было передано как void *, было чем-то соверше ...
Ответ #2
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Сбой при доступе к памяти, к которой вам 9X_unix не разрешен доступ. Он доступен только для 9X_unix-programming чтения, у вас нет разрешения и т. Д.
Ошибка 9X_bus-error шины пытается получить доступ к памяти, которой 9X_unix-programming не может быть. Вы использовали адрес, который 9X_segfault не имеет значения для системы, или неправильный 9X_unix-utils адрес для этой операции.
Ответ #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.
Ответ #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
- Зависит от неприятных трюков, которые вы делаете со своим кодом. Вы можете вызвать ошибку шины / ловушку выравнивания, если сделаете что-то глупое, например, выполните математические вычисления с указателем, а затем привед ...
Ответ #5
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
В системах POSIX вы также можете получить сигнал 9X_sigsegv SIGBUS, когда по какой-либо причине кодовая страница 9X_segfault не может быть загружена.
- Это часто случается, когда я обновляю файл .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
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Классический случай ошибки шины возникает 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 позволит получить доступ (хотя и медленнее).
- @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 шины. Почему? Я правда не знаю.
- "foo" хранится в сегменте памяти, доступном только для чтения, поэтому запись в него невозможна. Это не ...
Ответ #9
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Я получал ошибку шины, когда корневой каталог 9X_bus-error был на 100%.
Ответ #10
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Это зависит от вашей ОС, процессора, компилятора 9X_unix-programming и, возможно, других факторов.
В общем, это 9X_segmentation-fault означает, что шина ЦП не смогла выполнить 9X_segmentation-fault команду или возникла конфликтная ситуация, но 9X_sigsegv это может означать целый ряд вещей, в зависимости 9X_segfault от среды и выполняемого кода.
Ответ #11
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Обычно это означает несогласованный доступ.
Попытка 9X_sigsegv получить доступ к памяти, которая физически 9X_bus-error отсутствует, также приведет к ошибке шины, но 9X_segfault вы не увидите этого, если используете процессор 9X_segfault с MMU и ОС, которая не содержит ошибок, потому 9X_bus-error что вы этого не сделаете. иметь любую несуществующую 9X_sigsegv память, отображаемую в адресное пространство 9X_bus-error вашего процесса.
- У моего 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)
Ответ #13
Ответ на вопрос: Что такое ошибка шины? Чем он отличается от ошибки сегментации?
Я только что на собственном горьком опыте 9X_unix выяснил, что на процессоре ARMv7 вы можете 9X_c написать код, который выдает ошибку сегментации 9X_unix-utils при неоптимизации, но при компиляции с -O2 9X_sigsegv (оптимизировать больше) выдает ошибку шины.
Я 9X_segfault использую кросс-компилятор GCC ARM gnueabihf 9X_segfault из 64-разрядной версии Ubuntu.
- Как это отвечает на вопрос?<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.
-
7
-
6
-
3
-
3
-
16
-
3
-
8
-
7
-
2
-
2
-
4
-
7
-
6
-
10
-
3
-
17
-
5
-
3
-
3
-
1
-
2
-
6
-
10
-
2
-
2
-
8
-
6
-
5
-
5
-
2
-
2
-
6
-
2
-
1
-
8
-
1
-
2
-
3
-
3
-
2
-
1
-
2
-
5
-
6
-
3
-
3
-
4
-
5
-
3
-
3