Search

부팅, 부트로더

대분류
CS
소분류
OS
유형
시스템 프로그래밍
메모리 관리
주요 레퍼런스
https://cheonee.tistory.com/entry/부트로더
최종 편집 일시
2024/10/30 01:27
생성 일시
2022/04/03 11:09
14 more properties

부팅(Booting)

PC가 켜진 후 OS가 실행되기 전 사이에 수행되는 과정
부팅 과정에서 수행하는 작업
프로세서를 초기화(멀티코어 관련 처리 포함)
메모리와 외부 디바이스 검사 및 초기화 작업
부트 로더를 메모리에 복사하고 OS시작 등이 포함

BIOS

메인 보드에 포함된 펌웨어의 일종으로 롬(ROM)이나 플래시 메모리로 존재
PC의 전원이 켜지면 프로세서가 가장 먼저 실행하는 코드
부팅 과정 중 하드웨어와 관련된 작업을 담당하며, BIOS가 수행하는 각종 테스트나 초기화를 POST(Power On Self Test)라고 함
부팅 옵션 설정이나 시스템 전반적인 설정 값을 관리하며, 설정 값으로 시스템을 초기화하여 OS를 실행할 수 있는 환경 제작
POST가 완료되면 여러 장치를 검사하여 부트 로더가 있는지 확인
부트로더가 있다면, 코드를 0x7C00 주소에 복사한 후 프로세서가 0x7C00 주소부터 코드 수행
부트로더가 없다면, Operating System Not Found와 같은 오류 메시지를 출력

부트로더(BootLoader, 부트 스트랩 코드)

부트 + 로더 : 시스템의 초기 동작 + 실제 운영체제 시스템 업로드
시스템의 초기화 동작을 수행한 후, 실제 운영체제를 메모리에 탑재하고 동작시켜 주는 프로그램.
BIOS가 가장 먼저 실행하는 프로그램, BIOS에서 처음으로 제어를 넘겨받는 부분
플로피 디스크나 하드 디스크 같은 외부 저장 장치에 존재
저장 장치 내의 가장 첫 번째 섹터 MBR에 있는 프로그램, 크기는 512Byte
섹터 : 디스크를 구성하는 데이터의 단위, 한 섹터의 크기는 512Byte
주 역할 : OS를 실행에 필요한 환경 설정, 디스크 내에 있는 OS 이미지를 메모리에 복사한 뒤 제어 전달

OS 부팅 과정

<그림 1> OS 부팅 과정
BIOS의 첫 번째 섹터가 부트 로더/BIOS가 디스크에서 읽은 첫 번째 섹터가 부트 로더인지 판단하기 위해 가장 마지막 2Byte의 값을 0x550xAA로 설정
디스크를 부팅 용도로 사용하지 않는다면, 첫 번째 섹터는 부트 로더가 아닌 일반 데이터가 저장되기 때문에 BIOS는 혹시 모를 실수로 데이터를 메모리에 올려 실행해버려서 PC가 리부팅되는 사태를 방지하기 위해 읽어 들인 512Byte의 마지막 2Byte를 검사함.
마지막 2Byte의 값이 0x550xAA라면 부트 로더로 인식하고, 0x550xAA가 아니라면 데이터로 인식하고 부팅 과정을 더 이상 진행 X
디스크의 첫 번째 섹터에는 부트 로더 이외의 디스크의 파티션 정보도 보유
MBR 영역에는 기본적으로 4개의 파티션 영역이 있고 파티션 영역에 정의된 영역은 독립된 공간을 보장하기에 데이터를 분할된 파티션에 저장했다면 특정 파티션에 문제가 발생해도 다른 파티션에서 데이터 복원 가능
MBR(마부레) : 하드 디스크 맨 앞에 기록되어 있는 시스템 기동용 영역.
개인 PC에 전원을 넣으면 먼저 첫 번째 하드 디스크의 MBR에 기록되어 있는 프로그램이 읽힘
Partition table의 정보를 기점으로 기동하는 분할(partition)의 부트 섹터(boot sector. 분할의 맨 앞에 있는 OS 기동 프로그램이 기록된 부분)를 읽어 이 섹터의 프로그램에 의해 운영 체제(OS)가 가동되는 기능
MBR이 파티션 테이블의 boot flag가 있는 첫 번째 파티션를 읽어 들인다. 이때 LILO(  Linux Loader )가 가동된다. LILO가 운영체제의 커널을 하드디스크로부터 컴퓨터 내부의 SDRAM에 읽어 들여서 실행된다.
Window에서는 NT Loader가 LILO랑 동일한 기능을 하는 MBR에 해당

부트로더의 기능

1.
하드웨어 디버깅과 시스템 초기화 기능
임베디드 시스템 개발 과정 중 하드웨어 설계가 끝나면 가장 처음 시작하는 것이 프로세서를 동작시키는 것
임베디드 시스템 : 제어를 위한 특정 기능을 수행하는 컴퓨터 시스템, 장치 내부에 존재하는 전자 시스템
프로세서를 동작시키면 그 나머지 디바이스들에 대한 검증을 한다. 이러한 검증을 위해서는 프로그램을 이용하여 시스템 동작의 이상에 따른 하드웨어 검증 루틴을 만들어야한다. 이러한 과정을 통해서 부트로더는 하드웨어 디버깅과 시스템 초기화 기능을 가지게 된다.
2.
메시지출력 및 명령어 처리기능
부트로더가 하드웨어를 초기화하는 과정에서 진행된 위치나 상태를 알려주는 기능은 필수적이다. 초기에 시리얼 디바이스 초기화가 힘든 상태에서는 LED를 이용해 진행 표시를 한다. 이후 시리얼 디바이스가 초기화되면 시리얼을 통해서 프로그램 상태나 기타 메시지를 출력한다.
시리얼 통신으로 메시지를 출력할 때는 보통 C 함수의 printf문을 구현하는 것이 일반적이다. 이를 통해서 필요한 메시지를 출력하여 하드웨어의 상태를 출력할 수 있다.
대부분의 부트로더는 자체적으로 보드를 시험할 수 있는 명령 셋을 제공하여 타겟보드의 상태를 쉽게 알 수 있도록 한다.
3.
실행이미지 다운로드 기능
PC에서 동작하는 프로그램과 임베디드 시스템에서 동작하는 프로그램의 가장 큰 차이는 컴파일 위치와 수행 위치가 다르다는 점이다. PC에서는 컴파일과 수행을 모두 PC에서 하지만 임베디드 시스템은 그렇지 않다. PC에서 작업한 프로그램을 임베디드 시스템의 플레시 메모리에 굽는 과정을 거쳐서 프로그램을 실행시켜 보거나 프로세서 에뮬레이터를 통해서 프로그램을 실행 시켜야 한다.
보드의 플래시 메모리의 부트 영역에 아무것도 저장되어 있지 않은 초기 상태에서는 디버깅용 ICE 장비나 JTAG 툴을 이용하여 플래시 메모리에 부트로더를 써 넣는다. 부트로더가 실행되고 나면 개발 호스트 PC와 시리얼이나 이더넷 통신기능을 통해서 이미지를 DRAM에 다운로드 한 이후에 플래시 메모리에 써 넣을 수 있다.
특히 임베디드 시스템에 리눅스를 올리고자 할 때에는 커널 자체 크기도 1MB 이상이 되고 램 디스크 이미지도 2MB 이상을 넘어가기 때문에 시리얼로만 다운로드 하기에는 시간이 너무 오래 걸린다. 따라서 최종 제품에는 이더넷을 빼더라도 개발 단계의 보드에서는 이더넷을 꼭 집어 넣는다.
이처럼 부트로더는 시리얼과 이더넷을 통한 이미지 다운로드 기능이 있어야 하며, 다운로드 된 이미지를 플래시에 써 넣기 위한 기능도 있어야 한다.
4.
운영체제 구동 기능
임베디드 시스템에 리눅스 커널을 탑재하고 구동시키기 위해서는 커널 시작점으로 점프하는 기능과 초기 설정을 커널에 전달하거나 커널의 진입시에 필요한 형식을 구현해 주어야 한다.
일반적인 임베디드 리눅스 시스템이라면 압축된 커널 이미지가 플래시 메모리 장치에 있고 리눅스 커널을 필요로 하는 루트 파일시스템 이미지 역시 플래시 메모리 장치에 저장되어 있게 된다. 이처럼 부트로더는 커널 이미지 등을 플래시 메모리로부터 램 영역으로 복사하는 기능이 있어야 하며, 커널 수행 진입점으로 수행 위치를 옮기는 기능을 가지고 있어야 한다.