'커널'에 해당되는 글 4건

  1. 2010.03.03 make menuconfig 에러
  2. 2009.09.02 순대보드 Kernel Image
  3. 2007.10.17 Windos CE 5.0 vs. Windows Embedded CE 6.0 ch.2
  4. 2007.10.17 Windos CE 5.0 vs. Windows Embedded CE 6.0 ch.1
2010. 3. 3. 00:12

make menuconfig 에러



2.6.4 버전의 커널에서 "make menuconfig" 하는 도중 아래와 같은 에러 발생.. -_-;
...
HOSTCC  scripts/kconfig/mconf.o
scripts/kconfig/mconf.c:91: error: static declaration of ‘current_menu’ follows non-static declaration
scripts/kconfig/lkc.h:63: error: previous declaration of ‘current_menu’ was here
make[1]: *** [scripts/kconfig/mconf.o] 오류 1
make: *** [menuconfig] 오류 2

4.x 버전대의 gcc로 컴파일을 하면 에러가 발생하는 모양이다.
해결책은 3.x 버전의 gcc로 갈아탄 후 컴파일을 하는 것이다.
본인의 경우 3.4.6 버전의 gcc를 사용해 make menuconfig를 실행한 결과 위와 같은 에러메시지는 보이지 않고 정상적으로 동작을 했다.

다른 방법으로는 "scripts/kconfig/mconf.c" 파일의 91번째 라인에서 "static" 키워드를 제거하면 된다.
...
//static struct menu *current_menu;
struct menu *current_menu;
...


'Linux > Kernel' 카테고리의 다른 글

커널 컴파일(kernel compile - make install) 에러  (0) 2010.03.03
LXR(Linux Cross-Reference)  (0) 2009.08.28
2009. 9. 2. 16:00

순대보드 Kernel Image



저번 시간까지 해서 'uboot 포팅'까지 완료되었다. uboot를 통해서 리눅스, WinCE와 같은 운영체제를 올릴 수 있는 기반이 준비된 것이다.

이번에 할 일은.. AHAV9302 순대보드에 올릴 리눅스 커널을 만들것이다.

일단 순대국밥님 강좌에 있는대로 Linux Kernel 2.6.22.8 을 올릴 것이고, ftp://ftp.kernel.org에 들어가서 해당 버전의 리눅스 커널을 /opt/arm9sbc/ahav/backup 디렉토리에 다운로드 받는다.
$ wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.8.tar.bz

커널 작업을 하기 위해서 아래와 같이 /opt/arm9sbc/ahav/kernel 디렉토리에 압축을 푼다.
$ cd ${AHAV_KERNEL_DIR}
$ tar -C ${AHAV_KERNEL_DIR} -xjf ${AHAV_BACKUP_DIR}/linux-${AHAV_KERNEL_VER}.tar.bz2

AHAV9302의 리눅스 커널과 네트웍 포팅을 위해 디렉토리 하나를 추가 생성한다. 나중에 파일시스템 관련해서 꼭 필요한 부분이란다. 미리 만들어 준다.
$ mkdir -p ${AHAV_HOST_DIR}/${AHAV_KERNEL_VER}
$ ln -s ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}/include
          ${AHAV_HOST_DIR}/${AHAV_KERNEL_VER}/include

압축을 해제한 리눅스 커널에서 수정하거나 새로 생성해야하는 파일에는 다음과 같은것들이 있다.
[U] 는 기존의 파일을 수정할 것이고, [N] 은 새로 생성해 주어야 하는 파일을 명시한 것이다.
    [U] arch/arm/mach-ep93xx/Kconfig
    [U] arch/arm/mach-ep93xx/Makefile
    [U] arch/arm/mach-ep93xx/Makefile.boot
    [N] arch/arm/mach-ep93xx/ahav9302.c
    [U] arch/arm/tools/mach-types
    [U] include/asm-arm/arch-ep93xx/hardware.h
    [U] include/asm-arm/arch-ep93xx/memory.h
    [N] include/asm-arm/arch-ep93xx/ahav9302.h
    [U] arch/arm/kernel/setup.c
    [U] arch/arm/boot/Makefile

커널 머신(kernel machine) 선택메뉴(arch/arm/mach-ep93xx/Kconfig)에 AHAV를 선택할 수 있는 메뉴를 추가한다.
$ vi arch/arm/mach-ep93xx/Konfig

Makefile에도 새로운 커널 머신이 추가 되었다는 것을 알려주어야 한다. arch/arm/mach-ep93xx/Makefile 파일을 열어 마지막 부분에 아래와 같이 한줄을 추가한다.
$ vi arch/arm/mach-ep93xx/Makefile

다음은 AHAV9302의 SDRAM 연결을 참조하여 arch/arm/mach-ep93xx/Makefile.boot 의 커널 시작주소를 수정한다. 앞서 말한 적이 있지만 AHAV9302 보드에서 SDRAM의 메모리 맵 주소는 0xC0000000이다.
$ vi arch/arm/mach-ep93xx/Makefile.boot


이제부터는 타겟보드인 AHAV9302에 관련된 파일을 생성해서 작업을 할것이다. 무작정 처음부터 새로 생성해서 하는 것보다 기존에 있는 동일한 혹은 비슷한 칩에대한 파일을 구해서 수정을 하는 것이 정신건강에 좋다고 한다.
"arch/arm/mach-ep93xx/"
디렉토리의 "edb9302.c" 파일을 복사해 "ahav9302.c" 를 만들어 수정하면 된다.
순대국밥님이 미리 수정해 놓은 파일을 사용해도 된다. edb9302.c를 ahav9302.c에 맞게 수정한 파일인데, 두 파일을 비교해보는 것도 좋을 듯 하다. 얼핏 봐서는 이더넷 관련 부분이 추가된듯 하다.

다음은 uboot에서도 살펴본듯한 머신타입(arch/arm/tools/mach-types) 파일에 ahav9302 관련된 부분을 넣어준다.
$ vi arch/arm/tools/mach-types

"include/asm-arm/arch-ep93xx/hardware.h"의 마지막에 새로 생성할 ahav9302.h를 포함시킨다.
$ vi include/asm-arm/arch-ep93xx/hardware.h

SDRAM의 시작주소가 0xC0000000 부터 시작되고 있으니 "include/asm-arm/arch-ep93xx/memory.h" 의 PHYS_OFFSET을 아래와 같이 0xC0000000으로 변경한다.
$ vi include/asm-arm/arch-ep93xx/memory.h

"include/asm-arm/arch-ep9302xx/ahav9302.h" 파일은 현재로썬 별 내용이 없기에 그냥 빈 파일로 만들어 두면 된다. 후에 하드웨어를 구현하면서 필요한 선언들을 넣어주는 용도로 사용하면 된다.

AHAV9302 가 64MB 이므로, "arch/arm/kernel/setup.c" 파일의 42번째 줄에서 MEM_SIZE를 (16*1024*1024)에서 (64*1024*1024)로 변경을 해주어야 한다.
$ vi arch/arm/kernel/setup.c

"arch/arm/boot/Makefile"
의 64 번째 줄에 있는 부분을 아래와 같이 변경한다.
이전의 uboot 포팅에서 만들어진 /usr/bin/mkimage가 여기서 사용된다. 커널이 적재되어야 할 주소를  미리 지정해 놓고, 압축이 풀리는 곳의 지정을 다르게 하여 좀 더 효율적으로 한다는데.. 아직 이해 부족.. -_-
$ vi arch/arm/boot/Makefile


자!! 이제부터 커널 컴파일이다.

컴파일 하기 위해서 커널의 설정을 해주어야 하는데.. 음.. 아직 잘 모르겠어.. ㅡ.ㅜ
다행히 순대국밥님이 커널 설정에 대한 컨피그 파일을 미리 준비해 주셨다. 그 놈을 사용해서 커널 컴파일을 하면 될 듯 하다.
위의 파일을 받아서 linux-2.6.22.8 디렉토리로 복사하고, 파일 이름을 .config 라는 이름으로 바꾸어 준다.
아래의 명령을 사용해서 생성하려는 커널의 설정에 대해 확인할 수 있다.
$ cd ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}
$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

아래의 명령을 사용해 AHAV9302의 리눅스 커널을 컴파일 하자!!
clean은 기존의 것들을 지우고 모두 새로 컴파일을 하겠다는 것이고, uImage는 /usr/bin/mkimage를 이용해서 커널을 uboot Image로 만들겠다는 뜻이다.
$ make ARCH=arm CROSS_COMPILE=arm-linux- clean
$ make ARCH=arm CROSS_COMPILE=arm-linux- uImage

한참을 컴파일을 할 것이다.
정상적으로 컴파일이 되었다면 "arch/arm/boot/"에 커널이미지(uImage)가 생성되었을 것이다.

이 녀석을 다음 작업을 하기위한 경로로 이동을 시키자!!
$ cp ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}/arch/arm/boot/uImage  
       ${AHAV_KERNEL_DIR}/.post/.
$ cp ${AHAV_KERNEL_DIR}/.post/uImage ${AHAV_IMAGES_DIR}/${AHAV_PROJECT_NAME}/.

이렇게 해서 AHAV9302 순대보드를 위한 리눅스 커널은 준비가 된 것이다.

이해 못할 부분들이 많이 있는데.. 일단 따라해보며 순대보드에 리눅스를 올리는 것까지 한 번 해보고, 필요한 부분들을 찾아가며 다시 공부를 해봐야 할 듯 하다.
무작정 하면 첨부터 완전 질려버려 아무것도 못할 듯... -_-;


'혼자서 놀기... > 순대보드(AHAV9302)' 카테고리의 다른 글

순대보드 u-boot - 4  (0) 2009.09.02
순대보드 u-boot - 3  (0) 2009.08.11
순대보드 u-boot - 2  (0) 2009.08.11
순대보드 u-boot - 1  (4) 2009.04.02
순대보드 CrossCompile 환경 - 2  (0) 2009.04.01
2007. 10. 17. 17:08

Windos CE 5.0 vs. Windows Embedded CE 6.0 ch.2


Windows CE 5.0에서 Windows Embedded CE 6.0으로 넘어오면서 OAL에서 바뀐 점은 다음과 같다.

1. 커널과 OAL의 분리했다.
   -  NKLoader에 의해 합체
   -  독립적으로 업데이트 가틍
2. 전체적인 OAL구조는 같다.
  - OEM함수
  - 커널 접근은 커널 인터페이스를 통해서 가능
3. 새로운 메모리 모델을 OAL에 적용했다.

* OAL(OEM Adapted Layer) - 각 OEM의 platform에 맞게 작성된 사용자가 만든 소스 부분이라 생각하면 된다.

사용자 삽입 이미지
Windows CE 5.0과 달리 Windows Embedded CE 6.0은 커널과 OAL을 분리했다.

Windows Embedded CE 6.0 BSP의 특징.
1. 새로운 커널을 지원
2. 쉬운 BSP개발 및 포팅
3. PQOAL 지원
4. OAL, Kernel 그리고 KITL 독립성 지원

다음 그림을 보면서 디렉토리 구조가 어떻게 바뀌었는지 살펴보자.
사용자 삽입 이미지 사용자 삽입 이미지
Windows CE 5.0과 Windows Embedded CE 6.0의 디렉토리 변경점

Kernel의 변경된 점
1. Windows CE 5.0
  - OAL + Kernel = Kern.exe
  - OAL + Kernel + KITL = kernKitl.exe
  - OAL + Kernel + KITL + Profiler = kernkitlprof.exe
2. Windows Embedded CE 6.0
  - OAL = oal.exe
  - Kernel = kernel.dll
  - KITL = kitl.dll

아래 그림에서 보는것처럼 6.0에서는 커널과 OAL을 분리했고, 서로 통신하기 위한 수단으로 NKGLOBAL과 OEMGLOBAL이라는 구조를 두었다.
사용자 삽입 이미지
Windows Embedded CE 6.0 PQOAL 디자인

이처럼 구조가 Windows CE 5.0과는 다르기 때문에 6.0으로 bsp를 migration하기 위해서는 구조를 파악하는것이 우선이다.

음...

참고 : 웹캐스트 및 웹 자료

2007. 10. 17. 16:49

Windos CE 5.0 vs. Windows Embedded CE 6.0 ch.1


Windows Embedded CE 6.0을 회사에서 구매하는 바람에.. 기존의 Windows CE 5.0을 6.0으로 mirgration해야한다. 덕분에 공부할 게 생겨버렸고..

먼저 Windows CE 5.0에서 windows Embedded CE 6.0으로 넘어오면서 바뀐점은 무엇인가? 를 알아보자
가장 눈에띄는 점은 명칭이다. ^^;
Windows와 CE 사이에 Embedded라는 것을 넣어서 Embedded라는 것을 강조한 듯 하다.

가상 메모리구조와 프로세스등 많이 바뀌었다.

Windows CE 5.0의 경우..
2G의 커널, 2G의 프로세서를 위한 가상메모리를 지원하고, 최대 32개의 프로세스(슬롯이라 부르는 구조)를 생성할 수 있었다.
메모리는 유저 공간의 상위 반을 공유메모리로 사용하고, 모든 프로세서들에 의해 읽거나 쓰는 공간으로 사용되었다.

Windows Embedded CE 6.0의 경우..
프로세서당 2G의 가상 메모리를 지원하고, 최대 32,000 프로세스를 지원한다고 한다. 말이 32,000이지.. 이론상이다.
통합커널로 핵심적인 OS요소들을 커널공간으로 이동시켜 시스템 성능을 향상시켰다고 한다.

사용자 삽입 이미지
Windows CE 5.0과 Windows Embedded CE 6.0의 메모리 구조 차이

사용자 삽입 이미지
커널 메모리 공간

사용자 삽입 이미지
사용자 메모리 공간

이밖에도 중요 드라이버라든지, 파일시스템, graphical window manager등이 커널로 이동되었다.
사용자 삽입 이미지
새로 바뀐 OS구조

이로써 시스템 오버헤드가 감소하고, 유저 스페이스와 커널 스페이스간의 잦은 이동으로 인한 오버헤드등이 감소하는 등의 장점이 있다.

Windows CE 5.0과 Windows Embedded CE 6.0과의 시스템 호출 구조
사용자 삽입 이미지
Windows CE 5.0의 시스템 호출 구조

사용자 삽입 이미지
Windows Embedded CE 6.0의 시스템 호출 구조

참고 : MS웹캐스트 및 웹 자료..