Skip to content

Instantly share code, notes, and snippets.

@yunsu3042
Last active June 13, 2018 05:13
Show Gist options
  • Save yunsu3042/bc7dc810720592c543d2ceb8c06b507a to your computer and use it in GitHub Desktop.
Save yunsu3042/bc7dc810720592c543d2ceb8c06b507a to your computer and use it in GitHub Desktop.
exception

Exceptional Control Flow

Control Flow

  • 프로세서는 전원이 공급되는 동안 같은 일만 반복한다. 인스트럭션을 읽고 수행하는 일만을 반복한다.
  • CPU는 Branch와 call, ret와 같은 인스트럭션에 대해서 프로그램 수준에서 Control을 교환하는 수준으로 일하고 있다.
  • 하지만 좀 더 큰 시스템, 즉 컴퓨터 시스템에서 본다면 이렇게 간단한 수준의 Control Flow으로는 시스템 운영이 불가능하다.
  • System Timer에도 반응해야하고, 유저의 키보드 입력, 디스크와 어댑터로부터 데이터의 입력 등 수 많은 Control Flow의 제어가 필요하다. 우리는 그것을 Exceptional Control Flow라고 부른다.

Exceptional Control Flow

Low Level

  • Exception : 시스템의 상태에 반응해서 Control Flow 즉 제어권을 넘긴다. 주로 하드웨어와 OS가 결합되어 실행된다.

High Level

  • Process Context Switch : Os와 Hardware timer가 결합되어 실행된다.
  • Signal : OS에 의해 실행
  • NonLocal Jump :

1. Exception

  • Exception은 어떤 이벤트에 반응해서 제어권을 OS에 넘기는 사건이다. 예를 들어 사용자의 ctrl-C입력이 있다.
  • Exception을 효과적으로 처리하기 위해서 Exception Table은 각 인덱스마다 해당하는 Handler를 설정해두었다.
  • Exception을 일으킬 수 있는 각각의 이벤트들은 저마다 Exception Table 인덱스를 가지고 있다.
  • Exception이 발생하면 Exception Table의 해당 인덱스로 넘어가 Handler를 호출한다.

Exception의 종류

  1. Asyncronous Exception
  • 프로세서의 외부에서 오는 Exception으로 interrupt라고 말한다.
  • 사용자의 Ctrl-C 입력, 네트워크로부터의 패킷 도착, 디스크로부터의 데이터 도착과 같이 비동기적으로 프로세서 외부에서 입력되는 이벤트들인다.
  1. Syncronous Exception
  • 동기적으로 발생하는 Exception은 크게 3가지 종류가 있다.
  • a. Traps : 의도적으로 발생시키는 경우
    • 시스템콜(System call)이 대표적인 예다.
    • 다음 instruction으로 control을 넘긴다.
  • b. Faults : 의도치 않았지만 복구가 가능한 경우
    • 대표적으로 page Fault가 있다.
  • c. Aborts : 의도치 않았고 복구도 불가능한 경우
    • 적절치 않은 instruction 이 있다.

System call

  • x86-64 시스템은 System Call에 번호가 정해져 있다.
  • 예를 들면 파일을 읽는 read는 0번, 파일을 쓰는 write는 1번으로 정해져있다.
  • 파일을 여는 경우 instruction은 %rax레지스터에 2를 저장한후 시스템 콜 인스트럭션을 호출한다.
  • 시스템 콜은 해당 번호 2번에 들어가서 해당하는 명령을 수행하는 데 2번은 파일을 여는 명령이기 때문에 파일을 열 수 있게 된다.

Page Fault

  • page fault는 의도치 않게 사용자가 규정에 벗어난 메모리 쓰기를 시도할 때 일어난다.
 int main()
 {	
	 int A[1000];
	 A[5000] = 30;
 }
  • 위와 같은 코드가 있을 경우 똑똑한 컴파일러는 컴파일 단계에서 Exception을 잡아주기도 하지만 그렇지 못한 경우에는 실행과정에서 Page Fault가 발생하게 된다.
  • 이경우 SIGSEGV와 같은 세그멘테이션 폴트라는 Exception을 출력한다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment