본 논문에서는 기존의 임베디드 리눅스를 경량화 하는 방법을 개선하고 통합하여 임베디드 시스템에서 동작하는 어플리케이션의 처리 속도 개선에 어떤 효과가 있는지를 검증하고자 한다.
이를 위해 Hibernation 기법을 응용한 부팅시간 단축, Symbolic Link 기법과 가상주소매핑 기법을 적용한 JFFS2 파일시스템 최적화, 범용성을 보장하는 커널 경량화 방법을 적용하였으며 실험을 통해 본 논문에서 제안하는 경량화 기법이 임베디드 시스템의 성능 향상에 어떤 효과가 있는지를 확인하였다.


제1저자 이태우 dickgap@gmail.com
충북대학교 컴퓨터공학과 강의전담교수(컴퓨터공학 박사)


3. 리눅스 커널 경량화 기법
본 논문에서 제안하는 리눅스 커널 경량화 기법은 크게 두 가지로 나누어 설계하였다.
첫 번째 방향은 Linux Tiny 프로젝트에서 수행한 패치를 타깃 임베디드 리눅스에 포팅한 것이며, 두 번째 방향은 gcc 컴파일러의 최적화 옵션을 사용하여 선택적으로 커널 이미지를 빌드한 것이다.

(1) Linux Tiny Patch 적용
Linux Tiny 프로젝트[13]는 리눅스가 소형시스템에서도 동작할 수 있도록 커널 2.6을 기반으로 커널의 메모리와 디스크 사용량을 경량화한 패치셋이다.
Linux Tiny 프로젝트가 소형 디바이스, 레거시 시스템을 대상으로 설계되었기 때문에 본 논문에서는 여러 가지 패치 내용 중 범용성을 해치지 않고 다양한 시스템에 적용할 수 있도록 재사용성을 고려하여 선별한 후 적용하였다.

다음은 커널을 경량화 하기 위하여 설정한 항목과 그 효과를 설명한 것이다.
- kill-printk.patch : 커널 이미지에서 메시지 출력을 제거한다. printk 함수를 return 부분만을 가지는 inline printk 함수로 대체하고, kernel/printk.c 파일의 log_buf 관련 변수들과 console, log 관련 함수들을 제거하여 커널의 플래시 메모리와 RAM 사용량을 줄이고 실행속도를 높인다.
- no-aio.patch : 쓰레드 애플리케이션에서 성능을 높이기 위해 사용되는 POSIX 비동기 IO 함수들을 제거하여 커널 크기를 줄인다. fs/aio.c 파일의 aio_complete 함수, exit_aio 함수 등과 kernel/sysctl.c 파일 fs_table 변수의 aio 관련 부분을 제거한다.
- no-attr.patch :파일 시스템 확장 애트리뷰트 시스템 콜에 관련된 함수를 제거한다. fs/Makefile에서 xattr.o 오프젝트 파일 관련 부분이 제거된다.
- posix-timers.patch : 실시간 어플리케이션에서 사용되는 POSIX 타이머 관련 함수를 제거한다. kernel/posix-timer.c 파일에서 posix_timer_id, posix_clocks, init_posix_timer와 같은 POSIX 타이머 관련 선언과 변수, 함수들을 모두 제거하여 커널의 크기를 줄인다.


표 1.
gcc 컴파일러 최적화 옵션(gcc Compiler Optimization Option)



표 2.
Hunins XP-100 임베디드 시스템 주요 사양(Huins XP-100 Embedded System Specification)
 

위에 적용된 사항들은 임베디드 시스템에서 어떤 응용 어플리케이션이 동작하여도 어플리케이션 실행과는 전혀 무관한 항목들이다. 따라서 본 논문에서 제안한 적용 범위를 포함하여 어플리케이션 목적에 따라 불필요한 요소들을 효과적으로 분리 적재하면 높은 커널 경량화 효과를 얻을 수 있을 것이다.

이 때 기본적으로 제공하는 make menuconfig uration 기능을 사용하면 된다. 하지만 본 논문에서는 범용성과 재사용성에 초점을 맞추었기 때문에 위에 열겨한 항목들만 제거하여 커널 경량화를 꾀하였다.

(2) gcc 컴파일러 최적화 옵션
다음으로 gcc 컴파일러 최적화 옵션을 사용하여 실행 파일의 크기, 컴파일 시간, 실행 속도와 같은 조건을 고려하여 선택적으로 커널 이미지를 빌드하였다. gcc 컴파일러는 표 1과 같은 여러 단계의 최적화 옵션을 제공하고 있으며, 코드 크기를 최소화할 수 있는 최적화 옵션을 사용해 커널 이미지의 ROM 크기를 경량화 할 수 있다. 본 논문에서는 최적화 옵션 중 -O1을 이용하였다.

본 논문에서와 같이 타깃 임베디드 시스템이 다양한 어플리케이션이 동작된다면, 컴파일러에서 지원하는 모든 최적화를 수행하였을 경우, 어플리케이션에 따라 컴파일 시간이 다소 오래 걸리고 코드의 크기가 증가하여 오히려 역효과를 초래하는 경우도 발생한다.
따라서 다양한 어플리케이션이 동작되는 임베디드 시스템이라면 효과는 비교적 다른 옵션에 비해 작지만 어플리케이션 실행 속도를 향상시키고 루트 파일시스템 및 부팅 메커니즘에도 좋은 영향을 주는 -O1 옵션을 선택하길 권장한다.


표 3.
기존 커널과 경량화를 수행한 커널의 크기 비교(Kernel Size Comparison)



표 4.
기존 커널과 경량화를 수행한 커널의 사용 메모리 및 부팅 시간 비교(Kernel Using Memory Size and Booting Time Comparison)


실험 및 결과분석

본 논문에서 사용할 임베디드 시스템은 휴인스에서 제작한 XP-100이다. XP-100은 10만 게이트의 FPGA가 집적되었으며, LCD, Ethernet, Camera I/F 등 많은 주변기기들을 보유하고 있으며 이 시스템의 세부사항은 다음 표 2와 같다.

1. 커널 및 점유 메모리 크기 비교
제한된 리소스를 사용해야만 하는 임베디드 시스템의 경우, 속도도 중요한 요소이긴 하지만, 메모리를 비롯한 제한된 리소스를 얼마나 잘 활용하느냐가 경량화의 중요한 요소이다. 바꾸어 말하면 속도는 기다리면 해결되지만 한정된 리소스를 효율적으로 활용하지 않으면 아예 수행 자체가 불가능하기 때문에 효율적인 자원 활용은 매우 중요하다.

본 논문에서 제안한 임베디드 리눅스 경량화 기법을 적용한 후 기존 커널과 비교한 결과는 표 3과 같다. 기존의 커널은 일반적인 임베디드 리눅스 커널을 사용하였다. 여기에 본 논문에서 제안한 경량화 기법은 범용성과 재사용성을 고려하여 설계되었기 때문에 기존 임베디드 리눅스가 지원하던 대부분의 기능을 모두 지원하면서도 기존 커널의 크기를 9.6% 개선할 수가 있었다.

표 4는 부팅 과정 중에 나오는 Freeing init Memory의 크기와 부팅을 완료하는데 까지 소요되는 시간을 비교해 놓은 표이다. 초기화 직전까지 사용된 이후, 반환되는 메모리의 크기로 경량화를 수행한 커널이 약 4Kb 정도 적게 소모되는 것을 알 수 있다.

또한 Hibernation 기법을 응용한 부팅 방식과 루트 파일시스템 경량화 기법에 사용된 Symbolic Link 기법을 통해 부팅 시 발생할 수 있는 오버헤드를 대부분 줄여주었기 때문에 만족할 만한 결과를 얻을 수 있었다.

2. 어플리케이션 처리 속도 비교
앞에서 부팅 완료 시간, 커널의 크기, Freeing init Memory의 크기 비교를 통하여 임베디드 리눅스 운영체제가 범용성과 재사용성을 해치지 않는 범위에서 얼마나 효율적으로 경량화가 가능한지를 확인하였다. 본 절에서는 임베디드 시스템에서 동작하는 어플리케이션의 처리 속도를 비교해 보고 본 논문에서 제안한 경량화 기법을 통해 얼마나 개선하였는지를 확인한다.

본 논문에서는 타깃 시스템에서 동작을 검증하는 어플리케이션으로 에지검출 프로그램을 이용하여 BMP 파일의 변환 시간을 측정하였다.
경량화를 적용하여 만들어진 임베디드 리눅스 운영체제 하에서 처리 속도가 개선되었는지를 확인하였다. 에지검출 프로그램을 크로스 컴파일러를 이용해 컴파일 한 후 시리얼 케이블을 통해 전송하였고, 입력으로는 526KB 표준 BMP 파일을 이용하였다.

실험은 BMP 파일 변환 시간에 있어서 각각 기존 커널 사용 시의 최적, 최악의 경우와 경량화 된 커널 적용 후 최적, 최악의 경우를 선정하여 비교하였다. 최적의 경우는 수차례의 테스트 중 가장 짧은 시간이 걸린 경우이며, 최악의 경우는 가장 긴 시간이 걸린 것이다. 그림 1은 에지검출 프로그램의 실행결과를 정리한 것이다.

최적의 경우 기존 대비 1초가 줄어 11%의 성능 향상으로 다소 미비하지만 최악의 경우는 기존 임베디드 시스템 환경에서 61초가 소요됨에 반해, 경량화가 적용된 시스템에서는 21초가 소요되어 약 66%의 처리 속도 향상이 있음을 확인할 수 있었다. 이는 본 논문에서 제안한 경량화 기법을 적용함으로써 어플리케이션의 처리 속도 개선에 효과가 있음을 보여주고 있다.


그림 1.
제안하는 경량화 기법 전체 구성도

 

결론

본 논문에서는 리눅스를 탑재한 임베디드 시스템에서 임베디드 리눅스 경량화 기법을 제안하고 적용함으로써 효율적인 자원 활용과 빠른 부팅 시간 및 시스템에서 동작하는 어플리케이션의 처리 속도가 개선됨을 확인하였다.

빠른 시간 안에 부팅을 완료하기 위하여 Hiber nation 기법에 Software Suspend 알고리즘을 리눅스 환경에 맞게 적용하였으며, 효율적인 루트 파일시스템을 적용하기 위하여 기본적으로 제공하는 JFFS2 파일시스템에 메모리 사용 효율을 높일 수 있는 Symbolic Link 기법과 압축해제 과정에서 발생할 수 있는 오버헤드를 줄이기 위하여 vmap()과 vunmap()을 이용한 가상주소매핑 기법을 제안하였다.

마지막으로 일반적인 임베디드 리눅스가 갖고 있는 범용성과 재사용이 가능한 리눅스 커널 경량화를 위하여 Linux Tiny 프로젝트에서 수행된 패치 항목 중 선별하여 제거하였다.

실험결과 경량화를 적용한 후에도 시스템에서 동작하는 어플리케이션이 정상적으로 동작하였음은 물론이며, 부팅 및 어플리케이션 실행 속도의 향상 및 기존 커널 대비 많은 리소스 확보가 가능하였다.

그러나 시스템에서 동작하고 있는 어플리케이션들이 안정적으로 운용되고 있을 때에는 경량화를 통한 효과는 크게 나타나지 않았다. 따라서 정밀한 커널 Configuration 조정으로 커널 사이즈 최적화하는 연구 및 소스 레벨에서 커널 사이즈를 줄일 수 있는 연구, 루트 파일시스템에서 동적라이브러리의 효율적인 관리 기법 등이 이 문제를 해결할 수 있을 것이며 이는 중요한 향후 연구과제가 될 것이다.

 

참고문헌

[1] Huins, "System On Chip and Embedded System Design using ARM9 Core," HongRung Press, 2004.
[2] B. Roman, "Tips and Tricks for Implementing Software Execute-In-Place with Windows CE.NET, Datalight, 2003.
[3] In Hwan Doh, "Implementation of the Hibernation-based Boot Mechanism on an Embedded Linux System," Journal of the Korea society of computer and information, Vol. 16, No. 5, pp23-31, 2011.
[4] S. Park, J. Song, C. Park, "A Fast Booting Technique using Improved Snapshot Boot in Embedded Linux," Journal of KISS, Vol. 14, No. 6, pp594-598, 2008.
[5] S. Ahn, S. Hyun, K. Koh, "Improving Read Performance of SquashFS for Multimedia Embedded System," Conf. Korea Multimedia Society, pp117-120, 2008.
[6] M. Mackall, "Linux-tiny and directions for small systems," Proc. of the Linux Symposium, Jul. 2004.
[7] LinuxTiny, http://www.selenic,com/linux-tiby/


회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지