오진이 블로그

[제프리 리처의 CLR via C#] 어셈블리 코드 실행하기 본문

Development/C#

[제프리 리처의 CLR via C#] 어셈블리 코드 실행하기

오늘도 진이 2021. 2. 8. 16:49

1장. CLR의 실행 모델

어셈블리 코드 실행하기

  • 어셈블리는 메타데이터와 IL을 같이 포함
  • IL
    • CPU에 독립적인 기계어 코드로 Microsoft가 외부의 몇몇 상용 및 학술용 언어/컴파일러 제작자들과 상의하에 만든 것이다.
    • 대다수의 CPU 기계어보다 더욱 고차원의 언어다.
    • 객체의 타입을 다루며, 객체를 생성하고 초기화하거나, 객체의 가상 메서드를 호출하거나, 배열 요소들을 직접 관리하는 명령어들(Instructions)을 가지고 있다.
    • 예외처리를 위한 Throw와 Catch에 대한 명령어도 가지고 있다.
    • 객체 지향형 기계 언어(Object Oriented Machine Language)로 볼 수도 있다.
  • 마이크로소프트는 ILASM.EXE라는 IL 어셈벌러를 제공한다.
  • 마이크로소프트는 또한 ILDASM.EXE라는 IL 역어셈블러(Disassembler)도 제공한다.
  • 거의 모든 고급 언어들은 CLR이 제공하는 기능 중의 일부만을 포장해서 제공한다.
  • IL 어셈블리 언어는 개발자들에게 CLR의 모든 기능들을 다룰 수 있게 해준다.
  • 메서드를 실행하기 위하여, IL은 네이티브 CPU 명령어로 변환된다. 이 작업은 CLR의 JIT(Just-in-time) 컴파일러에 의하여 실행된다.
  • 성능 저하(Performance Hit)는 메서드가 최초로 호출될 때에만 발생한다. 그 이후 발생하는 모든 후속 메서드 호출들은 네이티브 코드로서 빠른 속도로 실행되는데, 네이티브 코드에 대해서는 다시 내용을 검사하거나 컴파일해야 할 필요가 없기 떄문이다.
  • JIT 컴파일러는 네이티브 CPU 명령어를 동적 메모리상에 저장한다. 이 내용은 컴파일된 코드가 응용프로그램이 종료되는 시점에 자동으로 소거된다.
  • PDB 파일은 디버거가 지역 변수를 찾을 수 있게 해주거나, 소스 코드와 IL 사이를 연결하는 데 도움을 준다.
  • IL과 검증
    • IL은 스택 기반의 언어로, 모든 IL 명령어들과 오퍼랜드가 실행 스택 위에 쌓이고(Push), 결과를 스택으로부터 꺼내어가는(Pop) 방식으로 실행된다.
    • IL 명령은 또한 타입 종류에 무관하다.
    • IL이 제공하는 진정한 장점은 응용프로그램의 견고함과 보안을 이루게 해준다는 것이다.
  • 안전하지 않은 코드
    • 안전하지 않은 코드를 이용하여 직접 메모리 주소를 제어할 수 있으며, 특정한 주소에 데이터를 쓸 수도 있다.
    • 안전하지 않은 코드는 데이터 구조를 훼손할 수 있고, 시스템을 공격하거나, 보안 취약점을 만드는 데 이용할 수 있다.
    • C# 컴파일러는 안전하지 않은 코드를 포함하는 메서드 선언에 반드시 unsafe 키워드를 추가하도록 강제하고 있다.

Uploaded by Notion2Tistory v1.1.0

Comments