목차
컴퓨터 부팅 과정
- 부팅이란 ⇒ 컴퓨터에 전원을 켰을 때 운영체제를 메모리에 올리는 과정
레지스터 = CPU 내에서 데이터를 기억하는 메모리 장치 / 처리할 명령어나 연산에 사용할 값이나 연산 결과를 일시적으로 기억하는 장치
PC = 다음 번에 실행할 명령어 주소를 기억하는 레지스터
- 컴퓨터에 전원이 들어오면 ROM이 동작을 시작한다.
- ROM에 저장된 BIOS(Basic Input/Output System) 시동 프로그램이 컴퓨터에 연결된 각종 하드웨어를 점검한다.
- 이를 POST(Power-on Self-test) 라고 한다.
- POST 점검에 이상이 없으면, 하드디스크의 마스터 부트 레코드(MBR)에 저장된 부트스트랩 로더(부트로더)를 메모리에 로딩한다.
-
MBR은 운영체제가 어디에 저장되어있는지를 나타내며, 하드디스크의 첫번째 섹터에 위치하고 있다.
-
BIOS가 연결된 저장매체를 설정된 부팅 순서대로 돌면서 MBR에 저장된 부트로더를 탐색한다
-
부트로더 탐색에 성공하면 BIOS는 부트로더 프로그램을 메모리에(0x00007c00) 올린다.
- 메모리에 올라온 부트로더가 운영체제 프로세스를 실행한다.
- 메모리에 올라온 1차 부트로더(MBR)가 2차 부트로더(BOOTMGR)을 메모리에 올려 운영체제를 실행시킨다
- 1차, 2차 부트로더가 나뉘어져 있는 이유는 용량 때문
- MBR/VBR의 최대 용량은 512바이트 뿐이므로 도스 같은 운영체제 정도에는 적합했지만 윈도우 같은 복잡한 운영체제의 커널을 로드 할 준비를 하기에는 부족
- 2차 부트로더를 1차 부트로더를 통해 커널을 로드하듯이 로드한 뒤, 2차 부트로더를 통해 커널을 로드하는 방식
부트로더란?
부트 로더 위치
- 저장 매체의 가장 앞 부분에 존재
- 하드디스크의 첫 번째 부팅 섹터(부트 섹터)인 MBR(Master Boot Record)에 위치하고 있어, 시스템 부팅 시 MBR에 있는 부트로더를 읽어 들여 운영체제가 부팅이 가능하게 만든다.
- 부트 섹터 = 디스크의 다른 부분에 저장되는 부팅 프로그램을 담을 수 있는 하드 디스크, 플로피 디스크, 또는 비슷한 기억 장치의 첫 섹터
- 부트 섹터의 마지막 2바이트에는 "0x55AA"라는 값이 있어야 한다.
- 이 값은 '이 디스크에 부트에 필요한 프로그램이 있다'는 것을 의미
- "0x55AA"가 확인되지 않으면 부팅 할 수 없다는 에러가 발생
- "0x55AA"가 확인된 후에는, 이 섹터의 선두부터 프로그램이 써 있을 것이라 판단하여 해당 위치부터 프로그래 실행
부트로더 파일 구성
- 소스파일
- 1개의 어셈블리 소스파일과 여러개의 C소스파일
- makefile : make에서 사용하는 컴파일 스크립트파일
- start.S : 부트로더 초기 코드로 어셈블리 코드, CPU, 메모리, gpio 초기화, 플래시 메모리를 DRAM 영역으로 복사
- main.c 부트로더 메인 소스코드
- commands.c : 명령어처리코드 포함
- lib.c : 부트로더에서 사용하는 라이브러리 포함
- 타겟 보드에 설정된 디바이스에 대한 처리프로그램 : flash.c, serial.c, time.c, net.c, bootp.c, tftp.c
- 헤더 파일
- 각 소스파일에서 사용하는 변수나 매크로들을 정의한 파일
- ld-xsacle : 링커 스크립트 파일(컴파일된 프로그램의 링크 방법)
- config.h : 부트로더 환경설정파일
- 부트로더 환경설정 파일
- config.h 매크로 형태로 정의된 변수
- 시리얼 포트 전성속도
- 자동부팅 지연시간
- 메모리 맵 : 부트로더, 커널, 램디스크 등 소프트웨어 컴포넌트를 플래시 메모리나 DRAM 어디에 저장할지 설정
매크로 선언 값을 수정하여 메모리 저장위치를 변경할수있음.
- 프로세서가 메모리 컨트롤러 내장한 경우
메모리 액세스 타이밍정보, 파라미터들이 메모리 제어 레지스터에 정확하게 설정되어야 함
부트로더 종류
- LILO (Linux lOder)
- GNU 프로젝트의 부트로더
- 대부분의 OS 커널을 불러올 수 있으며, 인자를 넘겨 주는 것도 가능
- GRUB (GNU GRUB)
- GNU 프로젝트의 부트로더
- 현재 대부분의 배포판에서 부트로더로 사용되고 있다.
- 부팅과정
- 바이오스가 부팅장치를 찾고 MBR을 읽어 온다.
- MBR에 GRUB 스테이지 1이 있으며, 이는 스테이지 2를 불러 온다.
- GRUB 스테이지 2는 부트 메뉴나 명령 프롬프트를 보여준다.
- 기본값 커널이나 사용자가 선택한 커널을 로드한다.
- BLOB (Boot Loader OBject)
- 임베디드 리눅스 상에서 LILO와 같이 선택 부팅이 가능하도록 기능을 제공
- 일반 부트로더가 MBR에서 동작하며 운영체제를 실행할 수 있는 기능을 수행한다면 BLOB는 플래시 메모리 0블록 위치에서 작동
- U-BOOT
- Universal Bootloader의 약자로 PPC와 ARM에 기반을 둔 임베디드용 부트로더
- PPC, ARM, MIPS, SH, x86 등 다양한 CPU를 지원하며, 오픈 소스
- 실행 흐름
- 어셈블리어로 되어 있는 StartUp 코드를 실행
- SDRAM으로 Relocation, start_armboot()를 호출.(cpu/pxa/start.S)
- C 코드로 되어 있는 start_armboot()를 실행 ⇒ Flash 메모리, 네트워크, Console을 초기화 (lib_arm/board.c)
- main_loop() 명령어를 처리(common/main.c)
- Linux_Booting 리눅스 부팅을 한다. (커널의 헤더를 읽어 압축을 풀고 리눅스로 제어권을 넘김)(lib_arm/armlinux.c)
- ARMBOOT
- StrongARM을 위한 공개 소스 펌웨어로 현존하는 부트로더 중 RedBoot의 뒤를 이어 가장 강력한 기능을 제공
- 다중형 Flash 메모리 지원, bootp/dhcp/tftp를 사용한 부트, PCMCIA CF 부트 등을 지원
- RedBoot
- RedHat에서 개발한 임베디드 운영체제인 eCOS 일부를 사용해 만든 프로그램
- RedBoot는 eCOS 하드웨어 추상화 계층 위에서 동작
출처
https://sedangdang.tistory.com/175
https://heeyamsec.tistory.com/19
https://thinkpro.tistory.com/14
http://wildpup.cafe24.com/archives/189
https://jess2.tistory.com/72
https://ehpub.co.kr/tag/pcprogram-counter/
https://throwexception.tistory.com/97
https://didu-story.tistory.com/311