Jungle

[TIL][Krafton Jungle] 1주차 - (2) : 컴퓨터 시스템

손가든 2023. 10. 15. 18:30

본격적으로 CS 공부를 시작했으며, 컴퓨터 시스템 책을 읽으면서 이해 안되서 검색을 활용한 경우나 여러 번 되새겨 생각하게 한 부분을 기록하겠다.

 

 


1.4까지의 기본 구성

일단 단원에 들어가기 전에 이 컴퓨터 시스템을 배워야 하는 이유에 대해서 적혀있었다.

 

1. 프로그래머로서는 효율적인 개발과 성능을 파악한 설계가 필요한데 이를 위해 내가 짠 코드가 컴퓨터 내부에서 어떻게 돌아가는지 파악하는 것이 중요한 것이다.

 

2. 그리고 링크 에러를 이해하는 것은 상당히 괴로운 숙제라고 적혀있었는데, 링크를 하는 과정에 무엇이 일어나는지 , 링커가 왜 필요한지에 대해서도 이번 단원에서 배울 수 있었다.

 

3. 또한 시스템의 내부적 동작을 이용한 보안요소도 개발자로서 꼭 유념해야 할 요소이기도 했다.

 

 

아무튼 대충 이런식이고 내용을 살펴보니

전자공학과에서 배운 <컴퓨터 구조> 과목이 이해하는데 큰 도움이 됬다.

전체적으로 helloworld.c 로 된 출력 파일을 실행시켰을 때 컴퓨터 내부에서 일어나는 일련의 동작들을 간단히 들여다봤다.

 

hello.c -(전처리기)-> hello.i -(컴파일러)-> hello.s -(어셈블러)-> hello.o -(링커)-> hello 실행

 

 

어셈블리어와 컴파일러의 개념, 고급어가 기계어로 번역된 후 실행된다는 그 개괄적인 개요는 알고 있었지만

 

링커와 그 안의 각 파일들의 구성요소들은 처음 알게되었다.

 

전처리기는 C 언어의 #으로 시작되는 명령어들을 프로그램에게 행동하라고 지시한다.

예를 들어 #include<stdio.h>는 헤더파일 stdio.h를 프로그램 문장에 직접 삽입하라고 명령하는 문장이다.

전처리기는 이를 입력받아 행동하는 과정을 실행한다.

 

컴파일 단계에서는 전처리가 끝난 파일을 어셈블리어로 변환한다.

 

어셈블러는 어셈블리어를 해독하여 기계어 인스트럭션으로 번역하고 목적 프로그램의 형태로 묶어 목적파일에 저장한다.

** 이때 이 목적파일은 (기계어 인스트럭션 집합) + (메인 함수를 인코딩 하기 위한 17바이트 데이터) 로 구성된다.

 

링크 단계에서는 표준 라이브러리와 같은 외부 단계의 함수(예를들면 printf) 를 호출하기 위해 별도로 존재하는 목적 파일들과 결합시킨다.

 

이 모든 일련의 결과 끝에 printf("hello, world!"); 는

화면에 1줄의 문구를 띄워주는 것이다.



 

 

이후 하드웨어의 구성요소들과 연결 구조를 간단히 살펴보는 절을 읽었다.

 

버스(Buses)는 하드웨어의 각 구성요소에게 명령을 전달하거나 전달받는 통로이다.

 

프로세서(CPU)의 구성요소는 컴퓨터 구조 강의 때 배웠던 거라 이해하기 어려운 부분에 예전 기억이 많이 도움이 됬다.

이후 CPU의 동작 과정을 세부적으로 살펴 볼 때, 예전 자료들을 활용하면 좋을 것 같다.