exception - 하드웨어 - 인터럽트 및 예외




하드웨어 인터럽트 (8)

예외

예외는 프로세서가 정상 경로에 있지 않은 코드를 실행하는 경우입니다. 이는 코드 및 제어 구조를 통한 본질적으로 선형 이동 인 정상 작동에 대한 '예외'입니다. 다른 언어는 프로그램 운영 중 오류를 처리하는 데 일반적으로 사용되는 다양한 유형의 예외를 지원합니다.

일시 정지

인터럽트는 하드웨어 레벨에서 예외입니다 (일반적으로). 인터럽트는 CPU가 현재 상태를 저장하고 인터럽트 (또는 예외) 처리기 코드로 점프하도록 지시하는 프로세서의 물리적 신호입니다. 핸들러가 완료되면 원래 상태가 복원되고 처리가 계속됩니다.

인터럽트는 의도 된 경우에도 항상 예외입니다. 인터럽트는 다음을 나타낼 수 있습니다.

  • 메모리 액세스 위반과 같은 오류
  • 운영 체제가 소프트웨어 인터럽트 또는 메모리 페이징 요청과 같이 실행중인 프로그램을 지원하기위한 작업을 수행해야한다는 것을 의미합니다
  • 하드웨어 장치는 수신 된 네트워크 패킷 또는 비어있는 송신 버퍼와 같은주의가 필요합니다.

이것들은 프로세서가 발생 된 예외를 처리하기 위해 현재 활동을 일시 중지하도록 강제하며, 인터럽트 처리기가 완료되면 다시 시작합니다.

함정

인터럽트 측면에서 일반적인 함정은 경쟁 조건입니다. 예를 들어 주기적으로 글로벌 실시간 시계를 증가시키는 인터럽트가있을 수 있습니다. 시계는 32 비트 컴퓨터에서 64 비트가 될 수 있습니다.

프로그램이 시계를 읽고 첫 번째 32 비트 워드를 얻으면 인터럽트가 발생하고 인터럽트 처리기가 종료되면 프로세스가 두 번째 32 비트 워드를 가져오고 데이터가 비 일관성이됩니다. 두 단어가 동기화되지 않을 수 있습니다 . 프로세스에서 변수를 잠그기 위해 뮤텍스 또는 세마포를 사용하려고하면 처리기와 데이터를 사용하는 프로세스가 매우주의 깊게 작성되지 않는 한 인터럽트는 잠금 대기 및 시스템 정지 (교착 상태)로 중단됩니다. 인터럽트를 작성할 때 문제가 생기기 쉽습니다.

재진입 기능도 또 다른 문제입니다. 프로그램 코드에서 funcA를 실행하는 경우 funcA를 실행하는 인터럽트를 사용하면 공유 변수 (정적 또는 힙 변수, 클래스 등)로 인해 의도하지 않은 결과가 발생할 수 있습니다. 일반적으로 인터럽트 처리기에서 가능한 한 적은 코드로 실행하고 빈번하게 충돌을 걱정하지 않고 프로세스가 실제 작업을 수행 할 수 있도록 플래그를 설정해야합니다.

어떤 점에서 이것은 다중 프로세서를 개발하는 것과 유사하며 많은 사람들이 커널 프로그래밍을 여전히 흑 마술로 여긴 이유 중 하나입니다.

-아담

여기서 예외 에 대한 몇 가지 질문을 보았습니다. 예외 중 일부는 예외 로 인터럽트를 암시하지만 아무도 연결을 명확하게하지 않습니다.

  • 인터럽트 란 무엇입니까?

  • 예외 란 무엇입니까? (몇 가지 차이점이 있으므로 알고있는 각 언어에 대한 예외 사항을 설명하십시오)

  • 인터럽트 예외는 언제 발생합니까?

-아담


귀하의 프로세서는 다수의 외부 인터럽트 핀을 가질 것입니다. 일반적으로이 핀은 하드웨어에 연결되며 외부 이벤트가 발생할 때이를 나타내는 데 사용됩니다. 예를 들어 직렬 포트를 사용하는 경우 UART는 프로세서의 인터럽트 핀 중 하나에 연결된 핀을 들어 올려 바이트가 수신되었음을 나타냅니다.

타이머, usb 컨트롤러 등과 같은 다른 주변 장치도 일부 외부 이벤트를 기반으로 인터럽트를 생성합니다.

프로세서가 외부 인터럽트 핀 중 하나에서 신호를 받으면 즉시 메모리의 지정된 위치로 이동하여 실행을 시작합니다. 실행 된 코드는 일반적으로 ISR 또는 인터럽트 서비스 루틴이라고합니다. 드라이버를 구현하거나 어떤 종류의 임베디드 소프트웨어를 사용하지 않는 한 ISR을 접할 수는 없습니다.

불행히도 예외에 대한 질문에 대한 대답은 좀 덜 명확합니다.이 페이지의 다른 대답에는 3 가지 의미가 있습니다.

Ron Savage의 답변은 소프트웨어 구성을 의미합니다. 이것은 순전히 응용 프로그램 수준의 예외이며, 코드 조각은 다른 코드 조각에 의해 감지 될 수있는 오류를 나타낼 수 있습니다. 하드웨어 관련은 전혀 없습니다.

그런 다음 작업에서 볼 수있는 예외가 있습니다. 이것은 0으로 나누거나 불법적으로 메모리에 액세스하는 것과 같이 불법적 인 일을 할 때 작업을 죽이기 위해 사용되는 운영 체제 수준의 구성입니다.

셋째, 하드웨어 예외가 있습니다. 동작면에서 프로세서는 즉시 지명 된 메모리 위치로 이동하여 실행을 시작한다는 점에서 인터럽트와 동일합니다. 예외가 인터럽트와 다른 경우 프로세서가 감지 한 불법적 인 활동으로 인해 예외가 발생합니다. 예를 들어 프로세서의 MMU는 잘못된 메모리 액세스를 감지하여 예외를 발생시킵니다. 이러한 하드웨어 예외는 운영 체제에서 정리 작업을 수행하는 초기 트리거입니다 (위 단락에서 설명한대로).


인터럽트가 무엇인지 자세히 설명해 드리겠습니다. 왜냐하면 아무도 아직 다루지 않은 중요한 유형의 인터럽트 인 타이머가 있기 때문입니다.

하지만 먼저, 내가 다시 보자. 인터럽트가 발생하면 인터럽트를 비활성화하는 인터럽트 핸들러 (커널 공간에 있음)가 실행되면 일반적으로 인터럽트를 비활성화하고 대기중인 모든 비즈니스 (네트워크에 방금 도착한 패킷 처리, 키스트 로크 처리 등)를 확인한 다음 이 시점에서 커널에 남아 있습니다.) 어떤 프로세스가 다음에 실행될 것으로 예상되는지 (동일한 프로세스이거나 다른 프로세스 일 수 있으며 스케줄러에 따라 달라질 수 있음) 파악한 다음 실행하십시오.

한 번에 하나의 프로세스 만 프로세서에서 실행됩니다. 멀티 태스킹 OS를 사용하는 경우 컨텍스트 스위치라고 부릅니다. 기본적으로 프로세서의 레지스터는 메모리에 덤프되고 플로우는 새 프로세스로 전달되며 프로세스가 완료되면 컨텍스트가 무언가로 전환됩니다 그밖에.

그래서, 모든 숫자 또는 피보나치 수열을 멈추지 않고 계산하는 간단한 C 프로그램을 작성한다고 가정 해 봅시다. 또는 더 좋다 : while (1) 루프 안에서는 아무것도하지 않는다. 시스템의 다른 프로세스는 어떻게 실행될 수 있습니까? 인터럽트를 발생시키는 일이 없다면 어떻게 될까요?

그 대답은 끊임없이 방해하는 타이머 장치가 있다는 것입니다. 그리고 회전하는 프로세스가 전체 시스템을 중단시키는 것을 방지합니다. 인터럽트 처리기가 인터럽트를 비활성화한다는 것에주의 할 것이지만, 무한정 차단하는 작업을 수행하면 전체 시스템을 중단시킬 수 있습니다.


인터럽트는 CPU 외부 장치 (타이머 틱, 디스크 작업 완료, 네트워크 패킷 도착 등)에 의해 생성되며 프로그램 실행과 비동기 적 입니다. 예외는 프로그램 실행과 동기 입니다 (예 : 0으로 나누기, 잘못된 주소에 액세스).

프로그램이 운영체제없이 (또는 OS를 개발하면서) 실행되지 않는 한, 원시 예외 / 인터럽트는 절대로 볼 수 없습니다. 그것들은 OS에 의해 캐치되어 인터럽트되거나, 사용자 프로그램에 다시 반영되기 전에 다른 형태로 변환됩니다 (예 : UNIX의 신호, Windows의 구조적 예외 처리 (SEH)). 그것.


인터럽트는 프로세서 코어의 외부에 뭔가주의가 필요하다는 것을 나타냅니다. 프로그램의 정상적인 흐름을 방해하고 인터럽트 서비스 루틴 (ISR)을 실행하며 일반적으로 인터럽트가 발생하기 전의 위치로 되돌아갑니다.

이 기본 테마에는 많은 변형이 있습니다. 인터럽트는 소프트웨어에 의해 생성 될 수 있으며, 다른 태스크는 ISR 후에 CPU를 가져올 수 있습니다. 핵심은 인터럽트가 코드 / CPU에 아무런 이유없이 언제든지 발생할 수 있다는 것입니다 통제 .

예외는 잠재적으로 세 가지 레벨의 의미가 있기 때문에 정의하기가 조금 까다 롭습니다.

하드웨어 예외

특정 프로세서 (예 : PowerPC)는 시스템 재설정, 잘못된 주소, 일부 가상 주소 변환 캐시 누락 등과 같은 비정상적인 조건이 발생했음을 나타내는 예외를 정의합니다.

이러한 예외는 중단 점 및 시스템 호출을 구현하는 데에도 사용됩니다. 이 경우 인터럽트와 거의 유사합니다.

OS 예외

일부 하드웨어 예외는 OS에서 처리합니다. 예를 들어, 프로그램이 잘못된 메모리에 액세스합니다. 이로 인해 하드웨어 예외가 발생합니다. OS에는 해당 예외에 대한 핸들러가 있으며, OS가 문제가 있음을 나타내는 신호 (예 : SIGSEGV)를 OS가 전송할 가능성이 있습니다.

프로그램에 신호 처리기가 설치되어있는 경우, 신호 처리기가 실행되어 잘 처리 될 수 있습니다. 신호 처리기가 없으면 프로그램을 종료하거나 일시 중단 할 수 있습니다.

윈도우의 구조화 된 예외 처리기 (Structured Exception Handlers, SEH)가 이러한 유형의 예외라고 생각합니다.

소프트웨어 예외

Java, C ++ 및 C #과 같은 일부 언어에는 프로그램 예외와 관련된 개념이 있습니다.이 언어는 프로그램 작동과 관련하여 예기치 않거나 비정상적인 조건을 처리 하는 데 사용됩니다 . 이 경우 코드의 어떤 지점에서 예외가 발생하고 프로그램 실행 스택에서 상위 코드가 예외를 "catch"하여 실행합니다. 이것은 try / catch 블록이하는 것입니다.


인터럽트는 하드웨어 또는 특정 CPU 명령어에 의해 생성 된 CPU 신호입니다. 이로 인해 인터럽트 핸들러가 실행됩니다. I / O 하드웨어로부터의 I / O 신호와 같은 것들은 인터 럽트를 생성합니다.

예외는 프로세스에 영향을주는 소프트웨어 버전의 인터 럽트로 간주 될 수 있습니다.

정확한 세부 사항은 확실하지 않지만 예외 인터 럽트로 구현 될 수 있습니다.


일을 단순하게 유지하는 중 ...

인터럽트 처리가 끝나면 중단하기 전에 수행 한 작업으로 돌아갑니다.

예외를 처리하는 것은 예외를 처리 (catch) 할 수있을 때까지 현재 작업중인 내용의 연속 된 레이어를 버리는 것입니다.

인터럽트를 처리하는 동안 예외를 throw하기로 결정할 수는 있지만 인터럽트 자체를 예외로 간주 할 필요는 없습니다. 예외는 "인터럽트"하지 않습니다 (인터럽트가 발생하기 직전의 상태로 돌아갈 가능성을 암시하기 때문에). 오히려 현재 활동을 "중단"(일부분)합니다.

이미 언급했듯이 인터럽트는 일반적으로 하드웨어 또는 사용자 (예 : CTRL-C와 같은 마우스 클릭 또는 키 스트로크)와 같은 외부 엔티티에 의해 트리거되는 반면 예외는 소프트웨어가 "문제"또는 " 예외적 인 조건 "이라고 주장했다.


Iterrupt는 기본적으로 프린터가 "용지 부족"이라고 표시하거나 네트워크 카드가 연결이 끊어 졌음을 나타내는 것처럼 하드웨어로 구동됩니다.

예외는 try / catch 블록에 의해 감지 된 프로그램의 오류 조건 일뿐입니다. 처럼:

Try
   {
   ... various code steps that "throw exceptions" on error ...
   }
catch (exception e)
   {
   print 'Crap! Something bad happened.' + e.toString()
   }

코드 블록에서 발생하는 "모든 오류"를 잡아내는 비슷한 방법으로 유사한 방식으로 처리 할 수 ​​있습니다.







interrupt