버스 오류

Bus error

컴퓨팅에서 버스 오류는 하드웨어에 의해 제기되는 오류로, CPU가 물리적으로 주소를 지정할 수 없는 메모리에 접근하려고 하는 프로세스를 운영 체제(OS)에 통보하는 것으로, 이는 주소 버스의 잘못된 주소인 것이다.대부분의 아키텍처에서 현대적으로 사용되는 경우, 이는 주로 메모리 액세스 위반으로 인해 발생하는 분할 결함보다 훨씬 드물다: 논리 주소 또는 권한의 문제.

POSIX 호환 플랫폼에서 버스 오류는 대개 오류를 일으킨 프로세스로 SIGBUS 신호가 전송되는 결과를 초래한다.SIGBUS는 또한 버스 오류가 컴퓨터 하드웨어가 물리적으로 고장났다는 것을 의미하지는 않지만 컴퓨터가 감지하는 모든 일반적인 장치 오류에 의해 발생할 수 있다. 이는 일반적으로 소프트웨어버그에 의해 발생한다.[citation needed]버스 오류는 특정 다른 페이징 오류에 대해서도 제기될 수 있다. 아래를 참조하십시오.

원인들

버스 오류의 주요 원인은 다음과 같다.

존재하지 않는 주소

소프트웨어는 CPU가 특정 물리적 메모리 주소를 읽거나 쓰도록 지시한다.따라서 CPU는 주소 버스에 이 물리적 주소를 설정하고 CPU에 연결된 다른 모든 하드웨어가 이 특정 주소에 대해 응답할 경우 결과에 응답하도록 요청한다.다른 하드웨어가 응답하지 않을 경우 CPU는 요청된 물리적 주소를 전체 컴퓨터 시스템에서 인식하지 못한다고 명시하여 예외를 제기한다.이는 실제 메모리 주소만 다룬다는 점에 유의하십시오.정의되지 않은 가상 메모리 주소에 접근하려고 하면 일반적으로 버스 오류보다는 분할 오류로 간주되지만 MMU가 분리되어 있으면 프로세서가 차이를 구별할 수 없다.

정렬되지 않은 액세스

대부분의 CPU는 바이트 주소 지정이 가능하며, 여기서 각각의 고유한 메모리 주소는 8비트 바이트를 가리킨다.대부분의 CPU는 각 메모리 주소에서 개별 바이트에 액세스할 수 있지만, 이러한 장치가 특정 경계(x86 플랫폼은 주목할 만한 예외)에 "정렬"되지 않고서는 일반적으로 더 큰 단위(16비트, 32비트, 64비트 등)에 접근할 수 없다.

예를 들어, 멀티바이트 액세스가 16비트 정렬이어야 하는 경우, 0, 2, 4, 6 등의 주소(바이트 단위)는 정렬된 것으로 간주되어 접근 가능한 것으로 간주되는 반면, 주소 1, 3, 5 등은 정렬되지 않은 것으로 간주된다.마찬가지로, 멀티바이트 액세스가 32비트 정렬이어야 하는 경우, 어드레스 0, 4, 8, 12 등이 정렬된 것으로 간주되어 접속이 가능하며, 그 사이에 있는 모든 어드레스는 비정렬된 것으로 간주된다.정렬되지 않은 주소에서 바이트보다 큰 장치에 액세스하려고 하면 버스 오류가 발생할 수 있다.

어떤 시스템은 사용 중인 아키텍처에 따라 이것들의 혼합을 가질 수 있다.예를 들어 IBM System z, Fujitsu B8000, RCA Spectrum 및 UNIVAC Series 90을 포함한 IBM System/360 메인프레임에 기반한 하드웨어의 경우, 지침서는 16비트 경계, 즉 실행 주소는 짝수 바이트에서 시작해야 한다.홀수 주소로 분기하려고 하면 규격 예외가 발생한다.[1]그러나 데이터는 메모리의 모든 주소에서 검색할 수 있으며 지침에 따라 1바이트 이상일 수 있다.

CPU는 일반적으로 항상 데이터 버스의 전체 폭에서 데이터에 액세스한다.바이트를 어드레싱하려면 데이터 버스의 전체 너비로 메모리에 접근한 다음, 개별 바이트를 어드레싱하도록 마스크하고 이동한다.시스템은 대부분의 소프트웨어, 특히 문자열 처리에 필수적인 기능이기 때문에 이 비효율적인 알고리즘을 용인한다.바이트와 달리, 큰 단위는 정렬된 두 개의 주소에 걸쳐 있을 수 있으므로 데이터 버스에서 두 개 이상의 가져오기가 필요하다.CPU가 이를 지원하는 것은 가능하지만, 이 기능은 기계 코드 수준에서 직접 요구되는 경우는 드물기 때문에 CPU 설계자는 보통 구현을 피하고 대신 비정렬 메모리 액세스를 위해 버스 오류를 발생시킨다.

페이징 오류

때 가상 메모리 페이지에서, 예를 들어 호출을 받을 수 없기 때문에(예를 들어. 그러면서 프로그램을 운영하고 있던 또는 생략되고 있는 이치 영상 실행 메모리 매핑 된 파일에 접근하는)[2][신뢰할 수 없는 공급원인가?]이나 이유는just-created 메모리 매핑 된 파일이 신체적으로 allocated, 수 없는 사라졌다 FreeBSD의, 리눅스와 솔라리스 버스 오류 신호를 보낼 수 있다. 왜냐하면 디스크ful 있다.l

존재하지 않는 세그먼트(x86)

x86에는 분할이라고 알려진 오래된 메모리 관리 메커니즘이 있다.애플리케이션 로딩 세그먼트가 비현재 세그먼트(POSIX 호환 OS에서 어셈블리 언어로만 수행할 수 있음)의 선택기에 등록될 경우 예외가 생성된다.일부 OS는 스와핑을 위해 그것을 사용했지만, Linux에서 이것은 SIGBUS를 생성한다.

AT&T 어셈블리 구문으로 C 프로그래밍 언어로 작성된 비정렬 메모리 액세스의 예다.

#include <stdlib.h>  인트로 본래의(인트로 argc, 마를 뜨다 **아그브)  {     인트로 *itpr;     마를 뜨다 *CPTR;      #정의된 경우(__GNUC__) #(_i386__)이__)     /* x86 */에서 정렬 확인 사용     __asm___(" "f.\n$0x40000(%esp)\n펑펑"); # elif 정의(_x86_64___)      /* x86_64 */에서 정렬 확인 사용     __asm___(" "f.\n$0x40000(%rsp)\n펑펑"); #endif #endif      /* mallocal은 항상 모든 기본 유형에 맞춰 정렬된 메모리를 제공한다 */     CPTR = 만록의(의 크기(인트로) + 1);          /* 포인터를 1씩 증가시켜 잘못 정렬되도록 한다 */     itpr = (인트로 *) ++CPTR;      /* 인트 포인터로 폐기하여 비정렬 액세스를 발생 */     *itpr = 42;      /* 다음의 접속은 또한 시그버스 오류를 발생시킬 것이다. 짧은 *sptr; in i;  sptr = (짧은 *)&i; // 모든 홀수 값 증분에 대해 시그버스가 발생한다. sptr = (짧은 *)((차르 *)sptr) + 1); *sptr = 100;      */      돌아오다 0; } 

x86POSIX 호환 OS에서 예를 컴파일하고 실행하면 다음과 같은 오류가 나타난다.

$gcc -ansi sigbus.c -o sigbus $ ./sigbus 오류 $gdb ./sigbus (gdb) r Program 수신 신호 SIGBUS, 버스 오류.메인()0x080483ba in main (gdb) x/i $pc 0x80483ba <main+54>:mov DWORD PTR [eax],0x2a (gdb) p/x $1 = 0x804a009 (gdb) p/t $eax & (int) - 1)$2 = 1

GDB 디버거즉시 값 0x2a가 X86 어셈블리 언어를 사용하여 EAX 레지스터에 저장된 위치에 저장되고 있음을 보여준다.이것은 레지스터 간접 주소 지정의 예다.

주소의 낮은 순서 비트를 인쇄하는 것은 그것이 단어 경계("x86 용어를 사용한 단어")에 정렬되지 않았음을 보여준다.

참조

  1. ^ z/Architecture Principles of Operation, SA22-7832-04, 페이지 6-6, Fifth Edition(2005년 9월) IBM Corporation, Poukeepsie, NY, Retrievable from http://publibfp.dhe.ibm.com/epubs/pdf/a2278324.pdf (2015년 12월 31일 회수)
  2. ^ "What is SIGBUS - Object specific hardware error?".