■ CP 명령어를 사용하면서 용량이 큰 파일을 복사할때는 그 진행사항이 궁금할때가 있는데요 그럴땐 어떻게 해야할까요??
▶ 답은 바로 -v 옵션입니다.
- cp -v 옵션은 현재 복사중인 파일을 보여주는 명령어 입니다.
▶ 하지만!! 현재 윈도나 여러 곳에서 보이는 것처럼 프로그래스 바(Progress bar) 형태의 진행사항은 표시하지 못한다는 단점이 있습니다. 이에 Advanced copy 라고 하는 방식의 패치를 통해 프로그래스 바 옵션인 -g 옵션을 추가 하여 사용하고 있습니다.
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 등이 될 수 있습니다.
(ARM toolchain install to cross compile for build of Tizen)
ㄴ. 설치한 크로스 컴파일러의 설정을 한다.
(Configuration ARM cross complie toolchain)
※ 추후 u-boot를 빌드에 64비트 실행이 존재하므로 이전 우분투를 설치할 때 64BIT 운영체제를 설치하도록 한다. (You must install 64bit OS to build u-boot. U-boot builder have 64bit execute file)
2.내용(body)
ㄱ. 툴체인 다운로드 (Toolchain Download)
a. 먼저 http://www.mentor.com/에서 IA32용 GNU/Linux ARM EABI를 받아야함.
(First, you have to download 'GNU/Linux EABI for IA32' in http://www.mentor.com/)
위와 같은 화면이 보이면 'Download Lite Edition' 클릭한다.('Download Lite Edition' click)
각 양식들을 체우고 'Get Lite!' 버튼을 클릭한다. (Fill in all of form.)
그 후 메일을 확인하면 ARM EABI를 받을 수 있는 메일이 수신되어있다. 메일을 열면 아래와 같은 주소가 담긴 메일이 보인다.(Then, you can receive a mail to download ARM EABI)
주소가 담긴 메일에서 빨간 네모박스 위치의 주소를 클릭하면 ARM의 EABI를 다운받는다.
(Click the link inside of red box to download ARM EABI)
※ 여기서 EABI란(임베디드 응용 프로그램 이진 인터페이스, embedded-application binary interface)는 임베디드 소프트웨어 프로그램을 수행하는 파일 형식, 자료형, 레지스터 사용, 스택 프레임 조직, 명령 변수를 위한 표준 변환을 정의하고 있다.
EABI를 지원하는 컴파일러는 이와 같은 또다른 컴파일러가 만든 코드와 호환되는 목적 코드를 만드므로 개발자들이 다른 컴파일러가 만들어 낸 목적 코드와 한 컴파일러로 만든 라이브러리를 연결할 수 있게 한다. 자체적인 어셈블리어 코드를 작성하는 개발자들은 EABI를 사용하여 호환 컴파일러가 만들어낸 어셈블리 코드와 상호 작용하게 할 수 있다.
일반 목적의 운영 체제에서 ABI와 EABI의 주된 차이점은 권한 명령이 응용 프로그램 코드 내에서 실행되는 점, 동적 링크가 요구되지 않는다는 점(심지어는 아예 동적 링크를 허용하지 않는 경우도 있음), 메모리 저장을 위해 더 작아진 스택 프레임 조직을 갖춘다는 점이 있다.
(An embedded-application binary interface (EABI) specifies standard conventions for file formats, data types, register usage, stack frame organization, and function parameter passing of an embedded software program.
Compilers that support the EABI create object code that is compatible with code generated by other such compilers, thus allowing developers to link libraries generated with one compiler with object code generated with a different compiler. Developers writing their own assembly language code may also use the EABI to interface with assembly generated by a compliant compiler.
The main differences of an EABI with respect to an ABI for general purpose operating systems are that privileged instructions are allowed in application code, dynamic linking is not required (sometimes it is completely disallowed), and a more compact stack frame organization is used to save memory.[4] The choice of EABI can affect performance.)
빨간 네모박스의 IA32 GNU/Linux TAR 파일을 받는다. (Download IA32 GNU/Linux TAR file inside of redbox)
다운 파일이 Downloads 폴더 안에 생성된것을 볼 수 있다.(arm-2010q1-188-arm-none-eabi-i686-pc-linux-gnu-tar.bz2)
(You can see tar file in Downloads folder. File name is arm-2010q1-188-arm-none-eabi-i686-pc-linux-gnu-tar.bz2.)
위와 같은 tar -xvf 명령어를 통해 압축을 푼다.(Extract tar file by tar -xvf command)
압축을 풀면 arm-2010q1 이라는 폴더가 생성됨을 볼 수 있다.(You can see arm-2010q1 folder after extract.)
위와 같은 cp 명령어를 통해 사용자가 원하는 폴더로 ARM EABI 폴더를 이동시킨다.(move arm-2010q1 folder to every dir where you want by cp.)
폴더가 이동되었다면 자신의 HOME 폴더의 .bashrc 파일을 수정한다. .bashrc 파일은 bash shell이 시작될 때 초기화되는 sell script들을 모아놓은 파일이다.(If folder is moved successfully, you have to edit .bashrc in your HOME folder.)
위와 같이 .bashrc에 자신의 ARM EABI 위치에 대한 경로를 추가해 준다.(Specify your ARM EABI folder PATH end of the .bashrc file.)
export ARCH=arm
export CROSS_COMPILE=arm-none-eabi-
PATH=$PATH:(Your ARM BAEI folder path)/bin;
:wq 명령어를 통해 저장하고 복귀한다.(Return to shell bu :wq command.)
ㄴ. 위와 같은 툴체인 설치가 완료되었다면 32bit 라이브러리를 설치한다.(Install 32bit libs)
'sudo apt-get install ia32-libs' 명령어를 통해 설치하게 된다.
3.결론(conclusion)
ㄱ. 지금까지 ARM 크로스 컴파일을 위한 ARM EABI 설치를 진행해 보았다.(We installed ARM EABI for ARM cross complie)
ㄴ. 다음은 타이젠의 u-boot 소스를 받고 엑시노스 4412의 콘피규어 파일을 포팅하고 빌드해 보도록 하겠다.(We will download u-boot of Tizen and porting Exsynos4412 config file to Tizen u-boot next time)