본문 바로가기

.NET/CLR

PE file and Application domains

우리가 일반저으로 실행하는 exe, sys, dll등의 파일들이 PEfile 파일들이라고 보면된다.

윈도우즈 로더는 PE파일을 보고 헤더에 있는 entry point 필드를 보고 그 주소를 읽어

해당 주소로 점프해 그 함수를 호출하게 된다. 닷넷의 모든 컴파일드된 파일은 이러한 entry point주소가 있고

reference해야하는 dll의 주소도 가지고 있다. 나는 닷넷의 경우만 예를 들겠다.

윈도우즈 로더는 entry point의 주소를 찾아 호출하게 되는데 과연 이 entry points는 어떤 dll의 어떤 함수일까?

자도 잘모르지만 한번 적어본다. 정확한 dll의 이름은 생각나지 않지만 mscoree.dll인가? 이런 비스무르한 dll의 entry point 를 호출하게 된다 .실제적인 메서드의 이름은 기억이 잘 나지 않지만 뭐뭐뭐Main이다 .

이 메인을 호출하게
 
되면 이 호출된 함수에서 CLR를 로드하고 이니셜라이즈 하게 된다. 그럼 clr이 4.0까지 나왔는데

어떤걸 호출해야 될지 어떻게 판단하게 될까 그건 PE 파일에 DataDirectory라는 섹션이 있어서 거기에 실제적으로 clr의 경로와 버전 정보 등등이 있어 그걸 보고 어떤 clr을 띄워야 할지 결정하게 된다.

이렇게 띄워진 clr에는 application domain에 세개각 생성이 되게 되는다 . system application , shared application, default domain application 각각의 역할은 이름에 맞는 역할을 하게 된다.

간단하게 설명을 하자면 맨처음 clr은 system applicaiton을 생성하고 system application은 다른 두가지의 도메인을 생성하게 된다.  그럼 각자의 역할을 한번 보겠다.


1. system application  domain
나마저 2개의 shared, default 도메인을 생성한다.
mscorlib.dll을 shared application domain이 로드할수 있게 해준다.
프로세스안에 있는 다른 어플리케이션 도메인의 부기작업을 담당하며 다른 어플리케이션을 로드및 언로드 시키는 기능도 한다.
2. shared application domain
mscorlib.dll을 로드한다.
기본 타입들을 로드하낟.(int.string, array등등)
기본적으로 공유할수 있는 닷넷 프레임워크 GAC영역에 있는놈들이라 생각하자.
3.default application domain
일반적으로 우리가 만든 타입들은 여기서 생성된다.
이렇게 해서 3가지의 applicatio domain을 살펴보았다 그럼 왜 하나의 프로세스 안에서 이런놈들을
관리할까? 그답은 비용때문이라고 어떤 고수가 답을 달아놨다.

더이상 아는 지식이 없어 깊이 못들어 가겠다.
ㅋㅋ 그냥 나도 공부하면서 막쓴 것이다.