커널 | 커널 빌딩 시스템

  • 스케줄러, 파일시스템, 메모리 관리자, 네트워크 시스템 등의 수많은 서브 시스템들로 이우러진 커널은 빌딩(building)과정을 통해 zImage(bzImage)라는 부팅 가능한 단일 바이너리 파일로 만들어짐.

커널 빌딩 과정


  • 커널 초기화
    • make distclean, mrproper
  • 커널 설정
    • kbuild
    • make menuconfig, gconfig, xconfig
  • 커널 빌딩
    • kconfig
    • make all, zImage, modules
  • 커널 설치
    • make install, modules_install

커널 초기화


  • tar.gz로 압축된 커널 소스를 압축 해제하면 커널 소스 트리 생성 -> 커널 초기 상태
  • maeke distclean, mrproper 명령어로 초기 상태로 되돌 릴 수 있음
  • mrproper: “.config” 파일을 비롯하여 커널 컴파일 및 링킹을 위해 생성된 여러 가지 설정 파일들만을 지우도록 함
  • distclean: mrproper 명령을 수행하고, 추가로 커널 컴파일 후 생성된 모든 오브젝트 파일, 백업 파일 등 삭제
  • 커널 설정
  • 자신의 시스템에 맞는 커널 요소들을 적절히 선택 함
  • Makefile에서는 xconfig(QT 기반), menuconfig, gconfig(GTK 기반) 타킷 사용
    • script/kconfig/Makefile 에서 타깃 확인
  • arch/$(ARCH)/configs 디렉토리에 각 SoC에 맞게 미리 설정된 설정 파일 존재
    • make xxx_defconfig 명령어를 통해 make menuconfig를 통해 수동으로 설정해야하는 설정들을 자동으로 설정
      • 결과로 자신만의 커널을 구성학디 위해 필요한 커널 설정 목록인 “.config” 생성
      • “.config” : CONFIG_XXX라는 변수 값에 y,n,m 3개 상태로 설정된 목록으로 이러한 형태의 커널 설정 시스템을 kconfig라 함
        • y: 해당 바이너리가 vmlinux에 함께 링킹
        • m: vmlinux와는 링킹이 이루어지지 않지만 모듈로서 컴파일 됨

커널 빌딩


  • kconfig를 이용한 커널 설정이 모두 완료되어 “.config”파일이 준비 되면 커널 빌딩 시작할 수 있음
  • 커널 빌딩이란 커널을 컴파일 하고 바이너리들을 링킹하여 단일 바이너리 파일인 zImage를 생성하는 일련의 과정을 말함
  • vmliunux := head.o init.o init/ kernel/ mm/ fs/ ipc/ security/ crypto/ block/ usr/ lib/ drivers/ sound/ firmware/ net
    • 위의 순서대로 링킹 되며 이를 통해서 vmlinux 바이너리 이미지 생성
  • vmlinux: 사용자가 정의한 모든 커널 컴포넌트들을 갖추고 있는 순수 커널 바이너리
    • 바이너리 파일만으로는 시스템 구동 불가
    • 리눅스 커널 이미지를 메모리에 로드하여 실행 가능한 상태로 만들기 위해서는 부트스트랩 로더의 도움이 필요
    • 커널 빌드 시스템은 ELF형식의 vmlinux를 objcopy를 통하여 불필요한 색션들을 제거하고 압축하여 부트스트랩 로더와 링킹을 통해서 부팅 가능한 최종 바이너리인 zImage를 생성해 냄
      • 컴파일 된 커널은 첫 결과물로 vmlinux라는 ELF 형식의 바이너리 생성
        • 리눅스 소스 트리내의 모든 오브젝트 코드들로 이루어진 순수 커널 바이너리
      • vmlinux는 gzip에 의해 piggy.o로 압축되고 head.o, misc.o와 함께 링킹되어 최종적으로 zImage 바이너리 생성
        • head.o와 misc.o는 부트 스트랩 로더에 해당하여 압축된 vmlinux(piggy.o)를 메모리에 적재하고 압축을 풀어주는 작업을 수행 하는 코드
      • 이렇게 압축된 zImage를 통해 커널 메모리 적재 및 실행 빠르게 진행
    • 이러한 과정은 arch/arm/Makefile을 통해 이루어짐

커널 설치


  • 위의 과정을 거쳐 생성된 커널 이미지를 적절한 곳에 위치시키기 위해 install.sh를 통해 $(INSTALL_PATH)에 해당하는 경로에 커널 이미지를 옮기는 일 수행
Share