※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
이전 글들을 통해 파악하였듯이
초기의 컴퓨터는 단순히 산술논리 연산을 자동화하기 위해 설계되었다.
하지만 연산 결과를 저장하고 다시 활용할 필요성이 대두되면서
메모리 회로가 개발되었다.
이는 단순한 계산기 역할을 하던 컴퓨터가
점차 정보를 저장하고 관리하는 장치로 발전하는 계기가 되었다.
컴퓨터의 활용 범위가 확대되면서,
더 효율적인 데이터 저장 및 관리 시스템이 필요하게 되었고,
파일 시스템과 같은 개념이 등장했다.
또한, 다양한 입출력 장치(키보드, 모니터 등)의 도입과 더불어,
컴퓨터 간 데이터 공유 시스템(네트워크)의 필요성이 제기되었다.
이 과정에서 컴퓨터가 단순한 연산 기계에서
다양한 작업을 수행하는 시스템으로 발전하기 위해,
하드웨어와 소프트웨어 간의 상호작용을
원활하게 조율하는 운영체제(OS)가 필요하게 되었다.
그러나 운영체제는
하드디스크나 저장 장치에 저장되어 있기 때문에,
전원이 켜졌을 때 CPU는
어디에서 운영체제를 불러와야 하는지 알지 못했다.
따라서 부팅 과정에서 가장 먼저 실행되는 프로그램이 필요했고,
그렇게 도입된 시스템이 바로 BIOS(Basic Input/Output System)이다.
< BIOS (Basic Input/Output System) >
< BIOS의 핵심 역할 >
BIOS는 다음과 같은 기능을 하는 시스템이다.
[1] 부팅 시 하드웨어 초기화
CPU, RAM, 키보드, 모니터, 디스크 등
기본적인 장치가 정상 작동하는지 검사한다
※ BIOS는 최소한의 코드로 시스템을 초기화하고, 부트로더/운영체제게 제어권을 넘긴다.
[2] 운영체제 로딩
보조기억장치(HDD, SSD)에서
운영체제(또는 부트로더)를 찾아 실행한다.
※ 부트 로더란 주기억장치에 저장된 운영체제의 위치를 찾아 메모리에 로드하여 실행할 수 있도록 도와주는 작은 프로그램(코드)이다.
※ 부트 로더는 보조기억장치(HDD/SSD)의 첫 번째 섹터에 저장되어 있다.
※ 부트 로더는 보조기억장치에 여러 개의 운영체제가 설치되어 있는 경우, 사용자가 원하는 운영체제를 선택할 수 있도록 지원해 줄 수 있다.
※ BIOS와 같이 ROM에 부트로더 코드를 삽입하지 않은 이유는 운영체제의 종류와 저장 위치가 변경될 수 있으며, 운영체제는 지속적으로 업데이트가 가능하기 때문이다.
또한, 운영체제의 파일 시스템 구조가 달라질 수 있어 부트로더도 이에 맞춰 지속적인 업데이트가 필요하다.
반면, BIOS는 ROM에 저장되어 있어 기본적으로 업데이트가 불가능하다.
따라서 부트로더는 파일 시스템을 해석할 수 있어야 하며, 이를 통해 운영체제의 상태에 맞춰 효율적인 업데이트가 이루어질 수 있다.
[3] 기본 입출력 인터페이스 제공
키보드, 모니터, 디스크 등의 장치와
통신할 수 있도록 기본 기능을 제공한다.
< BIOS 실행 과정 >
BIOS는 컴퓨터가 전원을 켜면 가장 먼저 실행되는 프로그램이다.
BIOS가 수행하는 주요 단계는 다음과 같다.
[1] Reset Vector 실행
CPU가 ROM(바이오스 칩)의 특정 주소에서 실행을 시작한다.
※ Reset Vector란 CPU가 전원이 켜졌을 때 가장 먼저 실행할 코드의 위치를 지정하는 메모리 주소이다.
※ 해당 주소(Reset Vector)는 ROM의 마지막 부분에 위치한다. 그 이유는 후에 설명하겠다.
※ ROM(Read-Only Memory)이란 전원이 꺼져도 내용이 유지되는 비휘발성 메모리로 부팅 시 필수적인 펌웨어(BIOS, UEFI 등)가 저장된다.
※ 현대의 ROM은 EEPROM(전기적으로 지울 수 있는 ROM) 또는 플래시 메모리로 구현됩니다.
※ BIOS 코드는 ROM에 저장되며, 컴퓨터가 켜질 때 항상 같은 위치에서 실행됩니다.
※ 하지만, 현대의 BIOS는 플래시 메모리에 저장되어 업데이트가 가능하다.
※ ROM 추가 설명 ↓ ↓ ↓
- 초기 ROM은 마스크 프로그래밍된 반도체 칩으로, 한 번 기록되면 변경이 불가능했다.
- 이후 PROM(Programmable ROM), EPROM(Eraseable PROM), EEPROM(전기적으로 지울 수 있는 ROM) 등의 기술이 발전했다.
- 현대의 ROM(플래시 기반 EEPROM)은 전하 트랩 메모리 셀을 활용하는 NAND 플래시 기술을 기반으로 한다.
- BIOS 저장에 사용되는 플래시 메모리는 NOR 플래시 구조를 기반으로 하며, 이는 빠른 랜덤 액세스가 가능하다는 장점이 있다.
즉, 오늘날의 BIOS ROM은 전하 트랩 메모리를 사용하는 플래시 기반 EEPROM이며, 필요할 경우 업데이트가 가능하다.
[2] POST (Power-On Self Test)
RAM, CPU, 키보드, 디스크 등의 상태를 점검한다.
※ RAM 검사: 메모리 주소에 데이터를 기록하고 다시 읽어 정상적으로 동작하는지 확인
※ CPU 검사: 기본적인 연산 수행 여부 확인
※ 키보드 검사: 키보드가 연결되어 있는지 및 입력 신호 수신 여부 확인
※ 디스크 검사: 부트 디바이스(운영체제가 저장된 장치)가 있는지 확인
※ 디스플레이 검사: 기본적인 화면 출력이 가능한지 확인합니다. BIOS는 일반적으로 특정 문자를 출력하여 디스플레이 상태를 확인
[3] I/O 장치 초기화
키보드, 모니터, 디스크 컨트롤러 등의 하드웨어를 설정한다.
※ 키보드 버퍼 초기화 (입력 대기 상태로 설정)
※ 모니터 초기화 (텍스트 모드 또는 그래픽 모드 설정)
※ 디스크 컨트롤러 활성화 (디스크 입출력을 수행할 준비)
[4] 부트 디바이스 검사 및 부트로더 실행
운영체제를 로드하고 실행한다.
※ 부트로더(Bootloader)란 운영체제를 메모리에 로드하는 작은 코드(프로그램)로,으로, BIOS에 의해 실행된다.
※ BIOS → 부트로더 → 운영체제의 순서로 CPU 제어권을 넘겨준다.
< BIOS 코드의 전체 구조 (간략화) >
앞서 언급하였듯이
BIOS는 다음과 같은 주요 부분으로 구성된다.
[1] 초기화 코드 (Reset Vector & 하드웨어 설정)
[2] POST (Power-On Self Test, 하드웨어 점검)
[3] 기본 입출력 루틴 (키보드, 모니터, 메모리 제어)
[4] 부트로더 실행 (운영체제 또는 프로그램 로드)
그리고
RAM과 ROM 다른 장치이지만, 같은 주소 체계를 공유한다.
이에 따라 예시로 메모리 맵을 제시 하면 다음과 같다.
메모리 주소 | 크기 | 설명 | 저장 위치 |
0x0000 ~ 0x03FF | 1KB | IVT (Interrupt Vector Table) | RAM |
0x0400 ~ 0x04FF | 256B | BIOS Data Area (BDA) | RAM |
0x0500 ~ 0x9FFF | 약 640KB | 일반 RAM (운영체제 및 프로그램 실행) | RAM |
0xA000 ~ 0xBFFF | 128KB | 비디오 메모리 (그래픽 카드) | RAM |
0xC000 ~ 0xDFFF | 128KB | 확장 ROM (VGA BIOS 등) | ROM |
0xE000 ~ 0xFFFF | 128KB | BIOS 코드 (시스템 펌웨어) | ROM |
※ BIOS 코드가 저장되는 곳 → 0xE000 ~ 0xFFFF (ROM 영역)
※ BIOS 실행 후, 필요한 데이터는 RAM에 저장됨 (IVT, BDA 등)
이어서 각 부분에 대한
BIOS 코드를 간략히 살펴보면 다음과 같다.
대부분의 BIOS는 어셈블리어로 작성된다.
[컴퓨터][27] 컴퓨터 완성 : Non-ALU 명령어 및 플래그 (데이터 명령어 / 분기 명령어 / 직접 분기 명
※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 참
core-basic.tistory.com
[컴퓨터][28] 초기 어셈블리어와 어셈블러 구현 및 원리 (Assembly language, Assembler)
※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글들을 통해 ALU 명령어와 Non-ALU 명령어에 대해 알아보았다.그러면서 명령어가 무엇인지, 명령어는 어떻게
core-basic.tistory.com
[1] Reset Vector & 하드웨어 초기화
Reset Vector란 CPU가 전원이 켜졌을 때
가장 먼저 실행할 코드의 위치를 지정하는 메모리 주소로,
BIOS가 시작되는 주소를 저장하고 있다.
해당 코드는 ROM의 마지막 주소에 저장되는데
그 이유는
CPU가 전원이 켜질 때
항상 동일한 위치에서 실행을 시작하도록 하기 위함이다.
또한,
개발자에게 BIOS 코드의 위치를 예측할 수 있게 하여
운영체제나 다른 소프트웨어의 초기화 과정에서 충돌을 방지하고,
다양한 하드웨어 환경에서도 일관되게 동작할 수 있게 한다.
ex)
ORG 0xE000 ; BIOS 시작 주소 (ROM의 시작)
JMP start ; 부팅 코드 실행 (0xE000 : BIOS 시작)
※ ORG(Origin) 명령어는 어셈블러에게 특정 메모리 주소에서 코드를 시작하도록 지시하는 역할을 한다. 실제 CPU에는 존재하지 않으며, 코드가 ROM의 특정 위치에서 시작되도록 설정하는 기능을 한다
[2] 메모리 & 하드웨어 초기화
RAM을 초기화하고 키보드, 모니터를 사용할 수 있도록 설정하는 과정
ex)
start:
; RAM 초기화 (0x0000 ~ 0x9FFF)
LDI R0, 0x0000 ; 레지스터 R0 = 시작 주소
LDI R1, 0x9FFF ; 레지스터 R1 = RAM 마지막 주소
mem_clear:
ST R0, 0x0000(R0) ; 메모리 0x0000부터 클리어
INC R0 ; 다음 메모리 주소로 이동
CMP R0, R1 ; 끝 주소인지 확인
JNZ mem_clear ; 끝이 아니면 계속 초기화
; 키보드 및 디스플레이 초기화
ST 0x0400, 0x00 ; BDA 초기화 (키보드 버퍼 포함)
ST 0xA000, 0x00 ; 비디오 메모리 초기화
JMP post ; POST 실행
[3] POST (Power-On Self Test)
POST는 RAM, 키보드, 디스플레이, HDD 등의 상태를 점검하는 과정
ex)
post:
; RAM 테스트
LDI R2, 0x55 ; 테스트 패턴 0x55 (10101010)
ST R2, 0x0000 ; RAM 첫 번째 주소에 저장
LD R3, 0x0000 ; 다시 읽어오기
CMP R2, R3 ; 값이 같은지 확인
JNZ ram_error ; 다르면 오류 처리
ram_error:
ST 0xA000, 'R' ; 화면에 'R' 출력 (RAM ERROR)
HLT ; 시스템 정지
; 키보드 체크
keyboard_check:
LD R4, 0x041E ; 키보드 입력 검사
CMP R4, 0x00 ; 입력이 없으면
JNZ continue ; 입력이 있으면 계속 진행
CALL wait ; 일정 시간 대기 후 다시 검사
JMP keyboard_check
; 디스플레이 체크
ST 0xA000, 'B' ; 'B' 글자를 화면에 출력 (0xA000 : 프레임버퍼 관련 주소)
JMP check_boot_disk ; 부트 디스크 검사
check_boot_disk:
MOV DL, 80h ; 첫 번째 부팅 디바이스 (HDD)
boot_disk_loop:
CALL disk_read ; 디스크 읽기 시도
LDI R5, (0x7C00 + 510) ; 부트 시그니처 주소
CMP R5, 0x55AA ; 부트 시그니처 확인
JZ bootloader ; 부팅 가능하면 부트로더 실행
ADD DL, 1 ; 다음 디스크 검사 (USB, 플로피 등)
CMP DL, 82h ; 디스크 종류 검사 (80h: HDD, 81h: USB, 82h: 플로피)
JNZ boot_disk_loop
JMP boot_error ; 부팅 실패 시 오류 메시지 출력
disk_read:
MOV AH, 02h ; BIOS 디스크 서비스: 섹터 읽기
MOV AL, 1 ; 읽을 섹터 수 = 1
MOV CH, 0 ; 트랙 번호
MOV DH, 0 ; 헤드 번호
MOV DL, 80h ; 첫 번째 하드디스크
MOV BX, 0x7C00 ; 로드할 메모리 주소
INT 13h ; BIOS 디스크 인터럽트 호출
JC disk_error ; 에러 발생 시 disk_error로 이동
RET
boot_error:
ST 0xA000, 'N' ; "No Boot Device" 메시지 출력
HLT ; 시스템 정지
disk_error:
ST 0xA000, 'E' ; 오류 메시지 출력
HLT ; 시스템 정지
※ check_boot_disk: 부트 디스크를 확인하고 부트 섹터 시그니처(0x55 AA)를 검사한다.
※ disk_read: BIOS 인터럽트를 사용하여 첫 번째 하드디스크의 부트 섹터를 RAM(0x7C00)으로 로드한다.
※ 부트 시그니처 확인: 0x7DFE 주소에서 시그니처(0x55AA)를 검사하여 유효한지 판단한다.
[4] 부트로더 실행 (운영체제 로드)
부트 로더란 주기억장치에 저장된 운영체제의 위치를 찾아
메모리에 로드하여 실행할 수 있도록 도와주는
작은 프로그램(코드)이다.
부트 로더는 보조기억장치(HDD/SSD)의
첫 번째 섹터에 저장되어 있으며
주기억장치에 여러 개의 운영체제가 설치되어 있는 경우,
사용자가 원하는 운영체제를 선택할 수 있도록 지원해 줄 수 있다.
BIOS와 같이 ROM에 부트로더 코드를 삽입하지 않은 이유는
운영체제의 종류와 저장 위치가 변경될 수 있으며,
운영체제는 지속적으로 업데이트가 가능하기 때문이다.
또한, 운영체제의 파일 시스템 구조가 달라질 수 있어
부트로더도 이에 맞춰 지속적인 업데이트가 필요하다.
반면,
BIOS는 ROM에 저장되어 있어 기본적으로 업데이트가 불가능하다.
따라서 부트로더는 파일 시스템을 해석할 수 있어야 하며,
이를 통해 운영체제의 상태에 맞춰 효율적인 업데이트가 이루어질 수 있다.
※ 이에 따라 BIOS → 부트로더 → 운영체제 순으로 제어권이 넘어간다
ex)
bootloader:
LDI R7, 0x7C00 ; 부트로더가 로드될 메모리 주소
CALL disk_read ; 디스크에서 부트섹터 읽기
JMP 0x7C00 ; 부트로더 실행
※ BIOS는 부팅 가능한 디스크(하드디스크, SSD, USB 등)를 찾는다.
※ 부트 디바이스의 첫 번째 섹터(부트 섹터)를 읽고, 유효한 부트로더 코드가 존재하는지 확인한다.
※ 부트로더가 존재하면 이를 RAM에 적재한 후 실행한다.
※ 만약 부팅 가능한 디스크를 찾지 못하면 오류 메시지를 출력하고 실행을 멈춘다.
(부가 설명)
이후, 16비트 환경에서 동작하며
메모리 접근에 제한이 있다는 BIOS 한계를 극복하고자,
보다 빠르고 유연한 운영을 가능한 32/64비트 환경에서 동작하는
UEFI (Unified Extensible Firmware Interface)가 등장하였다.
< 주관적인 생각 >
BIOS에 대한 내용은 찾기가 어려워
CHATGPT의 도움을 많이 받았다.
그래서
BIOS가 어떠한 이유 때문에 도입이 되었는지,
초기에는 어떻게 회로와 코드로 구현하였는지,
그리고 어떻게 발전해 왔는지
누구나 이해하기 쉽고 상세히 적혀있는
책이 있었으면 좋겠다는 생각도 들었다.
또,
어떠한 개념과 분야 그리고 관계에서도 처음이 있기에
그 처음부터 상세히 살펴보면
누구나 쉽게 배우고 이해할 수 있다고 생각한다.
그래서
직관적이지 않고, 중요한 원리와 연쇄작용들을
하나의 단어를 통해 어렵게 설명하려고 하는 것이 싫다.
다음 주제는 이어서
운영체제와 고급 프로그래밍언어 및 컴파일러에 대해
어디서부터 탐구해 나아가야 할지
알아가 보겠다.
※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
'[無에서 시작하는 컴퓨터&과학]' 카테고리의 다른 글
[컴퓨터][35] BIOS에서 운영체제 그리고 고급 프로그래밍 언어의 필요성과 기능 (1) | 2025.03.06 |
---|---|
[컴퓨터][33] 비휘발성 저장 장치 - 3 (Solid-State Drive , SSD) (0) | 2025.02.20 |
[컴퓨터][32] 비휘발성 저장 장치 - 2 (자기 테이프, 플로피 디스크, 하드 디스크:HDD) (0) | 2025.02.12 |
[컴퓨터][31] 비휘발성 저장 장치 - 1 (전자기학 기초 및 자기 와이어 레코딩:magnetic wire recording, 녹음기) (0) | 2025.02.02 |
[컴퓨터][30] 입출력(I/O) 장치 : 모니터의 원리 (0) | 2024.12.29 |