1. Exception Handling in C++
C++ 이라는 언어를 사용 한다면 기본적으로 사용하는 if, else, for, while 등의 제어 로직을 제외하고서, 포인터, 클래스를 거쳐 아마도 "예외처리" 라는 부분에 대해서 공부를 하셨을 겁니다. 과연 해당 예외 처리라는 것은 어떠한 것일까요? 아마도 아래와 같은 코드를 한 번쯤은 보셨으리라 생각합니다.
위 코드가 일반적으로 예외처리에 대해서 C++, Java, C# 등의 대략적인 형태 입니다. 언어마다 약간씩 다른 부분은 존재하지만 전반적으로 모양은 다들 비슷합니다. 그런데 말이죠. 이러한 exception의 구현 원리가 궁금하지 뭡니까?
사실은 이전에 만들고 있던 PlugIn OS라는 OS를 C++ 로 커널을 작성하다 보니 현재 제공되고 있는 것은 new, delete 로 메모리 할당을 지원하는 부분만 가능하게 되어 있는 상황이라, rtti, exception까지 지원하고싶어지는 생각이 매우 강하더랍니다. 그래서 최근에 들어서 분석을 해보기 시작했습니다. 아직 완변하게 분석이 된 것은 아니지만 어찌어찌 가능할 것 같네요? 대략적으로 분석한 상황들을 포스팅 해보도록 하겠습니다.
2. Exception Layer
PlugIn OS 는 g++ 로 작성된 x64 기반의 OS 입니다. 그러므로 g++ 이라는 컴파일러와 필수 불가결하게 관련이 되어있지요. 이 g++ 컴파일러는 gcc 묶음에 포함되어 있는 C++ 컴파일러 입니다. 이 컴파일러에서 exception을 지원하기 위한 대략적인 소스 위치는 아래와 같이 구성이 되어있습니다.
- gcc-4.x-source/gcc-4.x/libstdc++-v3/libsupc++
- gcc-4.x-source/gcc-4.x/gcc
위 두 가지 경로 위치에서 g++ 컴파일러를 통하여 생성하는 코드를 지원하는 런타임 라이브러리 소스와 exception 런타임 부분을 위한 구조체들이 선언 되어 있는 부분을 알 수 있습니다. 그리고 g++ 에서 exception을 위해서는 아래와 같은 부분들이 필요하게 됩니다.
- try~catch 블럭은 컴파일러에서 __cxa_ 인터페이스의 런타임 라이브러리 호출 코드를 생성 해주며, 할당 및 해제 코드를 호출하여 준다.(1단계 레이어)
- __cxa_ 인터페이스 함수에 필요한 기능을 DWARF 문서와 LSDA(Language Specific Data Area)문서를보며 구현하도록 한다.(2단계 레이어)
- _Unwind_ 인터페이스 함수에 필요한 기능을 x64용 C++ ABI를 보고 구현하며, stack 에 대해서 unwinding 할 수 있는 기능을 구현하도록 한다.(3단계 레이어)
대략적으로 알아낸 부분은 위와 같습니다. 물론 libc 는 user library 인지라 thread 를 사용하는 상황도 존재할 것이며, 이를 위한 TLS(thread local storage) 기능을 사용하여 각각의 exception에 대한 처리 또한 지원을하긴 합니다. 이러한 부분은 제가 멀티 코어에 대응할 수 있도록 커널용으로 변경을 하여야 겠지요?
3. Document
으아아 이게 본질 입니다. 소스를 보면서 문서와 씨름을 하고 있지만, 여느 문서와 마찬가지로 100% 이렇게 자세하게 설명된 게 없는 듯 합니다. 여러가지 문서를 보면 여기저기 링크는 되어 있으나, 문서 버젼이 1.0도 되지 않아 불확실 한 면도 존재할 뿐더러, 아직 g++ 의 exception은 개발되고 있는 도중이라는 문장도 있더군요.
이게 제일 슬픕니다. ㅜ.ㅜ 그래도 시간이 최근에 꽤 많아진 편이라 곧 커널에 rtti와 exception 기능을 심을 수 있을 것으로 보입니다. 그나마 이게 다행이라고 해야 할지요? ㅎㅎ 계속된 포스팅이 지속이 되어봤으면 다시 한 번 결심해 봅니다. 작심삼일이 되지 않도록..
"Small Talk" 분류의 다른 글
| [64비트 멀티코어 OS 원리와 구조] 책을 받았습니다. (2) | 2011/07/11 |
| HD2 새로운 기기를 영입했습니다. (2) | 2011/03/31 |
| 최근 프로젝트로 진행하고 있던.. (2) | 2011/01/17 |
| 음 요새 아주 열코딩중입니다. (6) | 2010/07/29 |
| 오랫만에 글을 올리면서.. (1) | 2010/06/23 |

댓글을 달아 주세요