[AM3358 Linux 4.9.69 컴파일]

 

ARM Core 용 리눅스를 컴파일 하기 전에 컴파일 항목을 설정하는 Menuconfig 설정 시

 

DM368 (Linux 2.6.x) 에서는 defconfig 이후 $ make menuconfig 로 바로 항목 설정이 가능했는데

 

AM3358 (Linux 4.9.69) 에서는 defconfig 이후 $ make menuconfig 로 들어가도 설정했던 항목이

 

보이지 않았는데, 이것은 기본적으로 x86 config 파일을 로딩해서 들어 가도록 되어 있어서,

 

아키텍쳐를 설정해서 실행 해야 한다.

 

$ make ARCH=arm menuconfig

 

Posted by 다크쌍피

Linux에서는 minicom 을 이용해서 시리얼 통신 프로그램을 시험 할 수 있는데, Embedded Linux에서 사용할 수

있는 방법은 Busybox의 microcom 프로그램을 이용해서 하면 된다.

 

$microcom -s 115200 -d 10 /dev/ttyUSB1

Posted by 다크쌍피

Ultimate Packer for eXecutables 이하 UPX 는 실행파일을 실행가능하게 압축하여 사이즈를 줄여주는 프로그램으로 대상에 따라 다르겠지만 대부분 40프로 가량 줄여 주는것 같다. 요즘은 임베디드 시스템도 고사양으로 저장장치나 RAM사이즈가 커져서 굳이 사용할 일 이 없을 수도 있으나 저사양의 임베디드시스템에서는 100kb 용량도 비중이 클 수 있어서 이런 시스템에서 사용하면 유용한 프로그램이다.


UPX 장점

  1) 저장 장치의 저장공간 절약.

  2) RAM에서 로딩하는 사이즈도 줄 수 있어서 RAM 절약.

  3) Windows 32/64/CE, LInux, MAC, DOS, OpenBSD, NetBSD, AtariTOS/Mint, Playstation 1 등 거의 모든 실행 포맷 제공.


UPX 단점

  1) 크게 체감상 느껴지지 않지만 실행 속도가 약간 늦음.


UPX는 사이트내에서 기본적으로 미리 컴파일을 하여 실행 프로그램을 제공해주고 있으나 내가 사용하는 보드는 TI DM368 보드여서 Cross Compile을 해줘야 한다. 소스코드는 (http://upx.sourceforge.net/) 에서 다운로드가 가능하다. UPX를 컴파일 하기 위해서는 UCL 라이브러리가 필요하기 때문에 UCL 라이브러리를 먼저 컴파일 해야 하는데 UCL은 (http://www.oberhumer.com/opensource/ucl/) 에서 다운로드 가능하다. 


UCL 컴파일

host$ CC=/home/dark2pee/Project/ti-dvsdk_dm3730-evm_04_03_00_06/linux-devkit/bin/arm-arago-linux-gnueabi-gcc ./configure --host=arm-arago-linux-gnueabi --prefix=/home/dark2pee/temp/ucl


UPX 컴파일을 위해서 Makefile 수정 (./upx-3.91-src/src/Makefile)

#CXX = g++
CXX = /home/dark2pee/Project/ti-dvsdk_dm3730-evm_04_03_00_06/linux-devkit/bin/arm-arago-linux-gnueabi-g++

                                                           :

#UCL Path 추가

UPX_UCLDIR = /home/dark2pee/Project/upx/ucl-1.03


#LIBS += -lucl -lz
LIBS += $(UPX_UCLDIR)/src/.libs/libucl.a -lz


UPX 컴파일

host$ make all


UPX를 컴파일 하면 src 폴더에 upx.out이 생성 되고 이를 이용하여 실행 프로그램의 사이즈를 줄여 준다.


target$ ./upx.out  -1 TESTApp
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013
 
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------

TESTApp  1/4  [****................................................]   25.2%  |

   6839883 ->   4367184   63.85%   linux/armel   TESTApp
 
Packed 1 file.


UPX Site : http://upx.sourceforge.net/

Posted by 다크쌍피

1.2 bootchart2

bootgraph가 Kernel 시작 부터 Init까지의 부팅과정을 분석한다면, bootchart2는 init 이후의 부팅 과정 및 CPU 사용률 및 디스크 사용률까지 분석 해준다. bootchart2를 사용하기 위해서는 다음과 같은 작업을 해야 한다.


1) 부팅 과정의 로그를 저장하는 데몬인 bootchartd를 busybox 컴파일 시 포함 시켜줘야 한다.

busybox # make menuconfig


 Init Utilities ---> [*] bootchartd

                      [*]   Compatible, bloated header

                      [*]   Support bootchartd.conf


2) u-boot의 boot parameter인 init=/sbin/init을 init=/sbin/bootchartd로 변경하고 printk.time=1 initcall_debug=1 를 추가 한다.

  ex> bootargs=noinitrd rootfstype=ubifs ubi.mtd=4 xxxxxxxxxxxxxxxxxx init=/sbin/bootchartd printk.time=1 initcall_debug=1


3) 부팅 후 /var/log 에 부팅 로그 파일인 bootlog.tgz 를 서버로 복사한다.


4) 개발 서버에서 bootchart2 소스코드를 다운로드 하여 컴파일 한다. ( https://github.com/mmeeks/bootchart/releases )

/usr/local/bootchart2/bootchart-0.14.7$ make



5) bootchart2 스크립트인 pybootchartgui.py 를 이용하여 부트 로그 파일인 bootlog.tgz 를 그래프화 한다.

  $ /usr/local/bootchart2/bootchart-0.14.7/pybootchartgui.py bootlog.tgz


6) 결과

부팅 로그가 분석된 bootchart.png 파일이 생성 되고 이를 확인할 수 있다.





 


Posted by 다크쌍피

1. 개요

Embedded Llinux를 사용하는 많은 장치들이 부팅속도를 줄이려고 많은 노력을 한다. 요즘은 Zero-Boot, 혹은 Super-FastBoot 등과 같이 메모리 덤프작업을 통해서 전원 인가 후 1초만에 어플리케이션이 실행 되도록 하는 기술이 이슈가 되고 있는데, 여러 모듈과 연동하고 있는 산업용 장비 같은 경우, 초기화 시에 모듈의 이상유무를 검증해야 해서 이런 기술이 적용되기 힘든경우가 존재한다. 이런경우 순수하게 리눅스의 부팅 시 사용하지 않는 모듈을 제거 하거나 다른 모듈로 대체 해나가면서 최적화 하는 방법이 필요 한데 이런경우에 사용하면 유용한 툴이 bootgraphbootchart2를 이용하는 방법이다.


bootgraph 와 bootchart2는 부팅 과정을 시간별로 그래프화 하여 모듈의 부팅 시 시작 시점 및 실행 시간을 알 수 있도록 기능을 제공 한다.


1.1 bootgraph

bootgraph 는 Linux Kernel Source에 포함된 perl script로 Linux Kernel Source/scripts/bootgraph.pl 로 존재 한다.

bootgraph를 사용해서 부팅 과정을 분석 하기 위해서는 다음과 같은 작업을 해야 한다.


  1) Kernel Config 내용 중 CONFIG_PRINTK_TIME, CONFIG_KALLSYMS 을 Enable 시켜줘야 한다.

  2) Kernel Config 내용 중 버퍼 오버플로어를 대비해서 CONFIG_LOG_BUF_SHIFT 를 14 에서 18 로 변경한다.

  3) u-boot의 boot prameter에 "printk.time=1 initcall_debug=1"를 추가 한다.

      ex> bootargs=noinitrd rootfstype=ubifs ubi.mtd=4 xxxxxxxxxxxxxxxxxx printk.time=1 initcall_debug=1


내용적용 후 Kernel Booting Log용

[    0.000000] Linux version 2.6.39.1 (dark2pee@dev-ubuntu) (gcc version 4.3.3 (GCC) ) #53 Wed Jul 2 11:01:05 KST
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: OMAP3 SIO
[    0.000000] Reserving 4194304 bytes SDRAM for VRAM
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] OMAP3630 ES1.2 (l2cache iva neon isp 192mhz_clk )

                                    :

[    0.039642] CPU: Testing write buffer coherency: ok
[    0.039855] calling  spawn_ksoftirqd+0x0/0x50 @ 1
[    0.039916] initcall spawn_ksoftirqd+0x0/0x50 returned 0 after 0 usecs
[    0.039947] calling  init_workqueues+0x0/0x250 @ 1


  4) 부팅 완료 후 부팅 로그를 dmesg 를 이용하여 저장한다.

target# dmesg > /tmp/bootlog


 5) 저장된 bootlog를 개발서버로 복사 하여 bootgraph 스크립트를 이용하여 그래프화 한다.

server$ cat bootlog | perl /linux-kernel-xxxxx/scripts/bootgraph.pl > bootlog.svg 


6) 결과

해당 모듈의 부팅 시간을 확인 하여 필요 없는 부분을 삭제 한다.


 



Posted by 다크쌍피

/proc/bus/usb/device로 usb의 연결 정보를 확인 할 수 있다.

하지만 proc/bus/usb에 아무 것도 없는 경우가 있는데 이문제는

http://www.linux-usb.org/USB-guide/c607.html 에 보면 파일시스템이

마운트 되지 않았거나, 잘못된 곳에 마운트가 되었다고 한다.


# cat /etc/fstab

명령으로 filesystem 마운트 정보를 확인해본다.

# /etc/fstab: static file system information.
#
# <file system> <mount pt>     <type>   <options>         <dump> <pass>
/dev/root       /              ext2     rw,noauto         0      1
proc            /proc          proc     defaults          0      0
devpts          /dev/pts       devpts   defaults,gid=5,mode=620   0      0
tmpfs           /tmp           tmpfs    defaults          0      0
sysfs           /sys           sysfs    defaults          0      0
usbfs           /proc/bus/usb   usbfs   defaults        0       0


usbfs 가 마운트 안되어 있다면, 위 부분을 적용해 주고 재시작 하면, /proc/bus/usb/device 정보를 확인 할 수 있다.

Posted by 다크쌍피

Embedded LInux 의 네트워크 관련 설정은 "/etc/sysctl.conf" 에서 설정한다.

없으면 만들어 주면 된다.





# net.ipv4.tcp_keepalive_probes=2
net.ipv4.tcp_keepalive_time=10
# net.ipv4.tcp_keepalive_intvl = 10

# disable ipv6
net.ipv6.conf.all.disable_ipv6=1


Posted by 다크쌍피

Linux Kernel을 컴파일 하면 기본적으로 zImage가 생성이 된다. Embedded LInux에서도 zImage를 사용해도 되지만 일반적으로 사용되어어지는 bootloader인 u-boot를 사용할 경우 uImage를 사용하는 데 uImage는 u-boot에서 사용하는 압축된형태의 커널 이미지 이다. u-boot에서도 zImage를 사용할 수 있는데 uImage를 사용하는 이유는 zImage는 u-boot에서 파라메터를 전달 받을 수 없는 독립적인 이미지여서 이를 사용 시 부트로더의 head.S 파일을 수정해 줘야 하기 때문에 u-boot의 "mkimage" 툴을 이용하여 zImage에 헤더가 추가된 uImage를 사용한다.
Posted by 다크쌍피