다음 글의 일부입니다: Putting the “You” in CPU: 컴퓨터가 프로그램을 실행하는 방식이라는 토끼굴로 깊이 빠져드는 여정입니다.
7장: 에필로그 GitHub에서 편집하기
축하합니다! 이제 우리는 CPU 속에 “여러분”을 확실히 새겨 넣었습니다. 즐거운 시간이 되셨기를 바랍니다.
여러분이 방금 얻은 모든 지식이 실재하며 지금도 실제로 작동하고 있다는 점을 다시 한번 강조하며 여러분을 떠나보내겠습니다. 다음에 컴퓨터가 어떻게 여러 앱을 동시에 실행하고 있는지 생각하게 된다면, 타이머 칩과 하드웨어 인터럽트를 떠올리시기 바랍니다. 어떤 멋진 프로그래밍 언어로 프로그램을 작성하다가 링커 오류를 만나면, 그 링커가 무엇을 하려는 것인지 생각해 보시기 바랍니다.
이 글에 담긴 내용에 대해 질문(또는 정정할 사항)이 있으시면 lexi@hackclub.com으로 이메일을 보내시거나 GitHub에 이슈나 PR을 올려 주십시오.

… 하지만 잠깐, 아직 더 있습니다!
보너스: C 개념 번역하기
직접 저수준 프로그래밍을 해 보셨다면 아마 스택과 힙이 무엇인지 알고 계실 것이고, malloc도 사용해 보셨을 것입니다. 하지만 그것들이 어떻게 구현되어 있는지는 깊이 생각해 보지 않으셨을 수도 있습니다!
먼저, 스레드의 스택은 가상 메모리의 높은 주소 어딘가에 매핑된 고정 크기의 메모리입니다. 대부분의(전부는 아니지만) 아키텍처에서 스택 포인터는 스택 메모리의 맨 위에서 시작하며, 스택이 커질수록 아래쪽으로 이동합니다. 매핑된 스택 공간 전체에 대해 물리 메모리를 미리 할당하지는 않습니다. 대신 요구 페이징을 사용하여 스택 프레임에 도달할 때마다 메모리를 지연 할당합니다.
malloc 같은 힙 할당 함수가 시스템 호출이 아니라는 사실을 들으면 놀라실 수도 있습니다. 대신 힙 메모리 관리는 libc 구현이 제공합니다! malloc, free 등은 복잡한 프로시저이며, libc는 메모리 매핑의 세부 사항을 직접 추적합니다. 내부적으로 유저랜드 힙 할당자는 mmap(파일 외의 것도 매핑할 수 있습니다)과 sbrk를 비롯한 시스템 호출을 사용합니다.
보너스: 소소한 이야기
이 내용들을 넣을 만한 적당한 자리를 찾지 못했지만 재미있다고 생각해서 여기에 실었습니다.
대부분의 Linux 사용자는 아마도 커널에서 페이지 테이블이 어떻게 표현되는지 상상하는 데 시간을 거의 쓰지 않을 만큼 충분히 흥미로운 삶을 살고 있을 것입니다.
하드웨어 인터럽트를 다르게 시각화한 그림입니다.

참고로 일부 시스템 호출은 커널 공간으로 점프하는 대신 vDSO라는 기법을 사용합니다. 이에 대해 이야기할 시간은 없었지만, 꽤 흥미로운 내용이니 한번 찾아 읽어 보시기를 권합니다.
마지막으로, 유닉스 편향이라는 지적에 대해 말씀드리겠습니다. 실행과 관련된 내용 중 상당 부분이 유닉스에 매우 특화되어 있다는 점은 저도 정말 미안하게 생각합니다. macOS나 Linux 사용자라면 문제없지만, CPU 아키텍처에 관한 내용은 모두 같더라도 Windows가 프로그램을 실행하거나 시스템 호출을 처리하는 방식을 이해하는 데에는 그다지 도움이 되지 않을 것입니다. 언젠가 Windows 세계를 다루는 글도 꼭 써 보고 싶습니다.
감사의 말
이 글을 쓰는 동안 GPT-3.5, GPT-4와 꽤 많은 대화를 나눴습니다. 거짓말을 많이 했고 정보도 대부분 쓸모없었지만, 문제를 풀어 나갈 때는 가끔 큰 도움이 되었습니다. LLM의 한계를 알고 LLM이 하는 모든 말을 극도로 의심한다면, LLM의 도움은 전체적으로 보아 이득이 될 수 있습니다. 그렇긴 하지만 LLM은 글쓰기에는 형편없습니다. LLM에게 글을 대신 쓰게 하지 마십시오.
무엇보다도 제 글을 교정해 주고, 격려해 주고, 함께 브레인스토밍해 준 모든 분께 감사드립니다. 특히 Ani, B, Ben, Caleb, Kara, polypixeldev, Pradyun, Spencer, Nicky(4장의 멋진 엘프를 그려 주었습니다), 그리고 사랑하는 부모님께 감사드립니다.
컴퓨터를 좋아하는 십 대인데 아직 Hack Club Slack에 들어오지 않았다면 지금 바로 가입하십시오. 제 생각과 진행 상황을 나눌 멋진 사람들의 커뮤니티가 없었다면 저는 이 글을 쓰지 못했을 것입니다. 십 대가 아니라면 저희가 계속 멋진 일을 할 수 있도록 후원해 주십시오.
이 글에 실린 그저 그런 그림은 모두 Figma로 그렸습니다. 편집에는 Obsidian을 썼고, 린팅에는 가끔 Vale를 썼습니다. 이 글의 Markdown 원본은 GitHub에 공개되어 있으며 앞으로의 사소한 지적도 언제든 환영합니다. 모든 그림은 Figma 커뮤니티 페이지에 공개되어 있습니다.