Chap 10 안드로이드커널 (Kernel)
1. Kernel Operating System에서 Kernel은운영체제의핵심부분이다. Bootloader에서하드웨어초기화를담당했다면, 커널은우리가사용해야할시스템자원을관리해주는기능을해준다. 아래는기본적인커널의역할을나열해보았다. 물론, 안드로이드가적용되면서기본적인커널에추가적인기능이포함되었다. 기본적인커널의역할을나열하면아래와같다. 프로세스관리 (Process Management) 메모리관리 (Memory Management) 파일시스템관리 (File System Management) 디바이스관리 (Device Management) 네트워크관리 (Network Management) 1.1. 커널컴파일 1.1.1. 커널소스소스준비 1 작업디렉터리로이동한다. 제공된 DVD (CD/Kernel 디렉터리 ) 의커널소스를커널작업디렉터리로복사한다. 커널버전은제품출시일에따라변경될수있기때문에 CD의내용을확인하고진행한다. root@ubuntu:~# mkdir /root/temp root@ubuntu:~# cp /media/[achro-disc]/kernel/kernel.tar.gz /root/temp root@ubuntu:~# cd /root/temp root@ubuntu:/root/temp# 2 복사한소스의압축을푼다. (bzip2 파일일경우, xvf 옵션으로 tar 명령수행 ) 2
root@ubuntu:/root/temp# tar xvf kernel.tar.gz C /work/achroimx6q root@ubuntu:/root/temp# rm kernel.tar.gz 3 압축을풀어놓은소스디렉터리로이동 root@ubuntu:/root/temp# cd /work/achroimx6q/achroimx_kernel X root@ubuntu root@ubuntu:/work/achroimx6q/achroimx_kernel# ls COPYING Documentation Kconfig Makefile README System.map block drivers fs init kernel mm net scripts sound usr vmlinux CREDITS Kbuild MAINTAINERS Module.symvers REPORTING-BUGS arch crypto firmware include ipc lib name samples security tools virt vmlinux.o 4 기존의 compile 설정을지운다. root@ubuntu:/work/achroimx6q/achroimx_kernel# make distclean 5 Target Board에맞는설정을지정한다. 설정파일은 arch/arm/configs 폴더에있다. 아래명령실행시, 오류가발생하면, /root/.bashrc에 export CROSS_COMPILE 환경변수가선언되어있는지확인하고없으면추가한다. 파일을변경했으면 source 명령을통해갱신한다. 자세한내용은임베디드시스템개발환경챕터에기술되어있다. root@ubuntu:/work/achroimx6q/achroimx_kernel# export ARCH=arm root@ubuntu:/work/achroimx6q/achroimx_kernel# make achroimx_defconfig 9 컴파일하기 -j 옵션은빌드머신으로사용하는호스트컴퓨터의프로세서개수를지정할때 3
사용한다. 프로세서의개수가많으면빌드시간이줄어든다. 만약, ubuntu 버전이높아 python3를사용해서빌드하는경우, 아래와같은에러메시지를볼수있다. 이때는 kernel/timeconst.pl 파일을에디터로열어서, defined 구문을삭제한다. 즉, defined(@array) 를 (@array) 로변경한후, 컴파일을다시시도한다. Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373. root@ubuntu:/work/achroimx6q/achroimx_kernel# make -j4 10 bootimage 생성 Achro-i.MX6Q의 Andoroid는 kernel과 ramdisk를함께포함하는 bootimage를사용한다. 따라서 kernel만컴파일한경우는 ramdisk가없기때문에 bootimage를생성할수없다. android를모두빌드한후에, kernel이포함된 bootimage를퓨징해야동작을확인할수있다. 따라서아래의 command 및 kernel 기록과정은다음장에이어지는 android를컴파일한후에수행한다. root@ubuntu:/work/achroimx6q/achroimx_kernel# cd../android root@ubuntu:/work/achroimx6q/android#./make_bootimage.sh 1.1.2. 커널기록 커널바이너리는 USB 를통해서다운로드된다. 그러므로 VMware 와같이가상 장치를이용하는경우에는 USB 를이용할수있도록설정이되어있어야한다. 1 미니컴실행커널을기록하기위해서미니컴을실행한다. 이전개발환경구성편에서미니컴을설치하고통신포트와설정부분을이미디폴트설정으로구성하였으므로바로실행해주면된다. 만약, 기존개발환경구성부분을확인하지않은독자는해당부분을참고하여미니컴의설정을정상적으로마친다음, 미니컴을실행하면된다. root@ubuntu:/work/achroimx6q/achroimx_kernel# minicom 4
2 개발보드연결 Achro-i.MX6Q에서디버그포트로시리얼메시지를받으려면, 개발보드의 Console 포트와 PC의시리얼포트를시리얼케이블로연결한다. 그리고 usb otg 케이블도연결해주어야한다. 3 Achro-i.MX6Q 개발보드의전원을켠다. Target Board의전원을 On 시키면아래와같은화면이표시되면서 [Hit any key to stop autoboot : 3] 카운트다운이시작된다. 0이되기전에키보드에서임의의키를누르면 u-boot 명령모드로진입할수있다. ( 키입력이늦으면리눅스커널이부팅되어안드로이드로진입하게되므로꼭카운트다운이끝나기전에 u-boot 명령창으로진입하자.) 5
X root@ubuntu U-Boot 2009.08-dirty ( 9 30 2014-11:10:50) CPU: Freescale i.mx6 family TO1.2 at 792 MHz Thermal sensor with ratio = 172 Temperature: 35 C, calibration data 0x53f49d7d mx6q pll1: 792MHz mx6q pll2: 528MHz mx6q pll3: 480MHz mx6q pll8: 50MHz ipg clock : 66000000Hz ipg per clock : 66000000Hz uart clock : 80000000Hz cspi clock : 60000000Hz ahb clock : 132000000Hz axi clock : 264000000Hz emi_slow clock: 132000000Hz ddr clock : 528000000Hz usdhc1 clock : 198000000Hz usdhc2 clock : 198000000Hz usdhc3 clock : 198000000Hz usdhc4 clock : 198000000Hz nfc clock : 24000000Hz Board: Achro i.mx6q Board: 0x63012 [WDOG] Boot Device: SD I2C: ready DRAM: 2 GB MMC: FSL_USDHC: 0,FSL_USDHC: 1,FSL_USDHC: 2,FSL_USDHC: 3 *** Warning - bad CRC or MMC, using default environment Gzipped BMP image detected! In: serial Out: serial Err: serial Net: got MAC address from IIM: 00:00:00:00:00:00 FEC0 [PRIME] Hit any key to stop autoboot: 0 ACHRO MX6Q U-Boot > 5 fastboot 실행부트파일을전송받기위해 target board에서 fastboot 명령을실행한다. <Target board> Achro i.mx6q > fastboot 6
X root@ubuntu Achro i.mx6q > fastboot fastboot is in init...flash target is MMC:0 USB Mini b cable Connected! fastboot initialized USB_SUSPEND USB_RESET 6 fastboot을이용한 bootimage 전송호스트 PC에서 fastboot 명령을실행하여 bootloader를전송한다. 명령형식은아래와같다. fastboot [ <option> ] <command> 의형태로사용한다. root@ubuntu:/work/achroimx6q/android# fastboot erase boot root@ubuntu:/work/achroimx6q/android# fastboot flash boot boot.img X root@ubuntu root@ubuntu:/work/achroimx6q/android# fastboot flash boot boot.img sending 'bootloader' (456 KB)... OKAY [ 0.458s] writing 'bootloader'... OKAY [ 0.291s] finished. total time: 0.751s X root@ubuntu Achro i.mx6q > fastboot fastboot is in init...flash target is MMC:0 USB Mini b cable Connected! fastboot initialized USB_SUSPEND USB_RESET cmdbuf: getvar:partition-type:boot send: OKAY cmdbuf: getvar:max-download-size send: OKAY cmdbuf: download:00576000 7
Starting download of 5726208 bytes send: DATA00576000... send: OKAY downloading of 5726208 bytes finished cmdbuf: flash:boot writing to partition 'boot' Initializing 'boot' mmc0 is current device Writing 'boot' MMC write: dev # 0, block # 15624, count 11184... 11184 blocks write: OK Writing 'boot' DONE! send: OKAY 6 퓨징이완료되면장치를다시리셋하여 bootloader 명령모드로진입해본다. root@ubuntu:/work/achroimx6q/android# fastboot reboot 8