brunch

You can make anything
by writing

C.S.Lewis

by 타이킴 Apr 17. 2023

컴퓨터 아키텍처의 이해

현실적으로 컴퓨터의 구조를 이해하는 방법

컴퓨터 아키텍처(Computer Architecture)를 우리말로 번역하려면, 아키텍처는 구조라는 말로, 컴퓨터는 전자계산기를 줄인 전산기라는 말로 번역하면 되겠다. 즉 전산기 구조가 된다. 예전에 내가 학교를 다닐 때는 전산학과라는 말을 많이 썼는데 요새는 그냥 외래어를 그 자체로 더 자주 쓰는 것 같다.


컴퓨터 과학 (Computer Science)은 컴퓨터 자체의 구조와 설계를 다루는 좀 더 이론적인 분야이고, 컴퓨터 공학 (Computer Engineering)은 컴퓨터의 구현과 보다 효과적인 사용에 초점을 맞추지 않을까라고 생각하는데, 그쪽 전공이 아니라서 확실치는 않고, 사실 그렇게 크게 중요하고 생각하지도 않는다. 합쳐서 CSE (Computer Science & Engineering)이라고 하기도 한다.


컴퓨터 구조라고 하는 분야는 우리가 일상생활에서 끊임없이 마주치고 편리하게 사용하고 있는 각종 컴퓨터가 어떤 방식으로 설계되고 만들어지고 동작하는지를 연구한다. 전 세계에서 가장 유명한 CPU (Centeral Processing Unit: 중앙 처리 장치) 회사인 인텔같은 회사에서 다음 세대의 PC용 혹은 서버용 칩을 설계할 때 필요한 내용이다. CPU의 명령어를 어떻게 설계하고, 캐시(Cache)를 비롯한 다양한 장치들을 어떻게 구성해야 보다 빠른 소프트웨어의 실행이 가능한지를 고민하는 것이다. 


인텔이나 엔비디아, 퀄컴 혹은 삼성같이 직접 반도체를 설계하는 회사에서 일할 때만 필요한 내용은 아니다. 제대로 된 소프트웨어 엔지니어로서 다양한 분야에서 일을 하거나, 혹은 어떤 특정 분야에서 깊이 있게 일을 할 때도 꼭 알아야 하는 분야라고 생각한다. 단순히 정해진 코딩만 하는 개발자가 아니고 보다 깊이 있게 소프트웨어를 설계하고 만들 때에 매우 중요하다.


아주 오래전 학생시절에 8비트 마이컴(마이크로 컴퓨터? 마이크로 컨트롤러?)을 가지고 간단한 로봇 (라인 트레이서 혹은 마이크로 마우스)를 만들면서 즐겁게 공부를 했던 기억이 난다. 그때 컴퓨터 아키텍처를 배우겠다는 거창한 생각을 갖고 그런 프로젝트를 한 것이 아니었다. 학교에서 관심 있는 동아리에 들어갔고, 그 동아리에서 마이컴을 이용한 재미난 것들을 많이 만들었을 뿐이다.


당시에 유행하던 마이컴들은 인텔의 8051/8031 시리즈, 모토로라의 68HC11, 자이로그의 Z80등의 8비트 컴퓨터였는데, 직접 보드에 크리스털과 메모리 그리고 디지털과 아날로그 입출력 장치를 납땜해 가면서 자연스럽게 컴퓨터 구조에 대한 지식을 몸으로 습득했다. 컴퓨터 아키텍처 교과서의 가장 처음에 나오는 폰 노이만 (Von Neumann)과 하바드 (Harvard) 아키텍처는 좀 헷갈려도 괜찮지만, 마이컴 칩에서 명령어 갖고 올 때와 데이터 갖고 올 때 다른 시그널이 나오는 것을 알아야 메모리를 제대로 연결하고 소프트웨어를 정상적으로 동작시킬 수 있었다.


C 언어로 프로그램을 짜는 것도 가능했지만, 워낙 메모리가 작고 CPU가 느려서, 내가 원하는 기능을 제한된 공간에 집어넣고 원하는 속도가 나오게 하기 위해서는 직접 어셈블리어로 프로그래밍을 하는 경우도 많았다. 워낙 CPU의 명령어 숫자가 그리 많지 않고 간단한 구조라서 기계어로 직접 프로그램을 짜는 것이 좀 불편하긴 했지만 충분히 가능했고, 그렇게 하려면 CPU의 레지스터와 메모리가 각 사이클에 어떻게 동작하는지 아주 잘 이해해야 했기에 저절로 CPU의 구조에 대한 공부가 되었다.


궁금해서 좀 찾아봤더니 아직도 8비트 마이크로 컨트롤러가 활발하게 나온다고 해서 반가웠다. 예전처럼 직접 보드에 부품을 납땜으로 조립할 필요도 없이, 온라인으로 주문만 하면 이미 잘 조립된 보드가 편리한 소프트웨어 개발 환경에, 인터넷에 한 줄만 검색하면 주르르 나오는 정보들과 함께 제공되는 것 같다.


이렇게 편리한 환경에서 공부를 하게 되면 장점만 있는 것은 아니다. 별로 도움이 되지는 않지만 어쩔 수 없이 해야 하는 잡다구리 한 일들이 확 줄어서 효율적인 공부를 할 수 있다는 것은 분명히 매우 편리하다. 반면에 온갖 시행착오를 거쳐가면서 한 땀 한 땀 내가 직접 그 과정을 겪어서 얻은 지식이 아니고, 온라인으로 주문해서, 보드 받고, 개발 도구를 인터넷에서 구해서, 30분 만에 프로그램이 돌아가게 되므로, 오히려 그 과정에서 배우는 것이 적을 수도 있다.


그 편리한 과정은 충분히 누리되, 그 과정에서 제공되는 기술들을 당연하다고 생각하지 말고 하나하나 좀 더 근본적인 원리를 이해하려고 노력을 해야 할 필요가 있다. 소프트웨어 개발자가 목표라고 하더라도, 그리고 하드웨어가 이미 다 조립이 되어서 오거나 혹은 심지어 마이컴 칩 안에 모두 내장이 되어있다고 하더라도, 블록 다이어그램을 보면서 하나하나 동작 원리를 이해하려고 하는 노력이 필요하다.


좀 일부러 스스로를 불편하게 만들려는 노력을 하면 그만큼 더 많이 배울 수 있다. 이미 잘 동작하는 하드웨어를 망가뜨릴 필요는 없지만, 이미 잘 동작하는 소프트웨어는 마음껏 망가뜨려보는 것이 좋다. 하드웨어는 복구가 어렵지만, 소프트웨어는 언제든 다시 만들 수 있다.


소프트웨어 엔지니어로서, 하드웨어 보드에 전원을 넣었을 때 어떻게 CPU가 깨어나서 동작하는지가 궁금하면, 내가 구입한 보드의 부트로더 (Boot loader) 즉, 전원이 인가되고 가장 처음에 실행되는 프로그램부터 시작하면 된다. 그 부드로더를 지워버리면 보드가 먹통이 될 것이다. 거기서부터 시작하는 것이다.


물론 시중에 제품으로 파는 보드에, 정말로 가장 원천적인 부트로더가 날아가서 다시 복구가 되지 않는 상황까지 가도록 두지는 않을 것이니, 매뉴얼을 잘 읽어보고, 어느 부분의 코드가 사용자가 만질 수 있는 부팅 코드인지를 보고, 그 부분을 스스로 직접 만들어보는 것이다.


그 스타트업 코드를 어셈블러 혹은 C언어로 짜려고 하면, 내가 만드는 소프트웨어를 어떻게 메모리의 특정 주소에 들어가게 할 수 있는지, 그 과정에서 어셈블러와 컴파일러 그리고 링커의 역할이 무엇인지, CPU가 리셋이 되면 어떤 일이 벌어지고, 어떻게 해서 내가 만든 프로그램이 실행되는지, 내가 코드에서 사용한 변수가 실제 메모리의 어떤 부분에 저장되는지 등 참으로 많은 것을 배우게 될 것이다.


혹시 다짜고짜 부트로더부터 날리고 시작하는 것이 부담스럽다면 또 다른 재미난 방법이 있다. 일단 개발 환경을 갖추어놓고, 모든 프로그래머에게 가장 친숙한 “Hello, World!” 프로그램을 하나 짠다. 그리고 제공된 문서의 방법을 따라서 그 프로그램이 정상적으로 실행되는 것을 먼저 확인한다. 


그다음에, 내가 만든 그 한 줄짜리 printf(“Hello, World!\n”);라는 프로그램이 어떻게 컴파일러에 의해서 어셈블러 파일로 변환이 되었는지를 찾아본다. 이 부분은 혹시 문서가 잘 되어있지 않다면 좀 검색을 통해서 찾아볼 필요가 있을 텐데, 그 과정 자체도 컴파일러가 어떻게 소스코드를 변환해서 실행 파일을 만드는지에 대한 것을 공부하는 것이니 도움이 될 것이다.


그렇게 해서 어셈블러 코드를 찾았다면, 그 어셈블러 코드의 첫 줄부터 제일 마지막 줄까지 이해를 하려고 노력한다. 시간이 좀 걸리더라도, 단 한 줄도 건너뛰지 않고 모두 이해를 하는 것이 중요하다. 혹시 중간에 C 라이브러리의 함수 호출이 되면, 그 함수까지 따라서 들어가야 한다.


만약에 이 과정을 성공적으로 마치게 되면, 내가 만든 프로그램에 들어있는 “Hello, World!\n”라는 문자열이 어떻게 메모리에 저장이 되고, 이것이 어떻게 CPU로 불려 들어와서, 어떻게 직렬 통신 장치의 버퍼로 전달이 되고, 이것이 어떻게 CPU 외부의 전기 신호로 변환이 되어서, 어떻게 내 PC의 터미널 프로그램에 내가 보이는 형태의 문자로 표시가 되는지를 이해하게 될 것이다.


지금 우리가 흔히 CPU라고 알고 있는 인텔의 제품이나 엔비디아, 퀄컴 등에서 나오는 하드웨어는 최소 32비트 이상의 구조에 심지어 멀티코어라고 해서 여러 개의 CPU가 함께 들어가 있고, 실행 속도를 높이기 위한 매우 다양한 기술이 들어가 있다. 이렇게 복잡한 CPU에서 돌아가는 소프트웨어를 만들어내기 위해서, 우리가 만든 소스코드를 CPU에서 실행되는 기계어로 바꾸어주는 컴파일러의 기술도 발전을 거듭해서, 이제 사람이 손으로 짜는 어셈블러로 프로그램을 만들 수는 없는 세상이 되었다.


하지만 8비트 컴퓨터는 워낙 간단한 구조라서 여전히 그 동작 과정을 사람이 일일이 분석하는 것이 가능하고 그 과정에서, 책에서 배우는 것보다 훨씬 생생한 컴퓨터 아키텍처의 공부가 될 것이라고 생각한다.  


매거진의 이전글 컴퓨터와 소프트웨어
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari