2026. 10. 9. 19:16ㆍ크래프톤 정글/포스팅
1. 컴퓨터는 원래 어떻게 프로그램을 실행할까
프로그램은 기계어 명령어의 나열이고, 메모리에 올라가 있다. CPU는 명령어를 가져오고(fetch), 해석하고(decode), 실행하는(execute) 일을 계속 반복한다. CPU 안의 프로그램 카운터가 "다음 명령어가 메모리 몇 번지에 있는지"를 가리킨다.
그래서 운영체제가 없어도 프로그램은 돈다. 임베디드 시스템(전자레인지, 세탁기 제어기 등)이 그렇다. 화면이나 키보드 같은 장치도 특정 주소에 값을 쓰면 반응하도록 만들어져 있어서, 프로그램이 하드웨어를 직접 조작할 수 있다.
2. 왜 운영체제가 필요해졌나
CPU와 메모리는 비싼 자원인데, 하나의 프로그램만 돌리면 낭비다. 그래서 여러 프로그램이 한정된 자원을 나눠 쓰게 하자는 요구가 생겼다. 그런데 프로그램들이 각자 하드웨어를 직접 만지면 문제가 생긴다.
- 매번 장치 제어 코드를 직접 짜야 한다. (불편)
- 여러 프로그램이 같은 메모리나 화면을 건드려 충돌한다. (위험)
- 하드웨어가 바뀌면 프로그램을 다시 짜야 한다. (이식성 문제)
그래서 OS가 하드웨어를 독점 관리하고, 프로그램에는 시스템 콜이라는 정해진 창구만 열어 준다. OS의 목표는 세 가지다.
- 효율: 자원을 최대한 나눠서 잘 쓰기
- 보호: 프로그램끼리 서로 망가뜨리지 못하게 하기
- 편의: 하드웨어를 파일, 프로세스 같은 쉬운 개념으로 쓰게 하기
역사는 한 줄이 아니라 두 계보다. DOS는 개인용 PC를 위한 단순한 OS(한 번에 한 프로그램)로 시작해 윈도우로 이어졌고, 유닉스는 대형 컴퓨터에서 여러 사용자와 프로그램을 동시에 처리하려고 만들어져 리눅스로 이어졌다.
3. OS는 어떤 존재인가
3-1. 커널이란?
"운영체제"는 넓은 의미로 쓰이는 말이다. 바탕화면, 설정 앱까지 포함해서 부르기도 한다. 그중 자원을 직접 관리하는 핵심 부분(스케줄링, 메모리 관리, 장치 제어 등) 을 커널이라고 한다.
커널은 공간이 아니라 프로그램이다. 평소에는 디스크에 파일로 저장돼 있다가, 부팅 때 메모리(RAM)에 올라가 실행된다. 커널이 올라가 있는 메모리 구역을 "커널 메모리 영역"이라고 부르기도 하지만, 실체는 프로그램이다.
3-2. 커널은 특별한 코드가 아니다
OS도 CPU와 메모리를 쓰면서 돌아가는 평범한 프로그램이다. 스케줄링, 메모리 할당 같은 일도 평범한 코드가 하는 계산이다. 커널은 부팅 때 RAM에 올라가 전원이 꺼질 때까지 상주한다. 언제 인터럽트나 시스템 콜이 들어올지 모르고, CPU는 메모리에 있는 코드만 실행할 수 있기 때문이다.
3-3. 특별 대우의 정체
- 선착순: 컴퓨터를 켜면 가장 먼저 실행되는 게 OS라서, 다른 프로그램이 오기 전에 규칙을 세팅할 수 있다.
- 하드웨어의 강제력: CPU가 그 규칙을 회로로 지켜 준다.
- 모드 비트: 커널 모드(최고 권한)와 유저 모드(낮은 권한)를 CPU가 구분한다. 유저 모드에서 특권 명령어를 실행하려 하면 CPU가 막고 예외를 발생시킨다. 원리는 "특권 명령어 AND 유저 모드 → 예외 신호"처럼 단순한 회로다. 모드 비트는 컴퓨터구조에서 배운 슈퍼바이저 플래그와 같은 개념이다. 실제 CPU마다 모드 비트 저장 위치(레지스터, 비트)는 다르지만, CPU가 현재 권한 값을 보고 특권 명령어를 허용하거나 막는다는 원리는 같다.
- 타이머: OS가 알람을 맞춰 두면, 시간이 됐을 때 타이머 장치가 CPU에 신호를 보내 강제로 OS에게 제어권을 돌려준다.
- 메모리 보호 장치(MMU): 허락된 범위 밖 메모리 접근을 CPU가 막고, 커널 영역도 일반 프로그램이 건드리지 못하게 보호한다.
3-4. 타이머와 인터럽트
- 인터럽트: 장치가 CPU에게 보내는 호출 신호. CPU는 신호를 받으면 하던 일을 멈추고, 현재 상태를 저장한 뒤, 커널이 등록해 둔 처리 코드로 점프한다(모드도 커널 모드로 바뀐다). 키보드 입력, 디스크 입출력 완료, 네트워크 데이터 도착 등 여러 종류가 있다.
- 타이머: 정해진 시간마다 인터럽트를 보내는 알람시계 장치. 타이머 인터럽트는 인터럽트의 한 종류다.
- CPU는 한 번에 하나만 실행한다. 하지만 OS가 타이머 인터럽트로 아주 짧은 시간마다 CPU를 회수해 다른 프로그램에 넘겨주기 때문에, 너무 빨라서 동시에 도는 것처럼 보인다. 프로그램이 CPU를 스스로 내놓지 않아도, 타이머 인터럽트 덕분에 OS가 CPU를 강제로 회수할 수 있다.
3-5. 하드웨어도 OS를 전제로 설계되어 있다
CPU와 OS는 짝으로 발전해 왔다. 그래서 OS 안에는 CPU마다 따로 작성해야 하는 얇은 층(부팅, 모드 전환, 인터럽트 처리, 문맥 교환 코드 등)이 있고, 스케줄링이나 파일 시스템 같은 대부분의 두뇌 부분은 CPU와 상관없이 거의 같다.
3-6. 유저 프로그램은 어떻게 커널의 힘을 빌리나
유저 프로그램은 커널 자료구조에 직접 접근할 수 없고, 커널이 제공하는 정해진 창구(시스템 콜)로만 요청할 수 있다. 시스템 콜 전용 명령어(또는 인터럽트, 예외)가 실행되면 CPU가 하드웨어적으로 커널 모드로 바꾸고, 커널이 부팅 때 등록해 둔 주소로만 점프한다. 그래서 일반 프로그램이 마음대로 커널 권한을 가질 수 없다.
시스템 콜은 할 수 있는 동작의 종류를 커널이 미리 정해 두는 것이다. 유저는 “down 해 줘”, "파일 읽어 줘"만 요청할 수 있고, “value를 99로 바꿔 줘”는 요청할 수 없다. 비유하자면 은행 창구에서 고객은 "입금해 주세요", "출금해 주세요"라고 요청할 수 있지만, 금고에 들어가 직접 돈을 꺼낼 수는 없다. 직원(커널)이 신분과 잔액을 확인하고 정해진 절차로 처리해 준다.
4. 부팅 과정: OS는 어떻게 가장 먼저 자리를 잡나

전원이 켜지면 CPU는 최고 권한(커널 모드)으로 시작, 약속된 주소에 있는 펌웨어(BIOS/UEFI) 를 실행
→ 펌웨어가 하드웨어를 점검하고, 디스크에서 부트로더를 찾아 메모리에 올린다.
→ 부트로더가 OS 커널을 메모리에 올리고 실행을 넘긴다.
→ 커널이 메모리 보호와 인터럽트 처리 같은 규칙을 초기 세팅한다.
→ 이후 일반 프로그램들은 유저 모드(낮은 권한) 로 실행된다.
펌웨어와 부트로더의 차이
- 펌웨어는 ROM에 있고 메인보드 제조사가 만든다. 하드웨어를 점검하고 부트로더를 실행하는 데까지만 한다.
- 부트로더는 디스크에 있고 OS 쪽이 만든다(리눅스는 GRUB 등). 커널을 찾아 메모리에 올린다.
- 이렇게 나눈 이유는 펌웨어가 용량이 작고 바꾸기 어렵기 때문이다. OS마다 다른 복잡한 부분은 디스크의 부트로더가 맡고, 덕분에 윈도우와 리눅스를 같이 설치해도 부트로더가 고르게 해 줄 수 있다.
5. OS를 직접 개발한다는 것은 어떤 의미일까? - 핀토스
OS를 만든다는 것은 컴퓨터를 켰을 때 CPU가 가장 먼저 실행하는 프로그램, 즉 커널을 직접 짜는 것이다. 핀토스는 바닥부터 전부 만드는 게 아니라, 부팅 등의 뼈대는 제공되고 스레드 스케줄링, 메모리 관리 같은 커널의 핵심 기능을 학생이 구현한다.
내가 만든 OS를 실제 노트북에서 첫 프로그램으로 돌릴 수는 없다. 이미 내 노트북에서는 다른 OS가 자리를 잡고 있고, 내가 만든 OS로 이를 잘못 건들이면 컴퓨터가 망가질 수도 있기 때문이다. 그래서 구조는 이렇게 된다.
내 컴퓨터
→ 도커(모든 학생이 같은 도구와 환경을 쓰게 해 주는 표준 작업실)
→ 빌드 도구로 핀토스 컴파일
→ QEMU(소프트웨어로 흉내 낸 가상 컴퓨터, 에뮬레이터)에서 내가 만든 커널을 부팅해 테스트
즉, OS의 핵심인 커널은 특별한 코드가 아니라 가장 먼저 실행된 프로그램이고, CPU가 그 규칙을 하드웨어로 강제해 주기 때문에 자원을 관리하는 힘을 가진다. OS를 만든다는 것은 그 "첫 프로그램"의 핵심 기능을 직접 구현해 보는 일이다.