컴퓨터 시스템 (1)

gaon·2022년 2월 21일
0

컴퓨터시스템

목록 보기
1/2

1.1 정보는 비트와 컨텍스트로 이루어진다

hello 프로그램은 프로그래머가 에디터로 작성한 소스 프로그램(소스파일)으로 생명을 시작하고 hello.c라는 텍스트 파일로 저장된다.
소스 프로그램은 0 또는 1로 표시되는 비트의 연속이며 바이트라는 8비트 단위로 구성된다. 각 바이트는 프로그램의 텍스트 문자를 나타낸다.

hello.c처럼 아스키 문자들로만 이루어진 파일들을 텍스트 파일이라고 하며 다른 파일들은 바이너리 파일이라고 한다.

1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다

hello.c를 실행하려면 각 문장을 다른 프로그램에 의해 저급 기계어 인스트럭션으로 번역되어야 한다. 이를 목적 파일(object file)이라고 한다.
gcc 컴파일러 드라이버는 hello.c를 실행파일인 hello로 번역한다. 4개의 단계(전처리기, 컴파일러, 어셈블러, 링커)를 거치는데 이를 합쳐 컴파일 시스템이라고 부른다.

  • 전처리 단계: 전처리기는 #문자로 시작하는 디렉티브에 따라 수정한다. 예를 들어 #include<stdio.h>는 전처리기에게 헤더파일인 stdio.h를 프로그램 문장에 직접 삽입하라고 지시한다. 그 결과 .i로 끝나는 새로운 C 프로그램이 생성된다.

  • 컴파일 단계: 컴파일러는 텍스트파일 hello.i를 텍스트파일인 hello.s로 번역하며 이 파일에는 어셈블리어 파일이 저장된다.

  • 어셈블리 단계: 어셈블러가 hello.s를 기계어 인스트럭션으로 번역하고 이들을 재배치가능 목적프로그램의 형태로 묶어서 hello.o라는 목적파일에 그 결과를 저장한다. 이 파일은 main 함수의 인스트럭션들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일이다.

  • 링크 단계: printf 함수는 이미 컴파일된 별도의 printf.o에 들어있고 이 파일은 hello.o와 어떤 형태로든 결합되어야 한다. 링커 프로그램이 이 통합과정을 수행한다.
    그 결과 hello 파일은 실행가능 목적파일로 메모리에 적재되어 시스템에 의해 실행된다.

1.3 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다

  • 프로그램 성능 최적화하기: 최신 컴파일러들은 복잡한 도구로 우수한 코드를 생성한다. 효율적인 코드를 작성하기 위해 컴파일러 내부 동작을 알 필요는 없다. 다만 컴파일러가 어떻게 기계어 코드로 번역하는지 알 필요는 있다.

  • 링크 에러 이해하기

  • 보안 약점 피하기

1.4 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다

hello.c 소스 프로그램은 컴파일러에 의해 hello라는 목적파일(object file)로 변환된다. 이를 실행하기 위해서는 쉘에 그 이름을 입력하는데 명령어 라인이 쉘의 내장 명령어가 아니라면 쉘을 실행파일의 이름으로 판단하고 그 파일을 실행한다.

시스템 하드웨어의 조직

  • 버스
    시스템 내를 관통하는 전기적 배선군을 버스라고 한다.
    컴포넌트 간의 바이트 정보를 전송한다. 버스는 워드(word)라는 고정 크기의 바이트 단위로 데이터를 전송하는데 보통 4바이트나 8바이트의 크기를 갖는다.
  • 입출력 장치
    외부와의 연결을 담당한다. 키보드, 마우스, 디스플레이 디스크 드라이브 등이 있다.
    각 입출력 장치는 입출력 버스와 컨트롤러, 어댑터를 통해 연결된다.
  • 메인 메모리
    프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치다.
    물리적으로는 DRAM칩들로 구성된다.
    논리적으로는 연속적인 바이트 배열로 0부터 시작하여 고유의 주소를 갖는다.
  • 프로세서
    주기억장치(cpu)는 메인 메모리에 저장된 인스트럭션들을 해독하는 엔진이다. 프로세서의 중심에는 워드 크기의 저장장치(레지스터)인 프로그램 카운터(PC)가 있다.
    프로세서는 PC가 가르키는 메모리로부터 인스트럭션을 읽어오고 해석하여 인스트럭션이 지정하는 동작을 한다. 그리고 PC를 다음 인스트럭션 주소로 업데이트한다.

0개의 댓글