안녕하세요? 허니데이즈입니다. 오늘은 퓨시아 운영체제의 기반이 되는 지르콘 커널 개발 환경을 만드는 방법에 대해 알아 보도록 하겠습니다.



 지르콘 소스코드는 어디에서 다운로드 받나요?

퓨시아 운영체제 소스에는 지르콘 커널 소스가 포함되어 있다. 때문에 퓨시아 문서를 참조하면 된다. 단, 지르콘 커널만 작업하려면 한다면 다음과 같이 실행하면 된다.
The Zircon Git repository: https://fuchsia.googlesource.com/zircon

만약, 본인의 환경에서 $SRC 변수를 설정하였다면 다음과 같이 클론을 활용하면 된다.

 git clone https : //fuchsia.googlesource.com/zircon $ SRC/zircon


지르콘이 $SRC/zircon에서 체크아웃되고 툴체인, QEMU 등을 빌드하는 환경을 가정한다. 다양한 make 호출은 병렬 make를 위한 "-j32" 옵션과 함께 제공된다. 본인의 컴퓨터 사양에 따라 -j16 또는 -j8을 시도해 봐도 좋다.

 

 빌드 환경은 어떻게 하나요?

우분투를 사용하는 유저라면 다음과 같이 사전에 필수적으로 설치해야 하는 사항이 있다.

 sudo apt-get install texinfo libglib2.0-dev autoconf libtool bison libsdl-dev build-essential

 

macOS 의 경우는 다음의 순서를 따른다.

1. Xcode 명령어 도구 설치

 xcode-select --install


2. 필수적으로 설치해야 하는 사전 준비사항은 다음과 같다.

 - Homebrew를 사용한다면,

 brew install wget pkg-config glib autoconf automake libtool

 - MacPorts 사용한다면,

 port install autoconf automake libtool libpixman pkgconfig glib2

 

 툴체인 설치는 어떻게 하나요?

Linux나 MacOS에서 개발중인 경우, 사전 작성된 툴체인 바이너리가 사용 가능하다. 지르콘 디렉토리에서 다음과 같이 스크립트를 실행하면 된다.

 ./scripts/download-prebuilt

 툴체인이 무엇인가요? 주로 다른 컴퓨터 또는 시스템의 소프트웨어 제품을 만드는데 사용되는 컴퓨터 프로그램 개발 도구들의 집합이다. 일반적으로 여기에 포함된 개발 도구들은 연쇄적으로 사용된다. 즉, 어느 한 개발 도구의 출력은 다른 개발 도구의 입력이 된다. 그러나 이 용어는 서로 관련 있는 개발 도구들의 집합을 가리키는 의미로도 널리 사용된다. 간단한 툴체인은 소스 코드 편집을 위한 문서 편집기와 소스 코드를 실행 프로그램으로 변환하는 컴파일러와 링커, 그리고 운영 체제의 기능을 제공하는 라이브러리로 구성된다. 비디오 게임과 같은 복잡한 제품에서는 소리 효과와 음악, 텍스처, 3차원 모델, 애니메이션 등을 위한 개발 도구가 필요하며, 이를 한데 모아 완성된 제품으로 만드는 개발 도구도 있어야 한다.

 지르콘 커널 빌드는 어떻게 하나요?
빌드 결과는 $SRC/zircon/build-{arm64,x64} 에 생성이 되며 아래 예제의 $BUILDDIR 변수는 해당 빌드의 빌드 출력 디렉토리를 나타낸다.

 cd $SRC/zircon

 

 # for aarch64
 make -j32 arm64

 

# for x64
 make -j32 x64

Clang를 활용하여 지르콘 빌드는 어떻게? Clang을 타겟 툴체인으로 사용하여 지르콘을 빌드하려면 다음과 같이 USE_CLANG=true를 Make 호출 할 때 변수 설정해야 한다.

 cd $SRC/zircon

 

 # for aarch64
 make -j32 USE_CLANG=true arm64

 

 # for x64
 make -j32 USE_CLANG=true x64

 

 모든 타겟에 지르콘을 빌드하려면?

 # The -r enables release builds as well
 ./scripts/buildall -r

모든 아키텍처에서 빌드가 작동하도록 제출하기 전에 모든 대상에 대해 빌드해야 한다.

 

 QEMU란?
실제 하드웨어에서 테스트하는 경우에는 필요 없지만 에뮬레이터는 빠른 로컬 테스트에 유용하며 일반적으로 사용할 가치가 있다. 지르콘과 함께 QEMU를 만들고 사용하는 방법에 대한 정보는 QEMU를 참조하면 된다.

 

 지르콘과 파일 복사하는 방법은?

로컬 링크 IPv6을 구성하면 호스트 도구 ./build-ARCH/tools/netcp를 사용하여 파일을 복사 할 수 있습니다.
유저를 위한 추가 공간 파일 포함해야 한다. 지르콘 빌드는 부팅할 시스템(장치 관리자, 일부 장치 드라이버 등)에 필요한 사용자 공간 구성요소가 들어있는 bootfs 이미지를 만든다. 커널은 QEMU나 부트로더가 램디스크 이미지로 제공하는 두 번째 bootfs 이미지를 포함 할 수 있다. bootfs 이미지를 만들려면 빌드의 일부로 생성된 zbi 도구를 사용해야 한다. 소스 디렉토리(지정된 디렉토리의 모든 파일과 서브 디렉토리가 포함되어 있음)나 include 할 파일을 파일별로 지정하는 Manifest 파일을 통해 bootfs 이미지를 어셈블 할 수 있다.

 $BUILDDIR/tools/zbi -o extra.bootfs @/path/to/directory

 

 echo "issue.txt=/etc/issue" > manifest
 echo "etc/hosts=/etc/hosts" >> manifest
 $BUILDDIR/tools/zbi -o extra.bootfs manifest

부팅 된 지르콘 시스템에서 bootfs의 파일은 /boot 아래에 표시되므로 위 예제에서 "hosts" 파일은 /boot/etc/hosts에 있다. QEMU의 경우, run-zircon-* 스크립트에 -x 옵션을 사용하여 추가 bootfs 이미지를 지정할 수 있다.

 

네트워크 부팅은 어떻게 하나요?
네트워크 부팅은 Gigaboot이나 Zirconboot의 두 가지 메커니즘을 통해 지원된다. Gigaboot는 EFI 기반 부트로더이며 zirconboot는 지르콘 시스템이 최소한의 부트로더 역할을 하도록하는 메커니즘이다.

EFI를 통해 부팅하는 시스템(예: Acer, NUC)에서 두 옵션 중 하나를 사용할 수 있다. 다른 시스템에서는 zirconboot가 네트워크 부팅을 위한 유일한 옵션 일 수 있다. Gigaboot를 통해 부팅을 시도한다면 GigaBoot20x6 부트로더는 사용하기 위해 특별한 호스트 구성이나 권한있는 액세스가 필요없는 간단한 네트워크 부팅 프로토콜(over IPV6 UDP)을 사용한다. 이는 IPV6 링크 로컬 어드레싱과 멀티 캐스트를 활용하여 부팅되는 장치가 부팅 가능성을 알리고 호스트가 이를 찾도록하고 시스템 이미지를 시스템에 보내도록 허용한다. GigaBoot20x6을 실행하는 장치(예: Broadwell이나 Skylake Intel NUC)가 있는 경우 먼저 스크립트를 사용하여 수동으로 USB 드라이브를 만들거나 (Linux 전용) 만들면 된다.

 $BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin

 

 # if you have an extra bootfs image (see above):
 $BUILDDIR/tools/bootserver $BUILDDIR/zircon.bin /path/to/extra.bootfs

기본적으로 bootserver는 계속 실행되며 netboot 비컨을 볼 때마다 커널(이나 제공된 bootfs)을 해당 장치로 보낸다. -1 옵션을 전달하면 부트 성공 후 부트 서버가 종료된다.

Zirconboot를 통해 부팅을 시도한다면 Zirconboot는 지르콘 시스템이 지르콘 자체의 부트로더 역할을 하도록 해야 한다. Zirconboot는 위에서 설명한 Gigaboot와 동일한 부팅 프로토콜을 사용한다. zirconboot를 사용하려면 netsvc.netboot=true 커널 명령어를 통해 인수를 지르콘에 전달해야 한다. Zirconboot가 시작되면 연결된 호스트에서 실행중인 부트 서버에서 지르콘 시스템으로 패치하고 부트합니다.

 

 네트워크 로그 보는 방법은?
지르콘의 기본 빌드에는 링크 로컬 IPv6 UDP를 통해 시스템 로그를 멀티캐스트하는 네트워크 로그 서비스가 포함되어 있다. 이는 빠르게 프로토콜의 상태를 알 수 있다. 현재 -N 플래그가 있는 QEMU에서 지르콘을 실행 중이거나 지원 가능한 이더넷 인터페이스(ASIX USB Dongle이나 NUC의 Intel Ehternet)가 있는 하드웨어에서 실행중인 경우 loglistener 도구는 로컬 링크를 통해 브로드캐스트된 로그를 모니터링 한다.

 $ BUILDDIR/tools/loglistener

 

출처: https://fuchsia.googlesource.com/zircon/+/master/docs/getting_started.md

 

 

지르콘 커널에 대해 더 알고 싶으시다면 아래 목차에서 클릭! 

지르콘 커널이란?

Zircon

지르콘 커널 개발 환경 구축하기

Getting Started

지르콘 커널 개발에 기여하는 방법

Contributing Patches

지르콘 커널의 개념 알기

Concepts Overview

지르콘 커널 구성요소(Kernel Objects)는?

Kernel Objects

지르콘 커널에서 사용되는 프로세스(Process)란?

Process Objects

지르콘 커널에서 사용되는 쓰레드(Thread)란?

Thread Objects

지르콘 커널에서 사용되는 핸들(Handles)이란?

Handles

지르콘 커널의 시스템콜하는 방식은?

System Calls

지르콘 커널의 드라이버 개발 키트 사용하는 방법 - 장치 모델

Driver Development Kit

지르콘 커널의 드라이버 개발 키트 사용하는 방법 - 장치 프로토콜

지르콘 커널의 드라이버 개발 키트 사용하는 방법 - 지르콘 드라이버 개발

지르콘 커널의 드라이버 개발 키트 사용하는 방법 - 플랫폼 버스

지르콘 커널의 드라이버 개발 키트 사용하는 방법 - 장치 펌웨어

지르콘 커널을 시험하는 방법은?

Testing

지르콘 커널의 취약점은 무엇일까?

Hacking notes

지르콘 커널의 메모리와 자원 사용은 어떻게 할까?

Memory usage analysis tools

지르콘 커널과 LK(Little Kernel)의 관계는?

Relationship with LK

지르콘 커널을 위한 마이크로 벤츠마크는? 

Micro-benchmarks


+ Recent posts