본문 바로가기

BIOS만 있는 PC, OS 없이 부팅하기

반응형

Programming thought experiment: stuck in a room with a PC without an OS
Programming thought experiment: stuck in a room with a PC without an OS

 

⚡ 한 줄 요약: OS가 없어도 PC는 죽지 않는다. 전원이 들어오면 BIOS(펌웨어)가 하드웨어를 점검(POST)하고, 부팅 장치의 첫 512바이트(부트섹터)를 메모리 주소 0x7C00에 올려 실행한다. 즉 'OS 없는 PC'는 사실상 'BIOS만 있는 PC'이며, 부팅은 BIOS → 부트로더 → 커널 3단계다. 직접 부트섹터를 짜 넣으면 OS 없이도 코드가 돈다.

 

 

📑 목차

 

 

📰 무슨 일인가 — 오래된 사고실험

프로그래머 커뮤니티에서 주기적으로 돌아오는 사고실험이 있다.
"OS도, 인터넷도 없는 PC 한 대와 함께 방에 갇혔다.
어떻게 코드를 돌려 밖으로 나갈까?"
정답은 하나로 수렴한다.
BIOS부터 시작하라.

전원 버튼을 누르는 순간 CPU는 아무것도 모른다.
그런데도 화면에 로고가 뜨고 부팅이 진행되는 이유는, 메인보드 칩에 구워진 BIOS(Basic Input/Output System)가 있기 때문이다.
OS가 지워져도 BIOS는 그대로 남아 있다.
이 사고실험이 재밌는 건 '갇힌 방 탈출'이 아니라, 평소 당연하게 지나치던 부팅 과정을 한 겹 벗겨보게 만든다는 데 있다.

 

 

🧩 BIOS는 전원 직후 무엇을 하나

전원이 들어오면 순서가 이렇게 흐른다.

  1. POST (Power-On Self-Test): RAM·키보드·디스크 등 필수 하드웨어를 점검한다. 실패하면 그 유명한 '삑삑' 비프음이 난다.
  2. 부팅 장치 탐색: 설정된 순서(디스크·USB 등)대로 부팅 가능한 장치를 찾는다.
  3. 부트섹터 로드: 장치의 맨 앞 512바이트를 읽어 메모리 0x7C00에 올린다. 단, 그 512바이트의 맨 끝 2바이트가 0x55 0xAA(부팅 시그니처)여야만 "부팅 가능"으로 인정한다.
  4. 제어권 이양: 0x7C00으로 점프. 여기부터는 부트로더의 세상이다.

이때 CPU는 16비트 리얼 모드로 동작한다.
부트로더는 이 좁은 환경에서 CPU를 32/64비트 보호 모드로 전환하고, 디스크에서 커널을 마저 읽어 넘긴다.
우리가 아는 리눅스·윈도우 부팅이 바로 이 3단계의 확장판이다.

 

 

⚖️ 레거시 BIOS vs UEFI

요즘 나오는 PC 대부분은 순수 BIOS가 아니라 UEFI를 쓴다.
사고실험의 뼈대는 같지만, 실무에선 이 차이를 알아야 한다.

 

구분 레거시 BIOS UEFI
부팅 방식 MBR 512바이트 부트섹터 실행 EFI 파티션의 .efi 실행파일 로드
디스크 한계 MBR, 최대 2TB GPT, 사실상 제한 없음
CPU 모드 16비트 리얼 모드 시작 32/64비트에서 시작
보안 없음 시큐어 부트(서명 검증)

 

정리하면 512바이트에 목숨 거는 세계(BIOS)에서 파일 단위로 부팅하는 세계(UEFI)로 넘어온 것이다.
다만 UEFI도 호환 모드(CSM)로 레거시 부팅을 지원하는 경우가 많아, 아래 부트섹터 실습은 지금도 유효하다.

 

 

💡 개발자에게 주는 의미

이걸 왜 알아야 할까.
실무와 연결되는 지점이 분명히 있다.

  • 컨테이너·VM 이미지: 클라우드 VM 이미지가 부팅이 안 될 때 십중팔구는 부트로더·부트 파티션 문제다. 부팅 3단계를 알면 grub, 부트 파티션 오류 로그가 읽힌다.
  • 임베디드·IoT: OS 없이 베어메탈로 도는 펌웨어 개발은 이 부트섹터 실습이 그대로 축소판이다.
  • 보안: 부트킷·시큐어 부트 우회 같은 공격은 전부 이 초기 부팅 체인을 노린다. 방어하려면 공격 표면을 알아야 한다.

한마디로, 추상화의 맨 밑바닥을 한 번은 봐두는 것이 문제 해결의 해상도를 올린다.

 

 

🛠 실무 적용 — 512바이트 부트섹터 직접 짜기

사고실험의 실제 답을 코드로 옮겨보자.
OS 없이 화면에 글자를 찍는 최소 부트섹터다.
파일을 지울 필요 없이 QEMU 가상머신에서 안전하게 돌릴 수 있다.

; boot.asm — BIOS가 로드하는 512바이트 부트섹터 (16비트 리얼 모드)
bits 16
org 0x7c00              ; BIOS는 부트섹터를 0x7C00에 올린다

    mov si, msg
print:
    lodsb               ; [si] 한 바이트를 al로 읽고 si++
    or al, al           ; 문자열 끝(0)에 도달했나?
    jz hang
    mov ah, 0x0e        ; BIOS 텔레타이프 출력 함수
    int 0x10            ; BIOS 화면 인터럽트 호출 (OS가 없어도 BIOS는 있다)
    jmp print
hang:
    jmp hang            ; 무한 루프 — OS가 없으니 제어권 돌려줄 곳이 없다

msg db "Hello from BIOS, no OS!", 0

times 510-($-$$) db 0   ; 510바이트까지 0으로 채움
dw 0xaa55              ; 부팅 시그니처: 디스크엔 0x55,0xAA 순으로 기록됨

빌드하고 실행한다.

nasm -f bin boot.asm -o boot.bin      # 정확히 512바이트 바이너리 생성
qemu-system-x86_64 -drive format=raw,file=boot.bin

QEMU 창에 Hello from BIOS, no OS!가 뜨면 성공이다.
OS 커널도, C 런타임도, printf도 없이 BIOS 인터럽트(int 0x10)만으로 화면에 글자를 찍은 것이다.
dw 0xaa55 한 줄을 지우면 BIOS가 시그니처를 못 찾아 부팅을 거부하니, 직접 지워보며 확인해보길 권한다.
(NASM·QEMU 설치 및 아키텍처별 옵션은 각 공식 문서 확인 권장.)

 

 

✅ 체크포인트

  • 부팅 3단계 암기: BIOS(POST) → 부트로더(0x7C00) → 커널. VM·서버 부팅 장애 로그를 읽는 최소 지도다.
  • 512바이트 실습 1회: 위 부트섹터를 QEMU로 직접 돌려보기. 30분이면 충분하고, 추상화 밑바닥의 감각이 남는다.
  • 내 환경 확인: 지금 PC가 레거시 BIOS인지 UEFI인지 확인(윈도우는 msinfo32의 'BIOS 모드'). 부팅 문제 대응 시 첫 분기점이다.

방에 갇힐 일은 없겠지만, 부팅이 안 되는 서버 앞에 갇히는 일은 언젠가 온다.
그때 이 512바이트가 탈출구가 된다.

 

 

📚 참고(출처)


적용한 직전 회차 개선점
- 제목: 키워드 BIOS를 맨 앞 4자에 배치 + 구체 행동('OS 없이 부팅하기'), 공백 포함 23자, 콜론 없음.
- TL;DR: 키워드 문구 + 512바이트, 0x7C00, 3단계 등 수치·결론으로 직답.
- : 글의 핵심 통찰(BIOS↔UEFI)을 산문 대신 비교표로 추출 → 공유·스니펫 가치.
- 코드: 실제로 돌아가는 검증 가능한 예제 + 실행 명령 + "시그니처 지우면 부팅 거부" 검증 스텝.
- 정확성: 0x55 0xAA 시그니처의 디스크 기록 순서(리틀엔디언)를 주석에 명시, 불확실 부분은 '공식 문서 확인 권장'.

파일로 저장할까요?
(drafts/20260713_bios.md, 권한 승인 필요) 태그는 시스템 입력란용으로 BIOS, UEFI, 부트로더, 부트섹터, POST, 부팅과정, MBR, 어셈블리, QEMU, 리얼모드를 제안합니다.

 

 

📊 오늘의 개발 트렌드 (자동 집계)

GitHub·Hacker News·Hugging Face·App Store·Cloudflare Radar에서 매일 자동으로 모은 개발 트렌드입니다. (2026-07-13 18:13 기준)

🐙 GitHub 급상승

📰 Hacker News 화제

🤗 Hugging Face 트렌딩 모델

💰 App Store 매출 TOP (한국)

  • YouTube — Google
  • ChatGPT — OpenAI OpCo, LLC
  • Pokémon GO — Niantic, Inc.

🌐 가장 많이 방문되는 웹 (Cloudflare Radar)

반응형