전체 글 251

컴퓨터시스템 기초 11. 레지스터와 스택 프레임은 함수 호출을 어떻게 드러낼까

[컴퓨터 시스템] 11. 레지스터와 스택 프레임은 함수 호출을 어떻게 드러낼까 10편에서 어셈블리를 번역본처럼 읽는 감각을 잡았다면, 이제 함수 호출이 실제로 어디에 흔적을 남기는지 볼 차례입니다. 함수는 고수준에서는 깔끔한 추상화지만, 저수준에서는 인자 전달, 반환 주소 저장, 지역 변수 공간 확보 같은 구체적 작업으로 드러납니다.이번 글은 함수 호출을 레지스터, 스택, 스택 프레임이라는 세 단어로 묶어 이해하는 데 초점을 둡니다. 먼저 짚고 갈 용어 stack frame: 한 번의 함수 호출을 위해 스택에 잡히는 작업 구역return address: 함수가 끝난 뒤 돌아갈 명령 위치calling convention: 인자 전달과 반환을 어떤 규칙으로 할지 ..

컴퓨터시스템 기초 10. 어셈블리는 왜 C와 하드웨어 사이의 번역본일까

[컴퓨터 시스템] 10. 어셈블리는 왜 C와 하드웨어 사이의 번역본일까 9편에서 CPU가 명령을 단계적으로 처리한다는 감각을 잡았다면, 이제 그 명령이 어떤 모습으로 보이는지 읽을 차례입니다. 어셈블리는 난해한 암호문처럼 느껴지지만, 사실은 C가 CPU 가까운 지시로 바뀐 결과를 비교적 사람 친화적으로 적어 놓은 형태에 가깝습니다.이번 글에서는 어셈블리를 독립 언어처럼 배우기보다, C 코드가 어떤 식으로 더 낮은 층위의 명령으로 번역되는지 보는 관점으로 정리합니다. 먼저 짚고 갈 용어 ISA: CPU가 이해할 수 있는 명령 집합의 규칙mnemonic: 기계 명령을 사람이 읽기 쉽게 적은 이름operand: 명령이 다루는 대상 값이나 위치 ..

컴퓨터시스템 기초 9. CPU는 명령을 어떤 단계로 실행할까

[컴퓨터 시스템] 9. CPU는 명령을 어떤 단계로 실행할까 8편에서 CPU를 회로들의 계층 구조로 봤다면, 이번에는 그 CPU가 실제로 명령을 어떻게 처리하는지 봐야 합니다. 프로그램 실행을 이해하려면 결국 CPU가 한 줄의 일을 어떤 단계로 쪼개 처리하는지 알아야 합니다.이번 글은 fetch-decode-execute 흐름을 중심으로 레지스터, 프로그램 카운터, 파이프라인의 필요성을 묶어 설명합니다. 뒤에서 어셈블리를 볼 때도 이 실행 흐름이 기준이 됩니다. 먼저 짚고 갈 용어 program counter: 다음에 읽을 명령의 위치를 가리키는 값register: CPU 안에서 매우 빠르게 쓰는 작은 저장 공간pipeline: 명령 처리 단계를 겹쳐 실행량을..

컴퓨터시스템 기초 8. 논리 게이트에서 CPU까지 어떤 연결이 생길까

[컴퓨터 시스템] 8. 논리 게이트에서 CPU까지 어떤 연결이 생길까 7편까지는 값을 어떻게 표현하는지에 집중했다면, 이제는 그 값을 실제 하드웨어가 어떻게 처리하기 시작하는지로 시선을 내릴 차례입니다. 논리 게이트는 너무 낮은 층위처럼 느껴질 수 있지만, 여기서부터 CPU의 큰 그림이 시작됩니다.이번 글은 게이트 이름을 외우는 데서 끝나지 않고, 게이트 -> 조합 회로 -> 상태를 가진 회로 -> CPU 구성 요소라는 연결을 한 흐름으로 잡는 데 초점을 둡니다. 먼저 짚고 갈 용어 logic gate: 0과 1 입력을 받아 새로운 0과 1 출력을 만드는 가장 작은 논리 블록combinational circuit: 현재 입력만으로 출력이 정해지는 회로seque..

컴퓨터시스템 기초 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까

[컴퓨터 시스템] 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까 6편에서 바이트 순서를 봤다면, 이제 값 자체를 표현하는 규칙 중에서도 가장 자주 헷갈리는 부동소수점으로 넘어갈 차례입니다. 정수는 표현 범위와 규칙이 비교적 단단해 보이지만, 실수는 유한한 비트 안에서 훨씬 더 많은 값을 다뤄야 해서 근사라는 생각이 필수로 들어옵니다.이번 글에서는 fixed-point와 floating-point를 비교하고, 왜 0.1 같은 값이 2진수에서 끝나지 않는지, 그리고 실수 비교에서 왜 '정확히 같다'가 위험해질 수 있는지까지 한 편에서 묶어 정리합니다. 먼저 짚고 갈 용어 fixed-point: 소수점 위치를 미리 고정해 두고 읽는 방식floating-poi..

컴퓨터시스템 기초 6. 바이트 순서는 왜 값을 다르게 보이게 만들까

[컴퓨터 시스템] 6. 바이트 순서는 왜 값을 다르게 보이게 만들까 5편에서 같은 비트열을 어떤 규칙으로 읽느냐가 중요하다는 감각을 잡았다면, 이제는 멀티바이트 값이 메모리에 어떤 순서로 놓이는지 봐야 합니다. 바로 여기서 엔디안이 등장합니다.엔디안은 비트가 뒤집히는 마법이 아니라, 여러 바이트로 이루어진 값을 메모리 주소 증가 방향에 어떻게 배치하느냐의 문제입니다. 이번 글은 그 과정을 실제 주소 흐름으로 따라가며 정리합니다. 먼저 짚고 갈 용어 byte: 대개 8비트 묶음으로 다루는 기본 저장 단위endianness: 멀티바이트 값을 메모리에 배치하는 바이트 순서 규칙network byte order: 네트워크에서 주로 big-endian을 기준으로 삼는 ..

컴퓨터시스템 기초 5. 데이터는 왜 결국 비트로 표현될까

[컴퓨터 시스템] 5. 데이터는 왜 결국 비트로 표현될까 3편에서 메모리 주소를, 4편에서 실행 상태를 봤다면 이제 그 메모리 안에 실제로 무엇이 들어 있는지 봐야 합니다. 사람이 정수와 문자와 색과 포인터를 서로 다른 종류의 값처럼 느껴도, 컴퓨터는 결국 비트열을 해석하는 방식으로 그것들을 다룹니다.이번 글은 비트 표현의 첫 관문입니다. 2진수와 16진수, signed와 unsigned, overflow를 따로따로 외우지 않고 '같은 비트열을 어떻게 읽느냐'라는 하나의 질문으로 묶어보겠습니다. 먼저 짚고 갈 용어 bit: 0 또는 1 한 칸으로 표현되는 가장 작은 정보 단위signed: 음수까지 포함해 해석하는 방식overflow: 표현 가능한 범위를 넘어가..

컴퓨터시스템 기초 4. 디버거는 실행을 보는 창이다

[컴퓨터 시스템] 4. 디버거는 실행을 보는 창이다 디버깅을 막연히 '에러를 잡는 감'으로 배우면 시간이 오래 걸립니다. 시스템 공부에서는 특히 프로그램이 지금 어느 상태에 있는지 직접 보는 태도가 중요하고, 그래서 디버거는 선택 도구가 아니라 학습 도구에 가깝습니다.이번 글에서는 GDB와 Valgrind를 기능 목록으로 소개하기보다, 어떤 질문에 답하게 해주는지 중심으로 정리합니다. 포인터와 메모리 감각이 아직 약하다면 3편을 먼저 보고 오는 편이 좋습니다. 먼저 짚고 갈 용어 breakpoint: 프로그램 실행을 특정 지점에서 멈추게 하는 표시backtrace: 현재 함수 호출이 어떤 경로로 쌓였는지 보여주는 정보segmentation fault: 허용되지..

컴퓨터시스템 기초 3. 포인터와 메모리를 같이 이해해야 하는 이유

[컴퓨터 시스템] 3. 포인터와 메모리를 같이 이해해야 하는 이유 포인터는 C를 어렵게 만드는 상징처럼 보이지만, 사실은 메모리 주소를 값처럼 다루는 규칙입니다. 그래서 포인터를 문법 퍼즐처럼 보면 막히고, 메모리 관점으로 보면 조금씩 풀립니다.이번 글에서는 포인터를 단독 개념으로 떼어놓지 않고 배열, 스코프, 수명, 스택, 힙과 함께 묶어서 봅니다. 포인터를 이해하는 순간부터 C는 문법 과목이 아니라 메모리 모델 과목처럼 읽히기 시작합니다. 먼저 짚고 갈 용어 scope: 이름을 코드 어디에서 사용할 수 있는지에 대한 범위lifetime: 그 데이터가 메모리에서 실제로 언제까지 살아 있는지pointer: 다른 데이터의 주소를 담는 값 ..

컴퓨터시스템 기초 2. C는 왜 시스템의 입구가 되는가

[컴퓨터 시스템] 2. C는 왜 시스템의 입구가 되는가 시스템 공부를 시작할 때 왜 하필 C부터 보느냐는 질문이 자주 나옵니다. 이미 Python이나 JavaScript에 익숙하다면 더 불편한 언어처럼 느껴질 수도 있습니다.하지만 C는 프로그램이 실행 파일로 바뀌고, 메모리와 가까운 규칙을 드러내며, 하드웨어와 운영체제 사이의 연결을 보이기 쉬운 언어입니다. 그래서 이번 글에서는 문법 암기보다 C가 시스템의 입구가 되는 이유와 컴파일-링크-실행 흐름을 중심으로 정리합니다. 먼저 짚고 갈 용어 compiler: 소스 코드를 기계가 다루기 쉬운 형태로 바꾸는 도구linker: 여러 번역 결과와 라이브러리를 이어 최종 실행 파일로 묶는 단계executable: 실제..