xenomai는 Linux와 여러 embedded-OS에 적용할 수 있는 RTOS패치로서
커널패치와 라이브러리로 구성되어 있다.


이번 강좌에서는 Linux x86에 RTOS패치 및 패키지 xenomai를 설치하는 방법을 알아본다.

먼저 xenomai는 pure-linux만을 지원하는데 다음과 같은 설치조합을 만들 수 있다.


     xenomai-2.6.3 --- ipipe-core-3.10.32-x86-2.patch --- linux-3.10.32


 ipipe-core-3.10.32-x86-2.patch는 Adeos프로젝트에서 제공하는 RTOS용 커널패치로서,
 http://download.gna.org/adeos/patches/v3.x/x86에서 구할 수 있다.

 

1. 소스를 푼다.
    a) tar -xf xenomai-2.6.3.tar.bz2
    b) tar -xf linux-3.10.32.tar.bz2
    c) ls
       xenomai-2.6.3
       linux-3.10.32
       ipipe-core-3.10.32-x86-2.patch


 2. xenomai디렉토리로 가서 adeos패치를 실행시킨다.
    a) cd xenomai-2.6.3
    b) scripts/prepare-kernel.sh --arch=i386 --adeos=../ipipe-core-3.10.32-x86-2.patch  --linux=../linux-3.10.32

       64bit 플랫폼에 대해서는 arch옵션에 x86_64를 값으로 준다.  다른값으로는 powerpc, ppc, blackfin, arm이 있다.


 3. 리눅스커널디렉토리로 가서 현 LinuxOs의 Configuration를  목표커널의 Configuration과 일치시킨다.
    a) cd linux-3.10.32
    b) /boot밑에서 현재 설치된(또는 실행중인) 리눅스 커널의 config 파일을 얻어온다.
       파일명은 'config-'로 시작한다.
          cp /boot/config-3.2.0-26-generic-pae .config
       현재커널이 configuration을 /proc파일로 보이고 있다면, /proc/config.gz파일이 있다.
       이것을 사용할 수도 있다.
          zcat /proc/config.gz > .config
    c) make menuconfig(또는 'make xconfig', 'make gconfig')


 4. (Xenomai를 위한) Kernel 파라메터를 세팅한다.
    RTOS는 Power Management에 민감하다. Suspend/Resume을 같은 동작은 RTOS에서 허용하지 않는다.
    USB도 enable시킨다. USB_LEGACY_EMULATION는 시스템성능에 큰 영향을 미친다.

    USB enable은 USB_LEGACY_EMULATION을 disable시키는 효과가 있다.

   a) CONFIG_CPU_FREQ   ---> disable
      "Power Management and ACPI options" -- "CPU Frequency scaling" -- "CPU Frequency scaling"

   b) CONFIG_ACPI_PROCESSOR ---> disable
      "Power Management and ACPI options" -- "ACPI(~) Support" -- "Processor"

   c) CONFIG_APM ---> disable   ;; x64에서는 표시되지 않는다.
      "Power Management and ACPI options" -- "APM(Advanced Power Management) BIOS support"

   d) CONFIG_INTEL_IDLE ---> disable ;; CPU_IDLE에 의존한다.
      "Power Management and ACPI options" -- "Cpuidle Driver for Intel Processors"

   e) CONFIG_CPU_IDLE   ---> disable
      "Power Management and ACPI options" -- "CPU idle PM Support"

   f) CONFIG_CC_STACKPROTECTOR --> x86_64가 아니면 disable
      "Processor type and features" -- "Enable -fstack-protector buffer overflow detection"

   g) CONFIG_AMD_IOMMU ---> disable;  x86_64일 경우

      "Device Drivers" -- "IOMMU Hardware Support" -- "AMD IOMMU support"

   h) CONFIG_PCI_MSI    ---> disable
      "Bus options(PCI etc.)" -- "Message Signaled Interrupts (MSI and MSI-X)"

   i) CONFIG_KGDB  ---> disable
      "Kernel hacking" -- "KGDB: kernel debugger"

   j)  CONFIG_INPUT_PCSPKR---> disable
      "Device Drivers" -- "Input device support" -- "Miscellaneous devices" -- "PC Speaker support"


    CONFIG_ACPI_PROCESSOR이 CONFIG_CPU_IDLE을 선택(select)하기 때문에
    CONFIG_ACPI_PROCESSOR, CONFIG_CPU_IDLE, 이 순서대로 diable시킨다.

 

 5. 커널빌드하고 설치한다.
   a) make
   b) make modules_install; make install

 

 6. 다시 Xenomai디렉토리로 와서 나머지 빌드를 수행한다.
   a) cd xenomai-2.6.3
   b) mkdir ../xenomai_build    # object파일을 위해 따로 폴더를 만든다.
   c) ../xenomai-2.6.3/configure --enable-x86-sep
   d) make; sudo make install
     (디폴트) 설치된 디렉토리는 '/usr/xenomai'이다.

 

 7. 설치된 디렉토리는 '/usr/xenomai'이다.
   a) ls /usr/xenomai
       bin/ include/ lib/ sbin/ share/

 

   b) ls /usr/xenomai/bin
      arith*                        dohell*                        mutex-torture-posix*  wrap-link.sh*
      check-vdso*             insn_bits*                    regression/                  xeno*
      clocktest*                  insn_read*                  rtcanrecv*                   xeno-config*
      cmd_bits*                 insn_write*                  rtcansend*                  xeno-regression-test*
      cmd_read*                irqbench*                     rtdm*                         xeno-test*
      cmd_write*               irqloop*                       sched-tp*                   xeno-test-run*
      cond-torture-native*  klatency*                     switchtest*                xeno-test-run-wrapper*
      cond-torture-posix*   latency*                        wakeup-time*
      cyclictest*                  mutex-torture-native*  wf_generate*

 

   c) ls /usr/xenomai/lib
      libanalogy.a               libpsos.so@                   librtdm.so.1.0.0*     libvxworks.la*
      libanalogy.la*            libpsos.so.0@                libuitron.a                libvxworks.so@
      libanalogy.so@          libpsos.so.0.0.0*            libuitron.la*            libvxworks.so.1@
      libanalogy.so.1@       libpthread_rt.a               libuitron.so@          libvxworks.so.1.0.0*
      libanalogy.so.1.0.0*   libpthread_rt.la*            libuitron.so.0@       libxenomai.a
      libnative.a                 libpthread_rt.so@          libuitron.so.0.0.0*   libxenomai.la*
      libnative.la*               libpthread_rt.so.1@       libvrtx.a                   libxenomai.so@
      libnative.so@             libpthread_rt.so.1.0.0*   libvrtx.la*               libxenomai.so.0@
      libnative.so.3@          librtdm.a                        libvrtx.so@            libxenomai.so.0.0.0*
      libnative.so.3.0.0*      librtdm.la*                     libvrtx.so.0@         pkgconfig/
      libpsos.a                    librtdm.so@                   libvrtx.so.0.0.0*     posix.wrappers
      libpsos.la*                  librtdm.so.1@                libvxworks.a

    

  d) ls /usr/xenomai/include
      analogy/   asm-blackfin/  asm-powerpc/  asm-x86/    posix/     rtdm/     vxworks/
      asm@       asm-generic/   asm-sh/            native/        psos+/    uitron/    xeno_config.h
      asm-arm/  asm-nios2/      asm-sim/          nucleus/     rtdk.h      vrtx/      xenomai@