1/29/2018

무료 OrCad 및 PCB View Tool

1. OrCad 

orcad dsn viewer free download
Trial version이라서 제약이 있으며, 보는 정도로만 보자
  https://www.orcad.com/resources/orcad-downloads

SW Debugging 용이라면 각 Pin 연결상태를 쉽게 확인가능하며, 회로도 전체구성을 쉽게 알수 있으나, 
요즘 거의 SW 엔지니어에게 PDF로 나오기 때문에 나의 경우는 Pin 연결된 부분 찾기 정도로만 사용 


2. PCB Viewer Free 

사이트에 가입을 하고 간단한 설문조사를 한 후 보내면, 본인 E-Mail로 다운받을 수 있는 주소를 준다.
Free PADS PCB Viewer

SW 엔지니어는 주로 Scope or Logic Analyzer를 이용하여 확인할 경우, Board의 정확한 위치를 파악하기 위해서 상위 Tool을 사용한다.
  
  • 기본사용법
PCB는 각 Layer 가 존재하며, 각 Layer 별로 볼 수가 있다. 
보통 Top/Bottom 기반으로 찾아서, Layer를 찾아 각 Net으로 연결상태 확인 및 Pin 정보확인
  1. 우선 Layer 별로 볼 수 있도록 설정부분 확인 
  2. Net으로 양쪽 연결상태 확인 및 Pin 정보확인 

각 회로도 용어는 상위 두개가 동일하므로, 전체 구성을 OrCad로 확인 후 
실제 위치를 PCB Viewer로 찾으면 된다. 

1/28/2018

SD Card Formatter 와 SD Card Writer

1. SD Card Formatter 

Download
  https://www.sdcard.org/downloads/formatter_4/eula_windows/index.html

  SD_CardFormatter0500SetupEN.exe





2. SD Card Writer 

SD Card를 Writer 하는 Tool 이며,  Raspberry Pi를 하면서 알게된 Tool 인데, 아래의 프로그램과 차이점은 아직 발견을 못했다.
다만 기존 Win32 Disk의 경우 간혹 잘못 Write 되는 경우가 발생하는 것을 봐서 2번씩 꼭 했는데, 이것은 아직 잘 모르겠다.
추후에 시간이 있을 경우 이를 파악해보자

기존의 Win32 Disk Imager
  https://ahyuo.blogspot.com/2016/05/sd-card-writer-window.html

Download
  https://etcher.io/

  Etcher-Setup-1.4.4-x64.exe




Eclipse Oxygen 설치 및 설정 및 소스분석

1. 기본개발환경 구축 

이전 Version Eclipse CDT에서의 개발환경구축 
만약 Linux Server를 별도로 두고 Window에서 Samba로 볼경우 

  • Eclipse CDT의 사용방법 - 1. Project 생성전 확인사항
  1. Virtual Box : Linux Server 설치 및 SSH Server 및 Samba 설정 
  2. Window    :  Eclipse CDT 설치 및 관련설정 
  https://ahyuo.blogspot.kr/2016/04/eclipse-neon-cc.html


1.1 Eclipse Oxygen for Window 설치 

Eclipse 새 버전 Oxygen을 아래의 사이트에서 Download하여 Window에 설치를 진행하자
그리고, 요즘 Chip Vendor에서 나오는 개발툴을 대체적으로 보면 대부분 Eclipse 기반으로 구성이 되어있다 (TI의 CCS)


  • Eclipse Oxygen Download 

  https://www.eclipse.org/downloads/

이미 Eclipse Neon을 설치한 상태에서 진행을 했으며,eclipse-inst-win64.exe 실행을 하면 아래와 같이 나오면 당연히 Eclipse IDE for C/C++ 선택

아래의 PATH로 가면 기존의 cpp-neon도 확인 가능하며 지울때 이곳과 본인의 workspace를 지우자




설치후 첫화면 동일 Neon 과 동일


Help->about Eclipse 에서 각 아이콘을 확인하자 (CDT 부분 확인)




1.2 Eclipse 추가 설정 및 기능확장 

Help->Eclipse Marketplace 가보면 추가로 설치가능
기본전체구성을 보면 아래의 Marketplaces를 3군데를 선택가능
  1. Search : 검색 
  2. Recent : 최근 나온것들 
  3. Favorites:  선호하는 것들 
  4. installed : 현재 설치된 플러그인 확인 

아래와 같이 유명한 프로그램들을 설치해보자. (개발관리툴 및 SVN 기타 등등)





2.  Project 생성 및 제거 

크게 변경된 것이 없으므로 아래와 동일하게 구축을 하자
  • Eclipse CDT의 사용방법 - 1.1 Project 생성 및 제거 참고 
  https://ahyuo.blogspot.kr/2016/04/eclipse-neon-cc.html



3. Project의 생성후 및 Eclipse 설정 

Eclipse의 설정은 전에도 설명했듯이 아래의 두군데에서 설정이 보통하는데  두 설정이 공통되는 부분이 많기 때문에 다 봐야 한다.

KERNEL or UBOOT 분석을 한다고 하면 대부분 Index가 완벽하게 동작하기를 바라지만 완벽히 동작하지 않기에
아래와 같이 세부설정을 아래와 같이 해야한다

Index 관련부분은 본인의 workspace의 아래 부분에 저장되며, Project delete를 하면 다 지워진다.
만약 문제가 발생한다면 제대로 지워 졌는지 확인하자

.metadata\.plugins\org.eclipse.cdt.core

  1. Window->Preferences :  전체 설정 
  2. Project->Properties : Project 만 관련 설정 
이 곳에서는 Project의 Properties 설정만 보기로 하겠다 아래의 참고를 참고 

  • Eclipse CDT의 사용방법 - 2. Eclipse 설정 참고 
  https://ahyuo.blogspot.kr/2016/04/eclipse-neon-cc.html


3.1. Project->Properties 설정

기존에는 아래와 같이 생성된 Project의 세부설정을 모르고 살았지만, 최근에 세부설정을 하는 법을 알아서 아래와 같이 설정을 해본다.

거의 모든 Index는 대부분 거의 알아서 찾지만 못찾거나 특수한 경우 아래와 같이 설정하여 보자

  • Resource
UTF8/MS949 로 설정을 하여, 본인 소스 수정시 파일이 깨지는 일이 주의하도록 하자
이부분은 특히 한글로 주석을 할 경우 조심해야한다.



  • Resource->Linked Resources
아래와 같이 Project 의 설정된 PATH를 확인 (Window의 네트워크 드라이브 연결됨 확인)
PROJECT_LOC 확인



  • C/C++ General->Code Analysis 
Editor View 를 보면 아래와 같이 Code를 분석을 해주어서 에러인지 파악을 쉽게 해준다. 
본인이 원하는 기능만 선택하여 사용 가능하다.

Code Analysis 생성하여 코드의 오류를 감지하는 기능이다.
이부분은 Indexer 처럼 처음에 만들어주어야 한다. (시간이 많이 걸림) 



  • C/C++ General->Indexer 
Enable project specific settings 설정이 기본으로 안되어있지만, 이를 설정하고 아래와 같이 설정을 해준다.
원래대로 하고싶다면, Enable project specific settings 제거

아래와 같이 사용되지 않은 header들의 index하지 않는으며, 실제 위치를 찾아준다





C/C++ Indexer로 진행이 되며,  시간이 많이 걸림

  • 에러가 발생할 경우 에러원인을 제거
/TEST_LINUX_AM/ 의 PATH 아래와 동일하며, .setting 부분을 제거 해주자.

$ cd ~/am335x/ti-processor-sdk-linux-am335x-evm-03.00.00.04/board-support/linux-4.4.12+gitAUTOINC+3639bea54a-g3639bea54a
$ rm -rf .setting 

Error: Exception occurred while saving project preferences: /TEST_LINUX_AM/.settings/org.eclipse.cdt.core.prefs.
Exception occurred while saving project preferences: /TEST_LINUX_AM/.settings/org.eclipse.cdt.core.prefs.




  Project->Properties
  https://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Freference%2Fcdt_u_prop_general_idx.htm

  Window->Preference
  https://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Freference%2Fcdt_u_indexer_preference.html


  • C/C++ General->Paths and Symbols  (중요)
Index는 생성 되었지만, 정확한 #define 과 include 파일들을 인식을 못하는 경우가 발생한다.
이를 인식하기 위해서 아래에 강제로 include directory를 추가하자

  1. Includes 파트 선택 
  2. GNU C 선택 및 ADD 
  3. Workspace 선택 
  4. 해당 소스파일에서 include 파일 선택 

Uboot 분석 할 경우의 예

Source Location 선택후 빌드 PATH 확인 (UBOOT) 후 그 기반으로 추가 


커널 분석 할 경우의 예

Source Location 선택후 빌드 PATH 확인 (TEST_LINUX_AM) 후 그 기반으로 추가


아래와 같이 필요한 include를 상위 Source Location 기반으로 넣지만, 필요 없다면 넣지 말자.(index시간이 너무길다)

include
include/uapi
arch/arm/include
arch/arm/include/uapi


본인이 원할 경우만 사용 (세부설정)

Uboot or Kernel 일 경우 내부 header에 __KERNEL__ 이라고 되어 있는 것들이 있다.
이 것은 대부분 make 할 때 외부옵션으로 -D 로 넣어주는데 이것을 넣어주는 역할이다.
  1. #Symbols 파트 선택 
  2. GNU C 선택 및 ADD 
  3. Name 에 #define 할 이름 과 Value 값 설정 



분명 Eclipse를 사용하다 보면 잘못 인식하는 부분이 발생하는데, 이를 위해 Include or Symbols에 수정해주자.

  • C/C++ General->Preprocessor Include Paths,Maros etc. 
프로젝트에 전체 해당되는 #include 파일 인식안될 경우 아래에서 이를 처리하자
이곳도 상위 부분과 유사한 것 같은데, 좀 더 자세히 설정을 하는 것 같다.

  1. Entries->GNU C 선택 
  2. CDT User Setting Entries 선택 및 ADD 
  3. Add 창에서 Preprocessor Macros File 변경 
  4. include/linux/kconfig.h  추가 
  5. include/generated/autoconf.h 추가 (kconfig.h 에 include 되어있음, 옵션) 

Linux Kernel make menuconfig를 하면  config file은 .config 에 저장하며, 이것을
다시 #define 으로 변경하는 것은 autoconf.h 파일이므로 이부분을 추가하는 것이다.


본인이 설정된 Define만 볼경우

그리고 이 부분을 Kernel source에 적용하여 필요 없는 부분을 안보려는 것이다.
요즘 Uboot , Linux Kernel 설정과 동일하게 변경이 되어 위와 같이 하면 된다.



  • 기타 설정사항 
C/C++ General->File Types :  간혹 확장자가 잘못된것도 넣어야 할 경우 이곳을 보자. 
C/C++ General->Formatter :  본인이 보기 원하는 스타일로 변경  


  • Task 관련 설정 사항 (아래 다시 설명)
Task Repository :Task 확장기능으로 Bugzillar 와 이슈를 연동하여 이를 설정
Task Tags  : 아래세부 설명 


  • Kernel Source 분석
  아래 사이트 에서 감사하게 좋은 정보를 주어서, 저도 이것을 적용해보게 되었다.
  http://nophotoplease.tistory.com/129
  https://wiki.eclipse.org/HowTo_use_the_CDT_to_navigate_Linux_kernel_source


  •   참고자료 
  http://copyx.tistory.com/8
  http://ezkorry.tistory.com/185
  http://rinovation.tistory.com/68


3.2 Project Property의 Index 설정보완

만약 상위 설정에도 Index가 잘 찾지 못한다면 아래의 설정에서 전체 부족하다면 Index를 좀 더 보완 해보자
우선 Index를 다시 만들어 보고, 문제가 있다면 이제 다시 분석해서 보완해보자

  • 전체 Index의 Refresh 및 분석기능 
  1. Project->C/C++ Index 선택 
  2. Rebuild : 다시 Index를 만드는 기능같다. 
  3. Freshen All Files : 새로 생긴 파일들을 추가하는 기능같다 
  4. Update with Modified Files : 변경된 파일만 다시 Index에 추가해보자 
  5. Re-resolve Unresolved Include:  아래 인식 못한 include를 다시 동작되는 확인기능
  6. Search for Unresolved Include :  현재 분석을 못하는 Include파일을 이것을 이용하여 파악 
  7. Create Parser Log File



  • Index 문제 분석 및 보완 (상위 참조 ) 
  1. Project->Search for Unresolved Include   문제 파악 확인 
  2. Project->Properties->C/C++ General->Paths and Symbols 이를 보완 
  3. Project->Re-resolve Unresolved Include:  문제해결 확인 
   아래와 같이 찾지 header 파일을 찾지 못하는 경우 발생



  • Index 부분 설정 이용 
Index 작업은 시간이 많이 걸리므로 부분작업으로 해도 괜찮은 것은 아래와 같이 진행하자
  1. 좌측의 Project 창에서 우측 마우스와 함께 Index 선택 
  2. 상위 메뉴와 동일메뉴 선택가능 
  3. 이 적용부위는 폴더 단위로 설정이 가능


상위 방법으로 해도 안되는 것들이 많이 존재하는데, 이유는 Kernel or Uboot 경우 여러 ARCH를 사용을 하고 여러 Board를 지원을 하다보니 include 파일이 제대로 연결이 안되는 경우는 발생한다.

완벽하게 하고자 한다면, 본인의 ARCH와 Board를 정보를 알고 나머지를 Project에서 제외하는 것이 좋을 것이다.

3.3 Project에서 필요 없는 파일제외

소스가 너무 많아 필요 없는 파일이 많을 경우가 있을 경우 아래와 같이 분석한 다음 이를 제거하여 혼란을 줄이자
여기서 제거하는 것은 실제 소스를 지우는 것이 아니라 Project에서 제외만 하는 것이다.

Linux Kernel의 경우를 보면 Project 위치로 간 후 상위 File을 찾아 보면 AM335x와 상관이 없는 파일이다.
SSH로 로그인하여 아래와 같이 쉽게 빌드된 소스만을 쉽게 파악이 가능하다

$ cd ~/am335x/ti-processor-sdk-linux-am335x-evm-03.00.00.04/board-support/u-boot-2016.05+gitAUTOINC+b4e185a8c3-gb4e185a8c3/arch
$ find . -name *.o
./arm/lib/bootm-fdt.o
./arm/lib/bootm.o
./arm/lib/eabi_compat.o
./arm/lib/interrupts.o
./arm/lib/reset.o
./arm/lib/vectors.o
./arm/lib/sections.o
./arm/lib/crt0.o
./arm/lib/stack.o
./arm/lib/built-in.o
./arm/lib/relocate.o
./arm/lib/cache.o
./arm/lib/cache-cp15.o
./arm/cpu/built-in.o
./arm/cpu/armv7/am33xx/board.o
./arm/cpu/armv7/am33xx/mux.o
./arm/cpu/armv7/am33xx/emif4.o
./arm/cpu/armv7/am33xx/built-in.o
./arm/cpu/armv7/am33xx/clock.o
./arm/cpu/armv7/am33xx/clock_am33xx.o
./arm/cpu/armv7/am33xx/sys_info.o
./arm/cpu/armv7/am33xx/ddr.o
./arm/cpu/armv7/am33xx/clk_synthesizer.o
./arm/cpu/armv7/built-in.o
./arm/cpu/armv7/omap-common/reset.o
./arm/cpu/armv7/omap-common/boot-common.o
./arm/cpu/armv7/omap-common/utils.o
./arm/cpu/armv7/omap-common/mem-common.o
./arm/cpu/armv7/omap-common/built-in.o
./arm/cpu/armv7/omap-common/lowlevel_init.o
./arm/cpu/armv7/omap-common/omap-cache.o
./arm/cpu/armv7/cache_v7_asm.o
./arm/cpu/armv7/syslib.o
./arm/cpu/armv7/start.o
./arm/cpu/armv7/cache_v7.o
./arm/cpu/armv7/cp15.o
./arm/cpu/armv7/cpu.o

상위 파일을 보고 필요 없는 파일들을 나의 Project에서 제외시키자



4.  Eclipse 에서 Index를 이용하여 소스 분석 

상위 문서를 참조해서 Project를 생성후 Index를 만들어 졌다면 아래와 같이 Call Hierarchy 기능 및 Outline 기능을 이용하여 쉽게 분석하자.


4.1 Index기반으로 소스분석방법

소스분석을 위해서 기본으로 사용되어지는 View이며, 볼수 없다면  Window->Show View->Other 이용

  1. Project View
  2. Outline View
  3. Editor View  
  4. Outline View

  • Main Menu->Navigate 기능 
Open Declaration 부터 Open Resource 까지 기능 숙지



  • Editor View에서 함수 선택 우측 클릭 후 Open Call Hierarchy 선택 
소스에서 각 함수의 우측버튼을 누르면 다음과 같이 볼수 있다.
  1. Open Call Hierarchy : 이 함수가 어디서 호출되는지 관련함수들 
  2. Open Type Hierarchy: 이 구조체  구조를 쉽게 파악 
  3. Open Declaration : 이 함수가 정의된 곳

우측의 Outline창 이용하여 쉽게 함수를 검색하자.



4.2  OUTLINE 이용

아래와 같이 OUTLINE 창을 보면 Header 와 함수 및 기타 정보가 나오며, 그것을 클릭을 할 경우 관련된 곳으로 자동으로 이동이 된다.



4.3 Task Tag 설정방법 

Task Tags기능은 각 TAG 와 우선순위를 정하고 각 소스에 주석으로 넣어 관리하는 시스템이라고 생각하면 되겠다.

한마디로 주석(TAG)을 이용하여 빠른 검색을 하여 원하는 위치를 찾는것이다.
위와 같이 관리하기 때문에 주석을 만들때 본인이 신경써서 만들어야한다.

Task Tag는 Indexer 기반으로 하므로 설정을 변경하면 Indexer가 다시생성된다. (주의)


  • Project->Properties->Task Tags 확인
주석의 TAG를 이용하여 쉽게 위치를 찾아주는 기능으로 아래와 같이 설정하면 된다.
Task Tags 설정 후 Configure Workspace Setting 창 설정




  https://www.eclipse.org/pdt/help/html/task_tags.htm



  • Task의 Tag 설정 
Task의 에서 TAG는 프로젝트내에 존재하는 소스의 주석에 각각의 TAG라는 것을 정의하고 이에 우선순위를 부여하여 소스를 보다 쉽게 관리를 한다. 

  1. Window->Preferences 실행 
  2. C/C++ -> Task Tags 선택 
  3. 우측 New or Edit 선택 (TAG 및 우선순위변경)



표준으로 사용되는 Tags들이 존재하며 Tag에 우선순위를 부여가 가능하며, 이는 주석에서 사용되어진다
그리고, 자신이 별도로 Tag를 정의해서 사용하고 싶다면 새로 정의해서 넣으면 된다.
개별 프로젝트일 경우 유용하며 소스찾기 또한 편한다.


  • 기본사용되는 TAG들 의미 
GNU프로젝트를 대체적으로 보면 아래의 3개의 TAG들을 많이 사용을 하는데, 각각의 의미를 알아두자

TODO 
우선순위에서는 가장 낮을 것으로 생각이 되며 수정해야할 것을 주석으로 간단히 정리한다.
현재소스에서는 크게 문제가 될 부분이라고 생각하기 보다는 구현할 것에 대한 간단하게 기술을 한다.
구현할 것에 필요한 사항을 기술,
소스에 이해를 위해서 다른 내용도 첨가

FIXME
일단 우선순위는 중간즈음 되는 될 것이며, 가장 일반적으로 사용되는 주석으로 사용되는 것 같다.
소스수정을 했지만, 추후에 소스 수정이 필요
지금 동작은 하지만 본인 생각하기에 추가해야 부분 있을 것 같은 생각이든 경우
최적화 되지 않아 이부분을 최적화를 해야 할 경우

XXX 
정확하게 말하면 주의 및 경고단계이며 가장 우선순위가 높을 것으로 생각된다.
소스가 정확하게 혹은 완벽하게 구현되지 않을 경우를 때를 강조
추후에 관련부분을 수정을 반드시 해야하는 경우
소스에서 관련 문제사항이 발생할 경우


  • 상위 TAG들 이외 보통 추가되는 TAG들

  1. HACK
  2. NOTE
  3. 본인이 정의하여 별도 추가가능



4.4 Task View을 이용한  TAG 관리

상위에서 TAG를 설정을 했으니, TASK View를 이용하여 Project의 TAG를 관리를 해보도록 하자.
아래와 같이 주석에 존재하는 TAG들을 이용하여 본인이 수정해야할 곳을 우선순위에 따라 쉽게 알수 있으면, 소스 관리가 좀 더 수월해진다.

  • General->Task View
Window->Show View->Other 선택 후 상위의 Task View를 실행

현재 Item을10892중  100개 밖에 보지를 못하므로 설정을 변경해주자.


Task View 의 우측 필터메뉴로 세부설정


Task View의 아래방향마크 눌러 각각 메뉴를 설정도 가능

  1. Group By-> Type 설정 
  2. Sort By  본인 원하는대로 
  3. Configure Columns ( Columns 을 지우고 싶다면 사용)



상위 TAGS들은 기본으로 들어가있지만, 현재 개발 상황에 따라 다양하게 정의하여 사용이 되어지는 것같으며 본인의 팀에 따라 별도로 TAG를 정의해서 넣어도 괜찮다.

  https://code.google.com/archive/p/editra-plugins/wikis/CommentBrowser.wiki
  https://stackoverflow.com/questions/1452934/what-is-the-meaning-of-xxx-in-code-comments?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

  http://www.panozzaj.com/blog/2010/01/15/todo-fixme-hack-and-xxx/
  http://egloos.zum.com/rucaus/v/2455594
  http://devilbbong.tistory.com/13


4.5. Mylyn->Tasklist 와 ITS시스템 같이 사용  

ITS(Bugzillar, Trac,Redmine)와 함께  상위 TASK를 같이 이용하여 Issue/Ticket으로 신청을하고 각 소스에 상위 TAG를 적용하여,
ITS와 같이 사용하는 것 같으며, 아직 이용을 해보지 못하여 이부분은 추후에 테스트를 해보자
Team으로 할수 있는 일은 이 PlugIn으로 연결하여 사용을하며, Jenkis도 되는 것 같다.

기본적으로 Ecplise에서 이 동작이 가능하려면, 다음과 같은 PlugIn들이 필요하다

  1. Mylyn xxxx
  2. Mylyn Task List PlugIn
  3. Mylyn Tasks Connector-xxxx

  http://www.eclipse.org/mylyn/

  • Task List 창 보기 
  1. Window->Show View->Other->Mylyn 
  2. Task List를 선택 
  3. Task List 창에서 우측 마우스 클릭->New->Task
  4. Add Task Repository ( 본인의 ITS 시스템 선택)

Mylyn과 ITS부분 연결관련 설명 
  http://www.eclipse.org/mylyn/new/new-3.0.html#task-list
  https://www.redmine.org/projects/redmine/wiki/HowTo_Mylyn
  http://www.eclipse.org/mylyn/new/new-3.0.html#bugzilla
  http://www.eclipse.org/mylyn/new/new-3.0.html#trac
  http://www.eclipse.org/mylyn/new/new-3.0.html#jira

  • Main Menu에서 Task 관리 
  1. Navigate->Open Task
  2. Navigate->Activate Task
  3. Navigate->Deactivate Task

  • Search->Search->Task Search 확인 (상위 TASK 종합관리)
좌측을 보면 Repository 설정에 따라 Eclipse에서 진행되는 프로젝트관련사항을 볼수 있다.
그리고, 좌측의 Repository를 Myln-Mantis Support로 변경하면, 관련 기능을 나올것이다.


TASK TAGs
  https://www.lesstif.com/pages/viewpage.action?pageId=19857460


5.1 SCM-GIT 관련 설정 

아래와 같이 우측 아이콘에서 GIT 관련부분을 추가하였으며, 나의 U-BOOT 소스는 GIT 기반이지만, 내가 별도로 Update를 할일이 없다.


중요한 것은 나의 소스인 Working Tree에 문제가 없는 지 확인하고 추후에 Github or 다른 Git Server를 이용시 다시 사용해보자.

  http://jwgye.tistory.com/38
  http://www.yoctoproject.org/docs/2.4.1/mega-manual/mega-manual.html#sdk-eclipse-project

1/21/2018

Hypervisor or VMM(Virtual Machine Monitor)

1. Hypervisor의 기능  

일반적으로 아래의 Wiki를 보면 알겠지만, Hypervisor의 구성에 대한 자세한 설명이 되어 있다.

Hypervisor의 기능을 간단히 설명을 하면  가상의 CPU기능을 제공하여 다양한 OS 사용할 수 있는 선택기능을 제공해주며,
이와 더불어 이 다양한 OS와 통신이 가능한 Interface를 만들어주는 interface를 제공을 해주고 있다. (물론 전가상화 보다는 반가상화를 이용하여 제공)
그래서 가상화를 이용한다면 더불어 발생하는 것이 CPU의 종속이 아니라 이식성이 높은 장점을 가지게 되어질 것이다.

현재 부각이 되는 이유는 점점 CPU 성능이 좋아지기 때문에, 남는 자원을 Hypervisor를 이용하여 다른 별도의 OS로 사용하고 이와 더불어 통신을 하고 사용하는 기술이 대두되고 있다.

  • Hypervisor 의 기본사용 Model 종류  
기본사용모델을 살펴보면, 두개의 모델을 구분해서 생각할 수 있겠다.

https://en.wikipedia.org/wiki/Hypervisor


  • TYPE-1 (native or bare-metal Hyperviors)
동일한 Hardware (CPU) 위에 한개는 Hypervisor 기반으로 2개의 OS 동작이 가능하도록 만든 시스템이다. 
물론 더불어 이들 OS간에 통신도 Hypervisior 를 통해 가능해야 완벽하겠다.
이런 구성은 아직 잘 보지를 못해 뭐라고 말을 못하겠다. 


  •  TYPE-2 (Hosted Hypervisors)
Hardware 위에 기본 Host OS가 동작하며,  Host OS 위에 Hypervisor 가 존재하여 Guest OS를 동작시키는 개념으로 이 Hypervisor는 하나의 Task로 보는 것이 맞을 것 같다.

대표적인 동작 방식이 Window에서 동작하는 VirtualBox or VMware가 있을 것이다.
현재 이와 관련된 Hypervisor는 많기 때문에 아래의 Link에서도 다 확인이 가능하며 무료 Version 인 Virtual box를 설치해보면 알 것이다.

Hypervisor 관련자료 및 가상화 


1.1 가상화와 종류(Virtualization) 

Hypervisor에서는 제공하는 가상화라는 의미를 좀 자세히 알아보도록 하자.
Hypervisor or VMM(Virtual Machine Monitor)일단 가상의 CPU를 만들어야 하며 이와 더불하드웨어의 어느 정도까지를 어떻게 만들 것인지 정해야한다.
이를 Hypervisor에서 말하고 있는 가상화이다.

이를 두고 가상화하는 방식을 두가지 방법으로 나누고 있다.
  1. 전가상화(Full virtualization) 
  2. 반가상화(Paravirtualization)


  • 전가상화(Full virtualization) 
전가상화는 실제의 CPU와 관련 Hardware를 거의 완벽하게 만들어가는 작업이며, 이는 Guest OS의 수정이 거의 필요가 없다
하지만 문제발생이 되는 부분이 있다고하며, Hardware 구성변경이 될 경우 이에 대한 문제가 발생이 되는 것이다.

  • 반가상화(Paravirtualization)
반가상화는 hardware에 부가적으로 붙어있는 환경 즉, 관련 Device들은 가상화를 하지 않는다. 
왜냐하면 CPU는 동일할 수 있지만 관련 환경 Hardware device들은 다르기 때문이다. 
이와 같은 기능을 제공하기에 이식성이 높고 다양한 Hardware를 제공하는 것이 장점일수는 있지만, 
상위 OS와 Hypervisor는 가상화가 되지 않는 부분을 어떻게 해야하며, 다른 OS와 통신하는 방법이 관것일 것이다.
TYPE-1 모델일 경우 봐도 구조상 반가상화하는 것이 맞을 듯 싶다.


2. Hypervisor TYPE1과 Embedded 솔루션 비교  

기존에는 Intel 칩기반으로 많은 가상화 기능이 존재하지만 이는 여기서는 생략하기로 하고 
현재  Embedded 환경에서 사용되어지는 Hypervisor 의 TYPE-1 모델이 사용이 되는가 하는 생각으로 각 부분을 간단히 조사했다. 


2.1 Hypervisor의 TYPE-1 모델 


상위 Hypervisor의 TYPE-1 모델을 다시 생각해 볼 필요성이 최근들어 Embedded에서 발생하는 것 같다.
Main ARM Core, 즉 Multi Core가 SMP(symmetric multiprocessing) 대칭형 다중처리 방식으로 점점 변경되어 가고 있으며, 
특히 Embedded AP에서 Linux에서 SMP를 자주 볼 수 있다.
(SMP는 한개의 커널과 다중코어) 

최근 보면 성능좋은 CPU/AP를 이용하여 서로 다른 두 개의 OS를 이용하여 통신하는 구조로 사용되는 이유를 보면 두 개 Platform 사용 같다. 
Embedded 에서는 Second OS를 RTOS의 이용하여 빠른 Latency 받고 이를 Linux에서 각 적용하는 구조인 것으로 보인다. 
상위 구성을 두 개의 CPU로도 쉽게 구성할 수 있겠지만, HW적으로 분할되기 때문에 상위 모델로 쉽게 사용하는 것으로 보인다.  
물론 CPU/AP 위에 성능이 좋은 OS 1개를 사용하는 방식이 가장 최선일 지는 모르겠지만 
외부에 빠른 처리 와 빠른 Latency가 필요할 경우가 있을 것 같다.

Hypervisor의 TYPE-1 모델위에 별도의 두개의 OS를 사용하면서 통신하고 주고 받는 것이다.
기본 OS는 Linux/Android/WinCE 일 것이며, Second OS는 RTOS이다.

  • SMP/MPP 관련내용
SMP(Symmetric_multiprocessing)
MPP(Massively Parallel Computer)
  https://en.wikipedia.org/wiki/Symmetric_multiprocessing
  https://ko.wikipedia.org/wiki/%EB%8C%80%EC%B9%AD%ED%98%95_%EB%8B%A4%EC%A4%91_%EC%B2%98%EB%A6%AC
  https://ko.wikipedia.org/wiki/%EB%8C%80%EA%B7%9C%EB%AA%A8_%EB%B3%91%EB%A0%AC_%EC%BB%B4%ED%93%A8%ED%84%B0


2.2 SoC와 DSP 솔루션 


TI의 경우 DSP만 출시하여, DSP 독자적으로 사용하거나, ARM Core와 HPI/PCI Interface로 연결하여 사용하여 DSP의 사용확장을 하였다. 

유저가 DSP를 항상 ARM Core와 함께 사용하니, TI에서 Davinci Series를 출시되면서 다음과 같이 ARM과 DSP를 함께 내장하고 이를 통신하는 구조로 변경되어짐
즉 ARM(CPU)와 DSP 혹은 ARM-M3는 존재하여, 각각의 별도의 OS 사용하고 통신을 위해서,
Memory Map IO 방식으로 동일한 주소접근하고 ARM과 DSP 는 Shared Memory 사용함.
 
DSP는 BIOS라는 RTOS를 이용하여 멀티미디어 관련부분을 담당하고, ARM(CPU)는 Linux/Android와 같은 OS를 이용하는 구조. 
TI에서 제공되는 SoC의 경우가 DSP를 내장하거나, ARM-M3(ARM Core)를 내장하여 이를 이용한다.

OMAP 역시 점점 발전함에 따라 점점 DSP의 역할이 점점 줄어들어들고, Graphic 부분는 증가하고 위와 동일한 솔루션을 제공하며, 
GPU 및 더욱 좋아진 Power Management 제공함에 따라 BSP가 복잡해질 뿐이다.
하지만 최근 출시되어지는 AM34xx or AM43 Series는 위와 같은 방식과는 다르다. 

물론 TI만 DSP를 출시하는 것이 아니므로, Qualcomm Chip은 아직 사용해본적이 없기에 TI에만 이야기 하지만 얼추 다 비슷하리나 본다..


2.3 ARM에서 Hypervisor 이용 


이는 최근에 Vendor들이 출시되는 Chip Solution을 보면 ARM의 Hypervisor 기술은 이 중요한 모델인 것 같다.
물론 TI와 비교해서 어느 모델이 더 성능이 나올지는 궁금하지만 현재 이런 솔루션들이 나오고 있으며, 이를 사용하고 있다.

아래의 동작 모델은 ARM 기반의 Hypervisor를 이용하여 통신을하는 방식이며 기존의 TI와는 방식과는  다르다.


3. ARM Hypervisor TYPE-1 솔루션들  


현재 Automotive쪽을 구조들을 보면, RTOS하면 QNX로 가는 추세인 것 같다.
Automotive 사용되는 OS는 Linux or Android등 일반 OS와 함께 사용되어지며, 신뢰성이 보장이되는 RTOS를 두어 위와 같이 구성을 하는 것이 점점 추세로 변경이 되어가는 것 같다.
물론 모든 ARM이 지원이 되는 것은 아니며, ARMv7 이상이 되어야 하며, 다중코어를 사용해야 의미가 있을 것이다.

  • ARMv8 ARM-A 의 57/53의 구조 
ARM은 다중코어를 지원하며 4개 단위로 Cluster로 하여 Big.Little System(8개 코어사용)을 제공해주고 있다.
Big Cluster는 아래의 ARM-A의 57이며, Little Cluster는 ARM-A의 53일 것이다.

  http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/BABIBAED.html


  • ARMv8 Cache 
더불어 아래와 같이 L3 Cache를 제공하여 Cluster 가 공유가 가능한 Cache를 가지고 있다. 
  http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/BABDBFEA.html


3.1 QNX Hypervisor TYPE-1  

Blackberry가 인수한 QNX는 상용 microkernel로 된 RTOS의 한 종류이며 hypervisor 기능을 제공해주고 있다. 
QNX에 대해 좀 더 알고 싶다면 아래의 Wiki를 읽어보도록 하자  


이부분은 본인이 만약 QNX를 사용을 해볼 기회가 있다면 좀 더 자세히 알아보겠지만, 
현재 아래와 같이 Block도로만 구성을 이해할수 밖에 없다. 

  • QNX의 Hypervisor TYPE-1 모델 구성 
  http://blackberry.qnx.com/en/products/hypervisor/index
  https://www.qnx.com/content/dam/qnx/products/hypervisor/hypervisor-product-brief.pdf

  • QNX의 ADAS 모델 
다양한 Chip Vendor들의 Chip에서 제공해주고 있으며, TI 및 Qualcomm도 포함된다. 
하지만, 이것을 사용하는 것은 아마 사용자의 몫일 것 같다. 
  
  https://www.qualcomm.com/solutions/automotive/infotainment


  • QNX의 BIOS 위에 QNX 연결 
  http://www.qnx.co.kr/news/pr_238_1.html


3.2 Xen Hypervisor 기반으로 한 TYPE-1

Xen은 opensource로 반가상화를 제공해주고 있는 Hypervisor Type 1이며, 위의 QNX 모델과 같이TYPE-1 솔루션들을 제공을 해주고 있다.
우선 아래의 Xen Project의 기본 구조을 살펴보자

Xen Project (Open source)
  https://wiki.xen.org/wiki/Xen_Project_Software_Overview
  https://www.slideshare.net/MrCracker/xen-and-art-of-virtualization-xen-architecture

  • ARM과 X86의 비교 사항 



  • PV: Paravirtualized (반가상화)
  • VS: Software Virtualized (QEMU, DevOps에서도 배포할 경우 이용되는 에뮬레이터)
  • VH: Hardware Virtualized (Interrupt와 Timers 만 가상화)
  • HA: Hardware Accelerated ( Page Table로 봐서는 MMU 포함?)


Xen 위에 올라가는 Domain 이라는 가상화 기능이 제공되는 Dom0은 Domain 0을 의미하며, Host Domain이라고 한다.
DomU는 unprivileged domain의 약자로 Dom0의 반대쪽을 의미하고, Dom0보다 우선순위가 낮은 것 같다.

  • Xen 의 Dom0/1 (Guest OS 동작)
  https://wiki.xen.org/wiki/Dom0
  https://wiki.xen.org/wiki/DomU
  https://en.wikipedia.org/wiki/Xen

  • Xen Project 관련내용 및 Guest OS 
  https://www.xenproject.org/developers/teams/hypervisor.html
  https://www.slideshare.net/xen_com_mgr/xen-on-arm-xen-summit-2013-v2
  https://www.slideshare.net/MrCracker/xen-and-art-of-virtualization-xen-architecture


  • PV 반가상화 Driver의 Roadmap Xen
  https://wiki.xenproject.org/wiki/Embedded_and_Automotive_PV_Drivers/Roadmap


  • AUTOMOTIVE Xen 
  https://www.slideshare.net/xen_com_mgr/alss14-xen-project-automotive-hypervisor-demo


  • TI-AUTOMOTIVE Xen
  https://www.slideshare.net/xen_com_mgr/xen-in-oss-based-in-vehicle-infotainment-systems


  • ZYNQ 
  Xilinx에서 나온 Chip으로 아래와 같이 XEN을 이용하여 사용이 가능하다
  https://issuu.com/xcelljournal/docs/xcell_journal_issue_93/36


  • ODROID 
내 개인 Board인 Odroid에도 가능 
  https://wiki.xenproject.org/wiki/Xen_ARM_with_Virtualization_Extensions/OdroidXU
  https://forum.odroid.com/viewtopic.php?f=98&t=6643



3.3 기타 TYPE-2 모델

Linux에서 KVM 기반으로 하면 Type-2가 될 것 같으며, 이는 상위에서 언급된 Virtual Box 비슷할 거라고 생각되어진다. 

KVM (Kernel Based Virtual Machine)
  https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine