카테고리 없음

1. OS 부팅

초코chip 2024. 7. 8. 17:22

배경

  • OS 프로그램은 HDD에 저장되어 있음
  • 전원이 꺼지면 CPU와 MM의 내용이 전부 사라짐(휘발성)

-> 전원이 켜졌을 때, OS 프로그램을 MM에 load해야할 필요가 있음

 

하지만, 아래 문제가 존재

  • 처음 전원이 켜지면 PC=0, AR=0 -> IR = M[AR]을 해야하는데 메인 메모리는 휘발성이라 0번지에 아무것도 없음
  • 그러면 어떻게 부팅을 할까?

 

메모리 분리

메모리 0번지에 내용이 사라지지 않게, 메모리 영역을 분리해서 관리

  • 상위 영역(0~1024 - 1): Boot ROM(Read Only Memory)
    • ROM은 전원이 꺼져도 데이터가 사라지지 않음
  • 하위 영역(1024~2^31-1): DRAM(Random Access Memory)

 

 

Boot ROM with 부트 로더

  • 정의: 부팅 관련 작업을 하는 부트 스트랩 프로그램(부트 로더)가 저장되어 있는 공간
    • 부트 로더는 제조사에서 만드는 SW
  • 부트 로더 동작 방식
    1. 전원을 키면 부트 로더 실행 ( PC = 0, AR = 0 -> IR = M[AR] )
    2. 컴퓨터 하드웨어 시스템 초기화
      • cpu 레지스터, device controller...
    3. OS프로그램 load
      • HDD에서 OS 프로그램이 저장된 위치를 찾음
      • DRAM의 빈 공간에 OS프로그램 load
      • 전원이 꺼져 있기에 빈 공간의 첫 주소는 1024
      • PC값을 OS의 첫 주소값으로 세팅 ( PC = 1024 )
  • p.s) 왜 하드웨어 초기화를 OS가 아닌 부트로더가 진행하는가?
    • 하나의 컴퓨터에는 매우 다양한 종류의 하드웨어가 존재
    • 각 하드웨어 종류마다 검사방법과 초기화 방법이 다름
    • OS 제조사는 어떤 하드웨어가 사용되었는지 모르기에 모든 초기화 방법에 대한 코드를 작성 -> OS 용량이 비효율적
    • 컴퓨터 제조사에서는 어떤 부품을 사용했는지 알기에 그냥 제조사에서 ROM에 하드웨어 초기화 코드를 넣는것이 효율적

 

OS부팅

  • 부트로더가 종료되면, OS 프로그램이 실행됨( PC = 1024 )
  • OS 부팅의 끝은 아래 2개의 프로세스가 실행되는 것
    • pid = 0 - 스케줄러(swapper()): 여러 프로세스의 실행 순서를 결정
    • pid = 1 - init(): 프로세스를 생성 실행하여 실행
  • 이후, 특정 사건(인터럽트)가 발생한다면
    • interrupt가 발생
    • fork() 시스템콜이 호출
    • pthread_create() 시스템콜이 호출