■ DTB[[Device Tree Blob (Flat Device Tree)]란 무엇인가??

 리눅스 부팅 과정을 공부하면서 tizen은 dtb를 이용한 부팅을 한다는 것을 보게되었습니다.

이는 BOOT파티션에 zImage나 uImage와 같이 부팅에 사용되게 되는데요.

 지금부터 포스팅 하는 지식은 다음의 informIT 의 글을 보며 작성하도록 하겠습니다.


 ■ 그렇다면 DTB는? 

 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

 Filename '8548/uImage'. Load address: 0x600000 Loading: ##################################################### 

                                                                                    #####################################################

 done

 Bytes transferred = 1838553 (1c0dd9 hex)

 => tftp $fdtaddr 8548/dtb

 Speed: 1000, full duplex

 Using eTSEC0 device

 TFTP from server 192.168.11.103; our IP address is 192.168.11.18

 Filename '8548/dtb'.

 Load address: 0xc00000

 Loading: ## done Bytes transferred = 16384 (4000 hex)

 => bootm $loadaddr - $fdtaddr

 ## Booting kernel from Legacy Image at 00600000 ...

 Image Name: MontaVista Linux 6/2.6.27/freesc

 Image Type: PowerPC Linux Kernel Image (gzip compressed)

 Data Size: 1838489 Bytes = 1.8 MB

 Load Address: 00000000

 Entry Point: 00000000

 Verifying Checksum ... OK

 ## Flattened Device Tree blob at 00c00000

 Booting using the fdt blob at 0xc00000

 Uncompressing Kernel Image ... OK

 Loading Device Tree to 007f9000, end 007fffff ... OK

 <... Linux begins booting here...>

 ...and away we go!!




※ 내용은 지속 작성중이며 추가하는 상태입니다.




Posted by 시크한공돌이
,

1. 목적

ㄱ. CMake가 무엇인지 알아보자.(Learn What is CMake.)

ㄴ. 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는 더 쓰기 쉽고, 더 신뢰할 수 있고, 더 빠른 것을 목표로 한다. / 위키 링크]

b. CMake도 위와 유사한 빌드 도구 중 하나입니다.

 CMake는 여러가지 이점이 있습니다. 

 예를 들자면 KDE(다양한 운영체제에서 구동 가능한 프로그램들을 제작하는 다국적 자유 소프트웨어 커뮤니티)SCons 에서 CMake로 빌드 툴을 변경했는데 그 이유를 다음과 같이 서술 하고 있습니다.

- 이점(Pros / advantages)

1. CMake는 KDE의 빌드에 없었던 여러가지 향상된 부분들을 제공한다.

2. 이것은 마치 프레임워크처럼 완전한 작업 설정을 지원한다, 이로써 쓰기가 쉽다.

3. 나(Peter Linnell)는 대부분의 kdelibs(The KDE Library API Reference / KDE3)를 관리했다.

4. CMake는 C++ 컴파일러를 제외하고 다른 위존성이 없다.

5. CMake는 기본적인 모든 UNIX, MS Windows(MSVS, Borland, cygwin, mingw)와 Mac OS X를 지원한다.

6. CMake는 KDevelop3, MSVC 6, 7, XCode를 위한 Makefile들과 프로젝트들을 생성할 수 있다.

7. CMake는 단순한 구문을 가지고 있다.

8. 이것은 테스팅 프레임워크의 특징들이다.

9.  이것은 compiling libs, apps, KDE kparts, KDE ioslaves, KDE loadable modules, -enable-final, la-file generation을 지원한다.

10. Makefile을 CMake 파일로 90변환을 지원하는 루비 스크립트로 작성된 am2cmake가 있다.


- 단점(Cons / disadvantages)

1. 파일 설치 작업을 위한 CMake 커맨드는 강력하지 않다, 하지만 KDE를 지원하기 위해 고쳐질 수 있다는 것을 개발자들은 안다.

2. 설치중에 relinking이 확실하지 않다.

3. 진행 상황 %가 나오지 않는다 : 이것은 CMake에선 완성될 수 없다, CMake는 자체로 빌드 시스템이 아니기 때문, 이것은 단지 native buildsystem을 위한 입력 파일들을 생성한다.


c. 이런 장단점으로 인해서 CMake를 사용한다고 합니다.


3. 결론

ㄱ. CMake는 멀티 플랫폼을 위한 빌드 지원 시스템이며 사용이 쉽고 관리하기 편하다.


- 참고 사항 

http://lwn.net/Articles/188693/

http://bunhere.tistory.com/256

http://ko.wikipedia.org/wiki/KDE

http://en.wikipedia.org/wiki/Decision_making

http://ko.wikipedia.org/wiki/CMake





Posted by 시크한공돌이
,





1. 서론

ㄱ. 리눅스 시스템 부팅 중 데몬 관리용 스크립트들과 배포본별로 제공하는 런레벨 관리자를(/sbin/init, /etc/init.d, /etc/rc*.d) 사용하지 않는 systemd 방식의 기본 init 시스템을 알아보자


2. 본론

ㄱ. 커널의 로딩과정을 살펴보면

1. 커널이 로드되고 나면, 메모리, 프로세서, I/O 등 여러 하드웨어를 초기화하고 설정한다.


2. 압축된 initramfs 이미지를 메모리의 미리 정해진 위치(SD카드 eMMC 등)로부터 읽어서, /sysroot/에 직접 풀고, 모든 필요한 드라이버를 로드함.

- 이는 LVM이나 소프트웨어 RAID와 같은 파일 시스템과 관련된 가상 장치를 초기화함.


3. 그 후, initramfs 프로세스를 마무리하고, 디스크 이미지가 차지했던 메모리를 모두 해제함.

그 뒤 커널은 루트 장치를 생성하여 읽기 전용으로 루트 파티션을 마운트하고 사용되지 않는 메모리를 해제함.

 - 이 시점에서, 커널은 메모리에 로드되어 작동가능하게 되지만, 시스템에 입력을 허용하는 사용자 응용 프로그램이 존재하지 않아 이러한 시스템을 사용하여 할 수 있는 작업은 많지 않음.

 사용자 환경을 설정하기 위해, 커널은 /sbin/init 프로그램을 실행함.


ㄴ. /sbin/init 프로그램

1. /sbin/init 프로그램(init 라고도 부름)은 나머지 부트 프로세스를 주관하며 사용자를 위한 환경을 설정합니다.


2. init 명령어를 시작할 때, 이는 시스템에서 자동으로 시작하는 모든 프로세스의 부모(0번 프로세스) 또는 조부모가 됩니다.

a. 먼저 /etc/rc.d/rc.sysinit 스크립트를 실행하여 환경 경로, 스왑 시작, 파일 시스템 확인, 시스템 초기화에 필요한 다른 단계를 실행합니다.

 예를 들어, 대부분의 시스템에서는 클럭을 사용하므로, rc.sysinit은 하드웨어 클럭을 초기화하기 위해 /etc/sysconfig/clock 설정 파일을 읽습니다.

 다른 예로, 초기화되어야 하는 특정 직렬 포트 프로세스가 있을 경우, rc.sysinit/etc/rc.serial 파일을 싱행합니다.


3. init 명령은 그 후 /etc/event.d 디렉토리에 있는 작업을 실행합니다. 이 디렉토리는 시스템이 각각의 SysV init 런레벨에 따라 어떻게 설정될지를 지정합니다.

- 런레벨은 SysV /etc/rc.d/rc<x>.d/ (여기서 <x>은 런레벨 숫자) 디렉토리에 나열된 서비스들로 정의되는 시스템의 상태 또는 모드를 말합니다.




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/ 디렉토리의 예시 목록입니다.

 

K05innd -> ../init.d/innd
K05saslauthd -> ../init.d/saslauthd
K10dc_server -> ../init.d/dc_server
K10psacct -> ../init.d/psacct
K10radiusd -> ../init.d/radiusd
K12dc_client -> ../init.d/dc_client
K12FreeWnn -> ../init.d/FreeWnn
K12mailman -> ../init.d/mailman
K12mysqld -> ../init.d/mysqld
K15httpd -> ../init.d/httpd
K20netdump-server -> ../init.d/netdump-server
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwhod -> ../init.d/rwhod
K24irda -> ../init.d/irda
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30spamassassin -> ../init.d/spamassassin
K34dhcrelay -> ../init.d/dhcrelay
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K36lisa -> ../init.d/lisa
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K46radvd -> ../init.d/radvd
K50netdump -> ../init.d/netdump
K50snmpd -> ../init.d/snmpd
K50snmptrapd -> ../init.d/snmptrapd
K50tux -> ../init.d/tux
K50vsftpd -> ../init.d/vsftpd
K54dovecot -> ../init.d/dovecot
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K70aep1000 -> ../init.d/aep1000
K70bcm5820 -> ../init.d/bcm5820
K74ypserv -> ../init.d/ypserv
K74ypxfrd -> ../init.d/ypxfrd
K85mdmpd -> ../init.d/mdmpd
K89netplugd -> ../init.d/netplugd
K99microcode_ctl -> ../init.d/microcode_ctl
S04readahead_early -> ../init.d/readahead_early
S05kudzu -> ../init.d/kudzu
S06cpuspeed -> ../init.d/cpuspeed
S08ip6tables -> ../init.d/ip6tables
S08iptables -> ../init.d/iptables
S09isdn -> ../init.d/isdn
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13irqbalance -> ../init.d/irqbalance
S13portmap -> ../init.d/portmap
S15mdmonitor -> ../init.d/mdmonitor
S15zebra -> ../init.d/zebra
S16bgpd -> ../init.d/bgpd
S16ospf6d -> ../init.d/ospf6d
S16ospfd -> ../init.d/ospfd
S16ripd -> ../init.d/ripd
S16ripngd -> ../init.d/ripngd
S20random -> ../init.d/random
S24pcmcia -> ../init.d/pcmcia
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S27ypbind -> ../init.d/ypbind
S28autofs -> ../init.d/autofs
S40smartd -> ../init.d/smartd
S44acpid -> ../init.d/acpid
S54hpoj -> ../init.d/hpoj
S55cups -> ../init.d/cups
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S58ntpd -> ../init.d/ntpd
S75postgresql -> ../init.d/postgresql
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S87iiim -> ../init.d/iiim
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90xfs -> ../init.d/xfs
S95atd -> ../init.d/atd
S96readahead -> ../init.d/readahead
S97messagebus -> ../init.d/messagebus
S97rhnsd -> ../init.d/rhnsd
S99local -> ../rc.local


 위 목록처럼, 실제 서비스를 시작하고 중지하는 어떤 스크립트도 /etc/rc.d/rc5.d/ 디렉토리에 위치하고 있지 않습니다. 대신, /etc/rc.d/rc5.d/에 있는 모든 파일은 /etc/rc.d/init.d/ 디렌토리에 위치한 스크립트에 대한 심볼릭 링크합니다. 심볼릭 링크는 각각의 rc 디렉토리에 사용되며, 원래의 스크립트에는 영향을 미치지 않고 심볼릭 링크를 생성, 수정, 삭제하는 것으로 런레벨을 재설정할 수 있습니다.


여기서 각 심볼릭 링크 앞에는 SK가 붙게 되는데 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 등이 될 수 있습니다.


 실행이 완료되면, 시스템은 런레벨 5에서 작동하고 로그인 화면이 나타나게 됩니다.





Posted by 시크한공돌이
,