LISTORY

[윈도우즈 시스템 프로그래밍] 구조적 예외처리(SEH) 기법 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 구조적 예외처리(SEH) 기법

LiStoryTeller 2018. 10. 20. 20:58


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다.


오늘 다룰내용은 구조적 예외처리(SEH) 기법이다.


YouTube 주소 : 구조적 예외처리(SEH) 기법



구조적 예외처리(SEH) 기법


현재 여러분의 컴푸터에서 발생하는 예외는 어떻게 처리될까? 큼직하게 그림을 그려보자.


첫번째 강의에서 말한 적 있듯이, 보통 시스템을 생각하면 운영체제와 하드웨어가 존재한다.


덧붙이자면 우리가 개발한 응용 어플리케이션들도 존재한다.


⊙ 시스템?


CPU + OS  | + APP

    내부        외부


보편적으로 이렇게 보는 경우가 많다.


근데 CPU 관점에서는? OS이던 APP이던 다 S/W이다. CPU는 구분하지 않고 그저 연산만 수행한다.



⊙ 예외상황


CPU 디자인할때, 몇가지 규칙들이 있다. 예를 들자면, CPU 연산 방법은 정해져있다. 


8byte/4byte 연산이 가능할까? 안된다. CPU는 동일한 바이트의 크기만 연산한다.


만일 32비트 CPU라면, 기본적인 연산 단위는 4byte이다. 즉, 내부적으로 32비트로 변환해서 연산한다.


이는 앞에 강의에서 말한 적 있듯이, 내부적으로 단순화 시킬수록 효과적이기 때문이다.


다른 예제로는 나누기 0은 불가능하다는 규칙이 있다.


만일, 0으로 나누라는 명령어가 CPU에 들어온다면, 이것이 바로 예외상황이다.


CPU는 자기가 나름대로 정해놓은 예외상황이 있다.


CPU는 몇개 정해둔 예외상황이 정해져 있고, 이런 상황이 되면 어떻게 처리할지는 CPU가 결정하지 않는다. 


예외상황이 발생 시, 이에 대한 해결 방법은 담당 S/W가 정하라는 것이 CPU의 정책이다.


그래서 S/W는 그런 경우, 즉 정해진 예외처리에 대한 핸들러(대응 방안)를 미리 마련해두어야한다.


CPU가 1번 예외 발생한다면, 그럼 SW 1번 핸들러와 S/W 적으로 연결되어 핸들러가 실행된다.


즉, S/W가 결정권을 가지고 있다. 


하지만 CPU의 예외 상황은 하드웨어적으로 픽스되어있는데, 이런 걸 H/W 예외라고 한다.


이 예외가 발생했을 때 어떻게 처리할지에 대한 결정권이 S/W에게 있는 것이다.


그럼 S/W는 누가 하는가? 우리를 대신해서 OS에 이미 설정이 되어있다.


이제 윈도우즈 관점에서 보자..


윈도우즈는 과연 H/W에서 예외를 전달받을 때 어떻게 할까?



윈도우즈의 예외처리 기법


CPU에서 1,2,3,4 예외가 있을 수 있다고 명시해두었다 해보자. 그럼 운영체제는 그 예외들에 대한 핸들러를 정의해두었다.


그런데 윈도우즈라는 운영체제는 내부적으로 SEH라는 매커니즘을 가지고 있다.



CPU 예외 발생하면, 그 예외를 OS에게 알려준다. 하지만 OS 관점에서 보면, OS가 이걸 함부로 처리할 수 없는 경우가 많다.


만일 OS가 시킨거라면 OS가 처리하겠지만, 보통 우리가 개발한 어플리케이션 프로그램일 확률이 높다.


물론 그러면 이 예외상황은 어플리케이션이 처리해야 한다.


그러므로 OS는 어플리케이션쪽에게 예외가 발생했다고 알려주어야 한다.


다시 보자면 CPU와 OS관계, OS와 APP 관계가 똑같다.


OS가 어플리케이션에게 예외를 알려주고, 그 예외를 처리하는 방법을 알려주는데


그게 바로 SEH 매커니즘이다.



⊙ SEH 매커니즘


SEH 매커니즘에서는 단순히 OS가 CPU에서 전달해 주는 예외를 전달만 해주는 것이 아니다. 더 확장시켰다.


OS관점에서 불합리한 것,예외라는 상황을 정의하여 예외를 발생할 수 있도록 확장하였다.


즉, OS 입장에서도 예외를 정의할 수 있는 것이다.


그래서 오류는 H/W 적으로 발생하는 오류, OS에서 발생하는 오류가 있다.


CPU에서 발생 : H/W 예외

OS에서 발생 : S/W 예외


만일 나누기 0은? HW 예외이다.


근데 이 예외를 받아서 OS가 어플리케이션에게 넘겨줄 땐, 프로그램 관점에서 보면 운영체제에서 보내준걸로 보인다


그럼 이게 H/W 예외일까? 아님 S/W 예외일까?


보편적으로 이걸 S/W예외라 하지 않는다. 근본이 무엇이냐에 따라 나눈다.


시발점이 CPU면 H/W, OS일 경우 S/W라 이야기한다.



S/W 예외는 또 다시 확장을 했다. APP도 예외상황을 발생할 수 있도록 허용해준 것이다. 


운영체제나, APP이나 같은 S/W이기 때문이다.


다시 정리해보겠다.


- H/W, OS, APP 이 모두 예외를 발생시킬 수 있다.


- H/W 예외 발생 시, OS가 APP에게 전달해준다.


- SEH에 의해 APP도 예외 생성 가능하다.


- OS, APP 묶어서 S/W 예외라 한다.












Comments