U-boot(1) : Booting & Boot Loader

황승우·2023년 5월 1일
0

목차

컴퓨터 부팅 과정

  • 부팅이란 ⇒ 컴퓨터에 전원을 켰을 때 운영체제를 메모리에 올리는 과정

레지스터 = CPU 내에서 데이터를 기억하는 메모리 장치 / 처리할 명령어나 연산에 사용할 값이나 연산 결과를 일시적으로 기억하는 장치
PC = 다음 번에 실행할 명령어 주소를 기억하는 레지스터

  1. 컴퓨터에 전원이 들어오면 ROM이 동작을 시작한다.
  • ROM에 저장된 BIOS(Basic Input/Output System) 시동 프로그램이 컴퓨터에 연결된 각종 하드웨어를 점검한다.
  • 이를 POST(Power-on Self-test) 라고 한다.
  1. POST 점검에 이상이 없으면, 하드디스크의 마스터 부트 레코드(MBR)에 저장된 부트스트랩 로더(부트로더)를 메모리에 로딩한다.
  • MBR은 운영체제가 어디에 저장되어있는지를 나타내며, 하드디스크의 첫번째 섹터에 위치하고 있다.

  • BIOS가 연결된 저장매체를 설정된 부팅 순서대로 돌면서 MBR에 저장된 부트로더를 탐색한다

  • 부트로더 탐색에 성공하면 BIOS는 부트로더 프로그램을 메모리에(0x00007c00) 올린다.

    • IBM 사가 메모리의 0x00007c00 ~ 0x00007dff 번지(크기 512바이트) 를 부트 섹터가 읽혀지는 어드레스로 지정했기 때문

    • 메모리에 올리는 이유?

      • 프로그램 실행 과정에 대한 이해가 필요.

      • 프로그램의 실행 단계

        1. 실행 파일의  생성

          • 링커 : 실행 가능한 로드 모듈을 만드는 시스템 소프트웨어
        2. 프로그램 실행 과정

  1. 메모리에 올라온 부트로더가 운영체제 프로세스를 실행한다.
  • 메모리에 올라온 1차 부트로더(MBR)가 2차 부트로더(BOOTMGR)을 메모리에 올려 운영체제를 실행시킨다
  • 1차, 2차 부트로더가 나뉘어져 있는 이유는 용량 때문
    • MBR/VBR의 최대 용량은 512바이트 뿐이므로 도스 같은 운영체제 정도에는 적합했지만 윈도우 같은 복잡한 운영체제의 커널을 로드 할 준비를 하기에는 부족
    • 2차 부트로더를 1차 부트로더를 통해 커널을 로드하듯이 로드한 뒤, 2차 부트로더를 통해 커널을 로드하는 방식

부트로더란?

  • 운영체제(이하 OS)가 시동되기 이전에 미리 실행되면서 커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 운영 체제를 시동시키기 위한 목적을 가진 프로그램

  • 커널을 시동하기 위한 관련 작업들이란?

    • 메모리 초기화
    • 하드웨어 초기화
      • 직렬포트의 초기화
      • 네트워크초기화
      • 프로세서 속도, 인터럽트의 초기화
    • 커널과 램 디스크 적재: 커널과 램 디스크를 램에 적재하여 실행
    • 사용자 인터페이스 기능
  • 커널

    커널이란?

    • 컴퓨터 자원을 관리하는 운영체제의 핵심 부분
    • 인터페이스로써 응용 프로그램 수행에 필요한 여러가지 서비스를 제공하고, 여러가지 하드웨어(CPU, 메모리) 등의 리소스를 관리하는 역할

부트 로더 위치

  • 저장 매체의 가장 앞 부분에 존재
  • 하드디스크의 첫 번째 부팅 섹터(부트 섹터)인 MBR(Master Boot Record)에 위치하고 있어, 시스템 부팅 시 MBR에 있는 부트로더를 읽어 들여 운영체제가 부팅이 가능하게 만든다.
  • 부트 섹터 = 디스크의 다른 부분에 저장되는 부팅 프로그램을 담을 수 있는 하드 디스크, 플로피 디스크, 또는 비슷한 기억 장치의 첫 섹터
    • 부트 섹터의 마지막 2바이트에는 "0x55AA"라는 값이 있어야 한다.
    • 이 값은 '이 디스크에 부트에 필요한 프로그램이 있다'는 것을 의미
    • "0x55AA"가 확인되지 않으면 부팅 할 수 없다는 에러가 발생
    • "0x55AA"가 확인된 후에는, 이 섹터의 선두부터 프로그램이 써 있을 것이라 판단하여 해당 위치부터 프로그래 실행

부트로더 파일 구성

  1. 소스파일
    • 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
  2. 헤더 파일
    • 각 소스파일에서 사용하는 변수나 매크로들을 정의한 파일
    • ld-xsacle : 링커 스크립트 파일(컴파일된 프로그램의 링크 방법)
    • config.h : 부트로더 환경설정파일
  3. 부트로더 환경설정 파일
    • 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

profile
백엔드 개발자

0개의 댓글