반응형

1.1 정보는 비트와 컨텍스트로 이루어진다.
개발자가 작성한 소스 프로그램은 텍스트 파일의 아스키 문자로 변환되고, 아스키 문자는 비트값이므로 비트로 저장이 된다. 같은 비트열도 컨텍스트에 따라 다른 의미로 구분된다.
- 컨텍스트 : 해석 방식
- 기계어는 가변 길이라서 바이트 스트림 자체에 경계 표시가 없다.
- 그래서 어디서 시작하는지 아는것이 중요한데, 프로그램 카운터가 그 역할을 한다.
- 이것을 이해하는게 중요한 이유는 스택 오버플로우/ 버퍼 오버플로우 같은 보안 취약점이 실행 흐름을 강제로 다른 곳으로 이동시키는 방식으로 작동하기 때문이다.
1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.
개발자가 작성한 고급 C 프로그램은 시스템에서 실행시키려면, 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역되어야 한다. 기계어로 바꾼 결과물을 “목적 프로그램” 또는 “목적 파일” 이라고 부른다. 인스트럭션들은 실행가능 목적 프로그램 형태로 합쳐져, 바이너리 디스크 파일로 저장된다. 유닉스 시스템에서 컴파일러 드라이버는 소스파일을 오브젝트 파일로 번역한다.
번역은 4단계에 걸쳐서 실행된다.

- 전처리기
- 전처리기는 #문자로 시작하는 디렉티브에 따라 수정한다.
- .i 로 끝나는 새로운 C 프로그램 생성
- 컴파일러
- .i 파일을 .s 파일로 번역한다.
- .s 파일에는 어셈블리어 프로그램이 저장된다. 이 프로그램은 main 함수 정의를 포함한다.
- 문법 분석 (파싱)
- 변수를 레지스터/ 메모리에 어떻게 배치할지 결정
- for, if 같은 제어 흐름을 점프 명령어로 변환
- 최적화 (불필요 연산 제거, 반복문 최적화)
- 번역가 (사람의 언어 → 기계어)
- 어셈블러
- 어셈블러(as) 가 .s 파일을 기계어 인스트럭션으로 번역하고, 재배치가능 목적프로그램의 형태로 묶어서 .o 목적 파일에 결과를 저장한다.
- 재배치 가능 목적 파일
- 아직 다른 모듈과 안 합쳐진, 주소가 비어있는 부품
- 재배치 가능 목적 파일
- .o 파일은 main 함수의 인스트럭션들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일이다.
- 각 어셈블리 명령어를 대응하는 실제 바이트 코드로 변환
- 어셈블러(as) 가 .s 파일을 기계어 인스트럭션으로 번역하고, 재배치가능 목적프로그램의 형태로 묶어서 .o 목적 파일에 결과를 저장한다.
- 링크
- 만들어진 프로그램이 표준 라이브러리에서 함수를 호출하는 경우, 별도의 함수 목적 파일과 결합해야 한다. 링커 프로그램 (ld) 이 통합 작업을 수행한다.
- 그 결과, 실행가능 목적파일 (실행파일) 로 메모리에 적재되어 시스템에 의해 실행된다.
- 실행가능 목적 파일
- 여러 부품을 링커가 합치고 심볼 해석
- 재배치까지 마쳐서 주소가 다 채워진 완제품
- 실행가능 목적 파일
1.3 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다
개발자들은 컴파일 시스템의 동작을 이해해야 한다.
- 프로그램 성능 최적화하기
- 최신 컴파일러들은 복잡한 도구로 우수한 코드를 생성하여, 컴파일러의 내부 동작을 알 필요는 없다..
- 하지만 C 프로그램 작성 시 올바른 판단을 하기 위해서는 기계어 수준 코드에 대한 기본적인 이해를 할 필요가 있다.
- 링크 에러 이해하기
- 컴파일 실행 중 발생하는 문제를 이해하여야한다.
- 문법은 맞지만 선언된 함수나 변수의 실제 정의를 찾지 못했거나 서로 연결하지 못할 때 발생한다.
- 보안약점 피하기
- 안전한 프로그래밍은 프로그램 스택에 데이터와 제어 정보가 저장되는 방식 때문에 생겨나는 영향을 이해하는 것이다.
1.4 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.

- 버스
- 시스템 내를 관통하는 전기적 배선군으로, 컴포넌트들 간 바이트 정보들을 전송한다.
- 일반적으로 워드라고 하는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계된다.
- 시스템마다 다른 워드 길이를 가지고 있다.
- 입출력 장치
- 시스템과 외부세계와의 연결을 담당한다.
- 입력용 키보드와 마우스, 출력용 디스플레이 등의 장치가 입출력 버스와 컨트롤러나 어댑터를 통해 연결된다.
- 메인 메모리
- 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치이다.
- 물리적으로 메인 메모리는 DRAM 칩들로 구성되어 있다.
- 논리적으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스) 를 가지고 있다.
- 프로세서
- 주처리장치 (CPU), 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행)하는 엔진이다.
- 읽어오기 : 프로세서는 PC가 가리키는 메모리로부터 인스트럭션을 읽어오고
- 해석과 실행 : 인스트럭션에서 비트들을 해석하여, 인스트럭션이 지정하는 간단한 동작을 실행하고
- 업데이트 : PC를 다음 인스트럭션 위치로 업데이트 한다.
인스트럭션 요청에 의해 CPU가 실행하는 단순한 작업의 예
- 적재 Load
- 메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사
- 메인 메모리 → 레지스터
- 저장 Store
- 레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사
- 레지스터 → 메인 메모리
- 작업 Operate
- 두 레지스터 값을 ALU로 복사하고, 두 개의 워드로 수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장한다.
- 점프Jump
- 인스트럭션 자신으로부터 한 개의 워드를 추출하고, 이것을 PC 에 덮어쓰기 방식으로 복사한다.
반응형