Fundamental of CS/: : CSAPP

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (1) 역사적 관점

Jay.P Morgan 2024. 3. 19. 23:20

Ⅲ. 프로그램의 기계수준 표현

 

  3.0  Intro

 

  GNU GCC C 컴파일러는 어셈블리 코드의 형태로 출력을 만들어 프로그램의 인스트럭션을 만들어낸다.

대개의 경우 고급 언어가 제공하는 추상화를 사용하는 것이 보다 생산적이고 안정적이다. 반면에 어셈블리 코드는컴퓨터 기계에 매우 의존적이기 때문에(회사마다 쓰는 어셈블리 셋이 약간씩 다르다) 컴퓨터 기계에 매우 의존적이라 있다. 특히 기계어 자체도 CPU 채택하는 ISA(명령어셋) 따라 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없다.

 

그렇다면 어셈블리 코드를 좋을까?

     1.  컴파일러의 최적화 성능 알수있다.

     2.  코드에 내재된 비효율성을 분석 가능하다.

     3.  시스템의 취약성 어떻게 발생하고, 프로그램을 공격하는 방식을 막아내는 방법을 이해하는데 필요하다.

추가적으로, CPU 비트수가 커지면 커질수록 장착이 가능한 RAM 사용폭이 커진다. 과거에는 32비트 컴퓨어테서는 최대 4G 램을 사용 가능했지만, 64비트에서는 훨씬 이상까지도 사용이 가능해졌다.

이장의 내용들은 x86-64 기초하고 있다. (기본적으로 x86 32bit 기반인데, x86-64 64비트 확장구현이 추가된 버전이라 생각하면 된다.)

 

  3.1  역사적 관점

 

  다음의 표는 인텔 프로세서 모델들과, 특히 기계수준 프로그래밍에 영향을 주는 주요 특징들을보여준다. 이들이 복잡도적인 측면에서 어떻게 변천하였는지를 보여주기 위해 프로세서 구현에 소요된 트랜지스터의 수를 사용하였다. 

 

  트랜지스터 수를 살펴보면, 급속도로 트랜지스터의 수가 증가하는 것을 있다.

이는 무어의법칙이라는, 트랜지스터의 수가 매년 37% 증가하고 26개월마다 트랜지스터의 수가 2배가 된다는 법칙을 보여주고 있다.

  8086이라는 마이크로프로세서는 흔히 우리가 x86이라고 부르는 후속작들의 시발점이다. x86이라는 인텔 프로세서 계열들은 최초에는 단일칩 16비트 마이크로프로세서로부터 출발하였다. 지금 x86이라고 하면 흔히 32bit라고 생각하면 좋다

 

  각각의 인접한 프로세서는 이전 버전과 호환성을 갖게 설계되었다. 인텔은 자신의 프로세서 제품라인에 별도의 이름을 붙여왔는데, IA32는 "Intel Architecture 32bit", Intel 64는 IA32의 64비트 확장형이란 뜻이며, x86-64라고도 부른다.

  비록 x86-64 프로그램에서 x86의 진화 흔적들을 볼 수 있지만, 대부분의 희한한 x86의 특징들은 나타나지 않는다.