DTB는 Device Tree Blob (Flat Device Tree)의 약자로 리눅스 포팅(+ U-Boot)에서 여러가지 힘든점 중 하나이다.
DTB는 하나의 데이터베이스(Database)입니다. 이는, 주어진 보드를 대표하는 하드웨어 컴포넌트들입니다. DTB는 IBM OpenFirmware specifications로 부터 왔으며 부트로더에서 커널로 low-level hardware information을 전달시키는 기본 메커니즘으로 선택되었습니다.
DTB를 위한 제일의 요구사항은 U-Boot는 U-Boot안에 헤더 파일로부터 온 커널안의 유사한 헤더 파일과 확실하게 일치하는 보드의 정보 구조체를 커널로 넘겨줘야한다는 것 입니다.
이것은 sync 안에 유지하기하 굉장히 어렵고 잘 변환되지 않습니다. 이것이 flat device tree를 부트로더에서 온 low-level 하드웨어 정보들을 커널로 보내는 하나의 메소드 같이 포함시키는 동기가 되었습니다.
U-Boot나 다른 low-level 펌웨어와 유사하게, DTB를 마스터 하는것에는 하드웨어 단의 완전한 지식이 필요합니다. 인터넷 검색을 통해서 몇개의 device tree에 대해 소개하는 문서들을 찾을 수 있습니다. 정말 좋은 시작 방법은 Denx Software Engineering wiki page를 보는 것입니다. 레퍼런스들은 이 글 아래에 링크되어 있습니다.
시작하기 위해, DTB가 통상의 부트 과정에서 어떻게 사용되는지 보도록 하겠습니다.
아래의 박스는 U-Boot를 이용하는 Porwe Architechture 타겟의 부트 과정을 보여주고 있습니다.
▶ U-Boot에서의 Device Tree Blob과 리눅스를 부팅하는 과정
=> tftp $loadaddr 8548/uImage
Speed: 1000, full duplex
Using eTSEC0 device
TFTP from server 192.168.11.103; our IP address is 192.168.11.18
ㄴ. CMake의 사용법을 알아보자. (Let's learn how to use CMake.)
ㄷ. U-Boot에 lthor를 패치해보자.(Patch lthor to Odroid U-Boot.)
2. 본론
ㄱ. CMake란 무엇인가??(What is CMake?)
a. CMake(Cross Platform Make)는 멀티 플랫폼으로 사용할 수 있는 Make의 대용품을 만들기 위한 오픈소스 프로젝트로 키트웨어와 인사이트 콘솔티엄에서 만들었다. 스스로 기존의 Make의 과정을 수행하지는 않고 지정한 운영체제에 맞는 Make 파일(마이크로소프트 윈도에서는 솔루션 파일)의 생성만을 수행하기 때문에 Meta Make라고도 불린다. ※ 가장 큰 이점은 유닉스 계열의 OS 중심이던 기존의 Make와 달리 한번 작성해 두면 유닉스 계열은 물론, 윈도 계열의 프로그래밍 도구도 지원한다.
여기서 여러 빌드 도구를 살펴보자면
- GNU build system(주로 autotools라고 부름 / 소스 코드 패키지를 수많은 유닉스 계열 운영 체제로 포팅할 수 있게 도와 주는 프로그래밍 도구 제품군이다. / 위키 링크)
- Waf(콘피규어링을 위한 파이선 기반의 프레임워크로 어플리케이션의 컴파일과 인스톨을 수행한다. / Waf is a Python-based framework for configuring, compiling and installing applications. Here are perhaps the most important features of Waf / 와프 링크)
- SCons[오픈 소스 소프트웨어 빌드 도구. SCons는 autoconf/automake의 기능과 ccache(ccache는 사용자 디렉토리에 .ccache라는 폴더를 생성하여 object 파일을 해싱하여 저장 - preprocessor를 거친 소스코드를 해슁하여 해당 키와 겹치는 object코드가 있으면 컴파일 하지 않고 해당 object를 그냥 반환함.) 와 같은 컴파일러 캐시를 통합한, 고전적인 Make 유틸리티의 대체품이다. 이전의 도구들과 비교하여, SCons는 더 쓰기 쉽고, 더 신뢰할 수 있고, 더 빠른 것을 목표로 한다. / 위키 링크]
init.d/ 디렉토리에는 서비스를 제어할 때 /sbin/init 명령에 의해 사용되는 스크립트가 들어 있습니다. 번호 매겨진 각 디렉토리는 Red Hat Enterprise Linux에서 기본값으로 설정된 6개의 런레벨을 나타냅니다.
- 런레벨
SysV init 런레벨은 다른 시스템은 다른 방식으로 사용될 수 있다는 개념을 바탕으로 하고 있습니다. 예를 들어, 서버는 X 윈도우 시스템에 자원을 빼앗기지 않으면 보다 효과적으로 실행될 수 있습니다. 또한, 디스크 오류를 수정할 때와 같이 시스템 관리자가 진단 업무를 수행하기 위해 시스템을 더 낮은 런레벨에서 실행할필요가 있는 경우가 있을 것입니다.
주어진 런레벨의 특성은 init을 사용하여 중지시켜야 할 서비스와 시작해야 할 서비스를 결정합니다 예를 들어, 런레벨 1 (단독 사용자 모드)에서는 모든 네트워크 서비스가 중지되는 반면, 런레벨 3에서는 이러한 서비스를 시작합니다. 주어진 런레벨에서 중지하거나 시작할 서비스를 지정함으로서 init은 사용자가 일일히 서비스를 중지하거나 시작하지 않고 컴퓨터의 모드를 빠르게 변경할 수 있습니다.
다음은 Red Hat Enterprise Linux에서 기본값으로 지정된 런레벨 예시입니다:
0 - 정지
1 - 단독 사용자 텍스트 모드
2 - 사용되지 않음 (사용자 정의 가능)
3 - 완전 다중 - 사용자 텍스트 모드
4 - 사용되지 않음 (사용자 정의 가능)
5 - (X-기반 로그인 화면을 사용한) 완전 다중 - 사용자 그래픽 모드
6 - 재부팅
일반적으로, 사용자는 런레벨 3이나 5에서 리눅스를 실행함 - 둘 다 완전한 다중 사용자 모드이기 때문.
런레벨 2와 5를 특별한 필요에 따라 사용자 정의하기도 함 - 이 둘은 사용되지 않기 때문에.
시스템에 대한 디폴트 런레벨은 /etc/inittab에 열거되어 있다. 시스템에 해당하는 디폴트 런레벨을 찾으려면, /etc/inittab의 하단 부분에서 다음과 유사한 행을 찾아보면 된다.
id:5:inidefault:
이 예시에서 열거된 리폴트 런레벨은 5로 첫번째 콜론 이후에 있는 숫자이다. 이를 변경하려면 루트로 /etc/initab을 수정합니다.
※ /etc/inittab을 편집할 때 잘못할 경우 시스템이 부팅되지 않을 수 있다.
4. 다음으로, init 명령은 시스템에 대한 소스 기능 라이브러리 /etc/rc.d/init.d/functions를 설정하여, 프로그램의 시작, 종료, PID 결정 방법을 설정합니다.
init 프로그램은 /etc/inittab에서 기본값으로 지정된 런레벨에 대한 올바른 rc 디렉토리에 따라 모든 백그라운드 프로세스를 시작합니다. rc 디렉토리는 제시된 런레벨에 상응하는 숫자로 번호가 매겨집니다. 예를 들어, /etc/rc.d/rc5.d/는 런레벨 5에 대한 디렉토리입니다.
런레벨 5로 부팅할 때, init 프로그램은 /etc/rc.d/rc5.d/ 디렉토리를 보고 시작 및 중지할 프로세스를 결정합니다.
위 목록처럼, 실제 서비스를 시작하고 중지하는 어떤 스크립트도 /etc/rc.d/rc5.d/ 디렉토리에 위치하고 있지 않습니다. 대신, /etc/rc.d/rc5.d/에 있는 모든 파일은 /etc/rc.d/init.d/ 디렌토리에 위치한 스크립트에 대한 심볼릭 링크합니다. 심볼릭 링크는 각각의 rc 디렉토리에 사용되며, 원래의 스크립트에는 영향을 미치지 않고 심볼릭 링크를 생성, 수정, 삭제하는 것으로 런레벨을 재설정할 수 있습니다.
여기서 각 심볼릭 링크 앞에는 S나 K가 붙게 되는데 K는 런레벨에서 종료시켜야 할 프로세스, S는 런레벨에서 시작되는 프로세스 입니다.
init 명령은 디렉토리에 있는 모든 K 심볼릭 링크를 /etc/rc.d/init.d/<comment> stop 명령을 내려서 중단합니다. 여기서 <command>는 중단될 프로세스를 말합니다. 그 후, 모든 S 심볼릭 링크를 /etc/rc.d/init.d/<command> start 명령을 내려서 시작합니다.
각 심볼릭 링크에는 시작순서 지정을 위한 번호가 매겨집니다. 서비스의 시작 또는 중지의 순서는 이러한 번호를 바꾸어 변경될 수 있습니다. 낮은 번호가 우선으로 시작되며 같은 번호의 링크는 알파벳 순으로 시작됩니다.
init 명령이 런레벨에 따라 적절한 rc 디렉토리를 처리한 후, Upstart는 /sbin/mingetty 프로세스를 /etc/event.d 디렉토리의 작업 정의에 따라 런레벨에 할당된 각각의 가상 콘솔(로그인 프롬프트)에 대해 실행합니다. 런레벨 2부터 5까지는 모두 6개의 가상 콘솔을 가지며, 런레벨 1(단일 사용자 모드)은 하나만을 가지며, 런 레벨 0과 6은 가상 콘솔이 없습니다. /sbin/migetty 프로세스는 tty 장치에 대한 통신 경로를 열고, 그 장치의 모드를 설정, 로그인 프롬프트를 표시한 후, 사용자의 사용자명과 암호를 입력받아 로그인 과정을 진행합니다.
런레벨 5에서 Upstart는 /etc/X11/prefdm라는 스크립트를 실행합니다. prefdm 스크립트는 지정된 X 디스플레이 관리자 - 이는 /etc/sysconfig/desktop의 내용에 따라 dfm, kdm, xdm 등이 될 수 있습니다.