2008/05/07 18:09

Distributing Python Modules

Python Module 의 배포를 위해서는 일반적으로 Python Distribution Utilities ("Distutils") 라는 모듈을 사용하게 된다. 작성한 Python 모듈을 패키지할 필요성이 생겨서 이에 대해서 살펴보면서 정리를 한다.

1.1 Concepts

Distutils 를 사용하는 것은 모듈 개발자와 3rd 파티 모듈을 설치하려는 사용자/관리자 모두에게 매우 간단할 일이다. 개발자로서는

  • setup 스크립트를 작성
  • (선택에 따라서는) setup 설정 파일을 작성
  • 소스 배포를 생성
  • (선택에 따라서는) 하나 혹은 그 이상의 개발된 배포파일을 생성

의 일을 갖게 된다.

이러한 태스크들의 각각에 대해서 본 문서에서 설명하게 된다.

more..

Trackback 0 Comment 0
2008/03/13 11:19

Learning Objective-C: A Primer

Objective-C 는 복잡한 객체지향 프로그래밍을 지원하록 설계된 간단한 컴퓨터 언어입니다. Objective-C는 클래스들의 동적 확장을 지원하도록 하는 것 뿐 아니라, 클래스들, 메소드들, 그리고 프로퍼티를 정의하는 신택스를 제공함으로써 표준 ANSI C를 확장하였습니다. 클래스 신택스와 설계는 대부분 최초의 객채지향 프로그래밍 언어 중 하나인 스몰토크에 기반하고 있습니다.

만약 이전에 개발자가 객체 지향 언어를 이용하여 프로그래밍을 해본 경험이 있다면, 다음 정보들은 Objective-C 의 기본 신택스를 배우는데 도움이 될 것입니다. Encapsulation, inheritance, 그리고 polymorphism 과 같은 많은 전통적인 객체지향 컨셉들은 모두 Objective-C에 나와 있습니다. 하지만 몇가지 중요한 차이점이 있는데, 그 차이점들은 본 문서에도 나와있고 더욱 자세한 정보들도 필요에 따라 구하실 수 있을 것입니다.

만약 객체지향 언어를 이용해서 프로그래밍해본 경험이 없다면, 적어도 관련된 컨셉들에 대해서 기본적으로 이해해야 할 필요가 있습니다. 객체들의 사용과 객체 지향 구성 개념은 iPhone 응용프로그램의 설계에 필수적이고, 어떻게 그들이 interact하는가를 이해하는 것은 응용프로그램을 작성함에 있어서 매우 중요합니다. 객체 지향 개념에 대해서 오버뷰를 원하신다면, Object-Oriented Programming with Objective-C 문서를 보시기 바랍니다.

Objective-C 언어와 신택스에 대한 더욱 자세한 소개를 원하시면 Objective-C 2.0 Programming Language 를 보시기 바랍니다.

more..



Trackback 0 Comment 0
2008/03/12 18:29

Tools for iPhone OS Development

iPhone OS 를 위한 응용프로그램을 개발하기 위해서는, Xcode 툴을 수행하는 Mac OS X 컴퓨터가 필요합니다. Xcode 는 애플의 개발 도구 Suite 로써 프로젝트 관리, 코드 수정, 실행환경의 빌딩, 소스 수준의 디버깅, 소스코드 저장소 관리, 성능 튜닝, 그리고 다수의 기능을 제공합니다. 이러한 Suite의 중앙에는 Xcode 응용프로그램이 존재하는데, 기본 소스 코드 개발 환경을 지원하게 됩니다, Xcode 는 개발자가 사용하는 도구로서만이 아니라 iPhone 응용프로그램을 작성하는데 사용할 수 있는 응용프로그램에 대한 소개를 제공하는 다음 섹션까지 포함합니다.

Xcode

개발자의 개발 경험의 중심에는 Xcode 응용프로그램이 있습니다. Xcode 는 당신의 iPhone 프로젝트와 소스 파일들을 생성과 관리, 당신의 코드를 실행환경으로 빌드, 그리고 iPhone 시뮬레이터 혹은 디바이스 상에서 코드의 수행과 디버그하는데 필요로하는 도구들 전부를 제공하는 통합 개발 환경 (IDE)입니다.

그림 1. Xcode 프로젝트 윈도


새로운 iPhone 응용프로그램을 만들기 위해서는 Xcode 상에서 새로운 프로젝트를 생성함으로써 시작합니다. 하나의 프로젝트는 당신의 응용프로그램에 관련된 모든 정보 (소스파일들, 빌드 설정, 그리고 모든 부분들을 함께 담는데 필요로하는 룰)를 관리합니다. 모든 Xcode 프로젝트의 심장은 그림 1에서 보이는 프로젝트 윈도입니다. 이 윈도는 작성하는 응용프로그램의 모든 중요한 요소들에 대한 빠른 접근을 제공합니다. 그룹들과 파일들 목록은 소스파일들과 이러한 소스파일들로부터 생성되는 빌드 타겟을 포함하는, 작성하는 프로젝트의 파일들을 관리하는 곳입니다. 툴바는 공통적으로 사용되는 툴과 커맨드에 대한 접근을 제공하는 반면 자세한 부분은 프로젝트상에서 동작하기 위한 설정가능한 스페이스로서 제공됩니다. 프로젝트 윈도의 다른 부분은 프로젝트에 대한 컨텍스트 인포메이션으로 제공됩니다.

more..



Trackback 0 Comment 0
2008/03/07 17:31

CentOS 5.1 on intel DQ35JO

그간 intel의 VT-d에 관심이 있었어서 VT-D가 가능한 환경을 만들려고 서베이를 좀 했다.
그러던 중에
http://wiki.xensource.com/xenwiki/VTdHowTo
에서 VT-d 가 가능한 환경을 찾았는데. xensource 에서 개발환경으로 사용되는 intel 의 마더보드가

  • DQ35MP
  • DQ35JO

라는 사실을 알게 되었다. 물론 몇가지 더 지원하는 시스템이 있을 것이고, Q35 칩셋을 이용하는 마더보드에서는 지원할 것이라는 어렴풋한 추측이 있기는 하지만.. 괜히 무턱대고 구입했다가 BIOS에서 이를 enable시키지 못해서 ACPI table 에서 찾지 못하게 되면.. 괜히 낭패가 될 것같아서.. 안전빵으로 갔다. (그리고 개인적으로, 옛날과는 다르게, 오버라든지 다른 메인보드의 특별한 기능을 찾을만큼 정열적이진 않아서... 돌다리도 두들겨가는 심정으로.. ^.^)

그림 1. BIOS of DQ35JO

080307-0001.jpg
일단 DQ35JO 메인보드를 구입했고... 책상위에 올려놓고 대충 뚝딱뚝딱 있는 부품들을 모아서 조립했다. 메모리같이 없었던 것은 선배한테 빌려서.. ㅡ.ㅡ. 아무튼 그림과 같이 해당 메인보드의 BIOS 에서
  • VT Technology
  • Intel(R) VT for Directed I/O (VT-d)

가 존재함을 확인했다. (사실 인터넷에서 DQ35JO의 BIOS에서 정말로 VT-d에 관한 enable이 가능한지를 찾을 수 가 없어서 답답했는데... 있어서 다행이었다.)

그리고 현재는 CentOS 5.1 를 하고 있는 중이다. 하지만 설치시 그냥 설치가 되지는 않는데... 설치시에만 pci=nommconf 옵션을 주고 설치해야 한다. 지금은 일단 설치중

Trackback 0 Comment 0
2008/03/07 12:04

iPhone OS Overview

애플에서 2008년 3월 6일 iphone 에 관련된 software roadmap에 대해서 발표했다.

이와 동시에 개발자를 위한 SDK의 발표과 개발관련 자료를 배포했는데, iPhone OS 에 관련된 overview 가 있어서 이렇게 올려놓는다.

iPhone OS Overview

iPhone OS 는 운영체제와 iPhone 과 iPod touch 디바이스에서 네이티브하게 응용프로그램들을 동작하게 하는 기술들을 포함합니다. 이는 공통된 전통(?)과 mac os x 와 많은 하부 기술들을 공유함하지만, iPhone OS 는 사용자의 요구가 분명히 다른, 모바일 환경의 요구를 충족하도록 설계되었습니다. 존재하는 Mac OS X 개발자들은 많은 친근한 기술들을 착을 수 있지만, 그들 역시 오직 iPhone OS 에서만 가능한 Multi-touch 인터페이스, 가속도계 (accelerometer) 지원등의 기술도 찾을 수 있을 것입니다.


more..



Trackback 0 Comment 0
2008/03/04 18:31

asmlinkage

친구랑 이야기 하다가 asmlinkage 에 대해서 말이 튀어나왔다. 사실 예전에 os 수업때 system call 을 만들면서 사용했던 매크로인 것 같은데.. 하면서 xen 의 source 에서 definition을 찾아보았다.

#if defined(__x86_64)
...
#define asmlinkage
...
#endif

...
#elif defined(__i386__)
...
#define asmlinkage __attributre__((regparm(0)))
...
#endif

i386에서 해당 기능을 보자면... kernelnewbies 에서는 다음과 같이 나와있다.

"This is a #define for some gcc magic that tells the compiler that the function should not expect to find any of its arguments in registers (a common optimization), but only on the CPU's stack."

이말인 즉슨... 원래 다들 알다시피 기본적으로는 function call 을 할 때 stack을 통해서 call를 하게 되어있다. 하지만 일부 컴파일러에서 optimization을 하면서 이를 register를 통해서 call 하도록 변경하는 경우가 발생하는데... 이부분은 이렇게 하면 안된다~ 라고 이야기 하고 있는 부분이다. 즉, CPU's stack에서만 아규먼트를 찾아야지, register에서 찾아서는 안된다. 라고 언급하고 있는 부분이 된다.

하지만 이러한 부분은 x86_64 와 i386에서 다르게 처리하고 있다. xen hypervisor 의 소스를 보자면...

 - arch/x86/traps.c
1124  */
1125 asmlinkage void do_early_page_fault(struct cpu_user_regs *regs)
1126 {
1127     static int stuck;1128     static unsigned long prev_eip, prev_cr2;
1129     unsigned long cr2 = read_cr2();

역기서 i386의 경우에는 asmlinkage 가 위에서와 같이 정의된 형태로 해석이 될터이고, x86_64에서는 empty 로 정의가 되었으니 아무것도 없게 해석될 것이다. 이에 대해서 실제 early_page_fault 를 호출하는 부는 어떻게 되어있나 살펴보면...

 - arch/x86/x86_32/entry.S
539 ENTRY(early_page_fault)
540         SAVE_ALL(1f,1f)
541 1:      movl  %esp,%eax
542         pushl %eax
543         call  do_early_page_fault
544         addl  $4,%esp
545         jmp   restore_all_xen

와 같이 arguments를 STACK에 저장하고 이를 해당 call을 수행하게 된다. 이때, call은 asmlinkage를 사용하고 있고 i386에서는 asmlinkage 가 empty가 아니기 때문에, call 의 arguments를 stack에서 찾게 된다.

 - arch/x86/x86_64/entry.S
580 ENTRY(early_page_fault)
581         SAVE_ALL
582         movq  %rsp,%rdi
583         call  do_early_page_fault
584         jmp   restore_all_xen

하지만 위와 같이 i386이 아닌 x86_64 시스템에서는 그렇지 않음을 볼 수 있다. 이는 구조에 따른 calling convention에 관련된 문제인 듯하다. 실제 x86_64 구조에서는 calling convention에서 1~4번 파라메터의 경우, 레지스터에 넣고 5번부터는 stack에 넣어서 처리하게 되어있다고 한다. 하지만 callee가 stack을 이용해서 처리할 때를 대비하여 stack상에 4개의 파라메터를 위한 0x20 (32bytes)사이즈의 stack 공간을 예약한다고 한다.

linux kernel 상에서는 asmlinkage 에 대해서 define 되어있는 구조는 i386 뿐이며, ia64의 경우에는 __attributre__((syscall_linkage))로 선언되어 있고, 나머지에 대해서는 empty 로 defined 되어 있다고도 한다.
Trackback 0 Comment 0
2008/03/03 09:05

Current I/O Virtualization (IOV) Techniques

아래 VMM Software Architecture Options 글에 이어지는 글로 "Intel Virtualization Technology for Directed I/O"의 한 챕터입니다.

Current I/O Virtualization (IOV) Techniques

I/O 장치를 가상화할때, 하부의 가상화 소프트웨어는 해당 장치를 위해서 몇가지 종류의 오퍼레이션을 서비스해야한다. 소프트웨어와 물리 장치들간의 interaction은 다음과 같다.

  • Device discovery: 소프트웨어가 플랫폼상의 장치들을 discover, query, 그리고 configure 할 수 있는 메커니즘
  • Device control: 소프트웨어가 장치와 통신하고 I/O 작업을 초기화하는 메커니즘
  • Data transfers: 장치가 data를 시스템 메모리 로부터/로의 전송하는 메커니즘. 대부분의 장치들은 data를 전송하기 위해서 DMA를 지원하고 있다.
  • I/O interrupts: 하드웨어가 이벤트와 상태 변경을 소프트웨어에게 알릴수 있는 메커니즘

이러한 interaction들 각각은 공통된 가상화 기술의 각각에 대해서 discussion, covering implementation, 극복점, 장점, 단점을 가지고 있다. VMM은 하나의 monolithic 소프트웨어 스택 혹은 hypervisor와 특별한 guest들의 조합이 될 수 있다.

more..


참조

  1. Darren Abramson, "Intel Virtualization Technology for Directed I/O," Intel Technology Journal, Volume 10, Issue 03, August 10, 2006.


Trackback 0 Comment 0
2008/02/29 10:19

FAQ/DoWhile0

커널 코드를 보다보면 #define do {...} while(0) 가 종종 쓰인다. 이러한 부분이 kernelnewbies.org 에 있어서 간단히 정리해 놓는다.

  • (Dave Miller는) Empty statements의 경우 컴파일러가 warning으로 간주하기 때문에 dowhile0 블럭을 사용한다.
  • (Dave Miller는) local variables를 선언하는 basic block으로 간주할 수 있다.
  • (Ben Collins는) 이는 조건이 담긴 코드에서 보다 복잡한 메크로를 사용할 수 있도록 지원하다고 말하고 있다. 만약 몇줄로 이뤄진 하나의 매크로가 다음과 같다면...
#define FOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);

이제 이러한 함수를 다음과 같이 사용할 때:
if (blah == 2)
FOO(blah);

이는 다음과 같이 해석된다.
if (blah == 2)
printf("arg is %s\n", blah);
do_something_useful(blah);;

여기서 보이다시피 원치않게도 do_something_useful은 조건문에 속하지 않게 된다. 그래서
dowhile0를 사용하여
if (blah == 2)
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0);
와 같은 형태로 만드는 것이다.
  • (Per Persson은) Muller 와 Collins가 지적한 바와 같이 block statement를 사용하길 원할때, 몇몇줄의 코드와 local variables를 선언할 수 있다고 언급했다. 그러나 일반적으로 사용할 때는 차라리 다음과 같이 사용하는 편이 더욱 직관적이겠다.
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

그러나 이는 어떤 경우에 대해서는 정상적으로 동작하지 않는다. 다음 코드는 두개의 브랜치를 가지는 If-statement 이다.
if (x > y) exch(x,y); // Branch 1 else do_something(); // Branch 2 그러나 이는 오직 하나의 브랜치만을 갖고있는 if-statement로 해석되게 된다. 다음과 같이...
if (x > y) { // Single-branch if-statement!!! int tmp; // The one and only branch consists tmp = x; // of the block. x = y; y = tmp; } ; // empty statement else // ERROR!!! "parse error before else" do_something();
블럭 뒤에 바로 나오는 semi-colone(;)이 문제가 된 것이다. 이에 대한 해결책은 역시 dowhile0를 사용하는 것이다. 그러면 블럭의 capabilities를 갖는 하나의 statement 를 사용하게 되는 것으로, 다음과 같이 해석될 것이다.
if (x > y) do { int tmp; tmp = x; x = y; y = tmp; } while(0); else do_something();
  • (Bart Trojanowski는) gcc는 dowhile0 블럭을 대체할 수 있는 Statement-Expressions를 제공하고 있다고 언급했다. 이는 위의 장점에 더욱 읽기 쉽다라는 추가적인 장점을 제공한다.
#define FOO(arg) ({         \
           typeof(arg) lcl; \
           lcl = bar(arg);  \
           lcl;             \
    }) 
Trackback 0 Comment 0
2008/02/28 10:56

VMM Software Architecture Options

가상화 레이어 (VMM) 소프트웨어 구조는 세가지 종류로 나워지는게 일반적이다

  • OS-hosted VMMs
  • Stand-alone hypervisor VMMs
  • Hybrid VMMs

위에서 언급한 세가지 VMM 소프트웨어 구조 각각은 나름대로의 장점과 단점을 갖고 있고, 이는 주어진 사용 모델 혹은 시장 세그먼트에 따라서 선택되어야 한다.

OS-hosted VMMs

VMM 소프트웨어 구조로의 한 접근방법은 기존에 존재하는 OS의 인프라 위에서 구현되는 것이다. Figure 1의 VMM에서 보이는 바와 같이 이러한 OS-hosted VMM은 호스팅 OS의 커널 옆에서 수행되고 CPU와 시스템 메모리와 같은 시스템 자원의 제어를 얻어서 하나 혹은 그이상의 guest OS 들을 위한 수행 환경을 생성하는 privileged ring-0 콤포넌트로 구성된다. host-OS 와 guest-OS간의 VMM 커널의 컨텍스트 스위치는 쓰케줄링 정책에 기제되어 있는 주기적인 인터벌에 따라서 혹은 host-OS 의 지원이 필요로 하는 (예를 들어 host-OS 장치 드라이버로 프로그램된 물리 I/O 장치로부터의 하드웨어 인터럽트를 서비스한다던지...) 때 이뤄진다. guest OS 가 물리 CPU상에서 직접적으로 수행되고 VMM 커널의 제어를 받아 host physical 메모리의 특정부분을 직접적으로 수행되는 것이 허용되더라도, I/O 장치들로의 어떠한 접근이든지 기본적으로 VMM 커널에 의해서 인터셉트를 받게되고 VMM의 사용자 수준의 컴포넌트에 의해서 대행된다. (Figure 1의 ULM에서 나타나 있다.) TLM은 host OS의 일반적인 프로세스로 동작하고, guest OS 들로부터 발생하는 I/O 요청에 대해 서비스하는 가상 I/O 장치 모델을 포함하고 있다. ULM 내의 장치 모델은 guest OS들로부터릐 I/O 요청을 조작하는 파일시스템과 네트워킹, 그리고 그래픽 API를 통해서 하부의 host OS의 수행을 요청한다.

Figure 1. OS-hosted VMM
200802280951.jpg
OS-hosted VMM 구조는 다수의 장점을 제공한는데,
  1. VMM이 host OS 를 위해서 개발된 어떠한 I/O 장치 드라이버든지 사용이 가능하다는 점으로, 이는 서로 다른 physical host platform들로의 VMM 포팅이 쉽다는 것을 의미한다.
  2. 게자가 VMM은 host OS에서 제공하는 다른 기능들을 이용할 수 있다. 예를 들어 host platform의 전력관리 기능을 관리한다던지, I/O 자원의 발견을 한더던지 하는 scanning I/O bus를 위한 코드등을 사용할 수 있다.

OS-hosted VMM 의 단점은 신뢰성, 가용성, 보안 등의 이슈가 모두 host OS 에 의해서 결정된다는 점이다. 만약 host OS 가 실패하거나 (일련의 문제로) 무조건 reboot 되어야 한다면 오든 다른 guest OS 들이 서비스를 할 수 없는 상황에 처한다는 점이다. OS-hosted VMM은 또한 VMM과 그 guest OS 뿐만이 아니라 host OS에서 운영되는 다른 응용들과 같이 host OS의 CPU 스케줄링 정책에 의해서 동작한다는 점이다. 만약 주어진 사용 모델이 보안, 가용성, 혹은 실시간 QoS에 관련된다면, 이러한 단점은 허용될 수 없게되기 때문에, 다른 VMM 소프트웨어 구조를 고려해야 할 것이다.

Stand-Alone Hypervisor VMMs

또하나의 대안이 될수 있는 접근은 VMM을 독립적으로 동작하는 hypervisor 의 형태로 구현하는 것으로써 이는 hosting OS에 의존하지 않게 된다. hypervisor 스타일의 VMM은 VMM 자신이 소유하는 I/O 장치 드라이버들, 장치 모델들, 그리고 스케줄러를 포함하고 있다.

hypervisor 스타일 VMM은 guest OS들의 QoS 만족과 스케줄링을 지원하도록 physical platform 자원들의 provisioning을 완전히 제어할 수 있다. hypervisor 스타일 VMM의 추가적인 장점은 I/O 서비스를 위해서 guest OS 요청으로부터 실제 physical I/O 장치 드라이버까지의 코드 패스가 OS-hosted VMM에 비해서 짧다는 점인데, I/O 요청을 수행함에 있어서 두 I/O 스택 (첫째로 guest OS 의, 그리고 두째로 host OS 의 )만을 필요로 한다. 게다가 hypervisor 커널의 사이즈를 제어하고 제한을 둠으로써 VMM은 확장된 보안과 더욱 작은 Trusted Computing Base (TCB)를 제공할 수 있게 된다.

Figure 2. Stand-alone Hypervisor VMM
200802281027.jpg

hypervisor 스타일 VMM의 단점은 제한된 이식성의 손실이라는 점에서 기인하는데, 이는 어떠한 주어진 physical platform을 위해 필요로 하는 I/O 장치 드라이버들이 hypervisor 내에서 개발되어야 한다는 점이다. ACPI 기반의 시스템 전력 관리 (host VMM에서는 host OS의 것을 이요하기만 하면 되었던)와 같은 고급 시스템 기능을 역시 hypervisor 스타일 VMM 상에서도 재구현으 되어야 한다. 현재로서는 full modern OS만큼 복잡하지는 않지만, 성숙한 hypervisor기반 VMM은 시간이 지날 수록 훨씬 큰 사이즈로 커져가고 있고, (예를 들어, TCB 의 사이즈 제한을 통한 향상된 보안 과 같은) 앞에서 언급한 장점들을 조금씩 만족시켜가고 있다.

Hybrid VMMs

hypervisor 스타일 VMM구조의 보안과 신뢰성의 장점을 유지하면서 동시에 OS-hosted VMM 에서 처럼 존재하는 OS와 그에 관련된 장치 드라이버의 장점을 적용하기 위해서 일부 VMM들은 hybrid 접근법을 선택했다.

Figure 3. Hybrid VMM
200802281037.jpg

hybrid VMM 구조에서는 작은 hypervisor kernel (Figure 3에서 보이는 μ-Hypervisor)은 CPU와 메모리자원들을 제어한다. 하지만 I/O 자원들은 deprivileged 서비스 OS에서 동작하는 장치 드라이버들로 구현된다. VMM 안의 host OS의 장치 드라이버들과 유사한 방식으로 서비스 OS 는 동작하며 VMM은 기존의 존재하는 장치 드라이버들을 도입할 수 있게 된다. 이는 서비스 OS 가 μ-Hypervisor에 의해서 deprivileged되어 있다. 또한 VMM을 지원하면서 단독으로 동작하기 때문에 시스템 전체적으로 보안과 신뢰성 향상을 가능하게 한다.

hybrid VMM 구조는 hosted 와 hypervisor 스타일의 VMM의 좋은 성격만을 유지하여 제공하는 반면 새로운 문제점을 가지게 된다. μ-Hypervisor를 통해서 guest OS 와 service OS간에 잦은 privilege 수준의 transition으로 인한 새로운 성능 오버해드 등이 문제점으로 나타난다. 게다가 service OS 의 권한을 뺏은 (deprivilege)것에 대한 장점은 μ-Hypervisor를 통해서 장치 DMA 를 제어하는 하드웨어 지원을 통해서만 가능해진다는 점이다. 이러한 지원을 위해서 VT-d 와 같은 기술들이 사용된다.

참조

  1. Darren Abramson, "Intel Virtualization Technology for Directed I/O," Intel Technology Journal, Volume 10, Issue 03, August 10, 2006.

Trackback 0 Comment 0
2008/02/21 17:30

Intel Virtualization Technology for Directed I/O (VT-d)

어제 가상화에 관심있는 친구를 만나다가 IO 관련 가상화에 대해서 이야기를 조금 해보았는데... 그러면서 궁금해진 점이 virtualization technology for directed i/o 즉 VT-d 에 관련된 부분이었다.

그래서 IOV (I/O Virtualization) 에 관련된 내용을 좀 찾아보았는데... 내용은 다음과 같았다.

Intel Virtualization Technology for Directed I/O (VT-d)

VMM은 guest 소프트웨어로부터의 I/O requests에 대한 가상화를 지원하게 된다. 이를 위해서 현재 사용되고 있는 방법은 device emulation과 para-virtualization이다. 이러한 I/O device 가상화 (IOV) 모델에서, 신뢰성과 보호 수준에서 발생하는, 요구사항은 역시나

  1. VMM에 의해서 장치에 할당된 자원들에 대해서만 접근이 가능하고
  2. 격리(isolate) 를 제공해야 한다는 것이다.

VT-d 는 이를 제공하기 위해서 hardware를 통해서 지원하는 가상화 기능으로

  • hardware assisted remapping 을 이용하여 장치 격리를 제공하고 이를 통한 reliability 와 security의 향상과,
  • 장치들에 대한 직접적인 할당으로 인한 I/O 성능과 가용성의 증대

이다.


그렇다면 hardware assisted remapping 이란 무엇일까?

VT-d 는 장치들의 DMA를 미리 할당된 도메인 혹은 physical memory region들에 한정하는 기능을 제공한다. 이를 위해서는 DMA-remapping으로 알려져 있는 하드웨어 capability를 이용하게 된다. 칩셋의 VT-d DMA-remapping hardware logic은 DMA를 지원하는 peripheral I/O 장치들과 컴퓨터의 physical memory 간에 존재하게 되고, 이를 구현하기 위해서 computer system software로서 프로그램된다. (이를 가상화 환경에서는 VMM이 지원하게 되고, 가상화되어 있지 않은 환경, 즉 native 환경에서는 OS 가 이러한 기능을 구현하게 된다.) DMA-remapping은 incoming DMA request의 address를 현재 physical memory address로 변환하고, system software에서 제공하는 정보를 기반으로 해당 physical address에 접근이 가능한지를 검사하게 된다.

Intel VT-d 는 system software가 여러개의 DMA protection domain들을 만들도록 지원한다. 각각 protection domain은 host physical memory의 일부를 할당받은 isolated environment이다. 여기서 DMA protection domain은 소프트웨어 사용 모델에 따라서 VM에 할당된 메모리로 나타나거나, 혹은 VMM의 일부로써 혹은 VM에서 수행되는 guest OS driver에 할당된 DMA memory로서 나타날 수 있다. VT-d 구조는 system software로 하여금, 하나 혹은 그 이상의 I/O device들을 하나의 protection domain에 할당할 수 있게 한다. DMA isolation은 address-translation 테이블들을 이용하여 해당 physical memory에 할당되지 않은 I/O 장치들로부터 protection domain의 physical memory로의 접근은 제한하여 제공된다. 이는 각각 가상 머신들의 컴퓨터 자원들간의 separation을 보장하도록 필요한 isolation을 제공한다.

어떠한 주어진 I/O device가 임의의 memory location을 접근하려고 할때

  1. DMA remapping hardware는 해당 device로부터 임의의 protection domain에 대한 접근 허용을 위해 address-translation table을 찾게 된다.
  2. 만약 장치가 접근이 허용되는 range 밖의 주소에 접근을 시도하면, DMA remapping hardware는 그 접근을 막고, 시스템 소프트웨어에게 fault 를 report하게 된다.

다음 Figure 1은 VT-d DMA Remapping을 보여주고 있는데, 여기서 Device-1은 Domain-C 에 할당되어 있지 않기에, Device-1이 Domain-C memory location range 를 접근하려고 시도할 경우 VT-d 하드웨어에 의해서 제한되게 된다.

Figure 1. VT-d DMA Remapping.

여기서, 성능을 향상시키기 위해서, I/O device 들과 protection domain들간의 mapping, 그리고 DMA address translation의 page-table entries와 같은 자주사용되는 remapping-structure entries는 캐슁된다. 이에 대해서 VT-d는 Peripheral Component Interconnect Special Interest Group (PCI-SIG) Address Translation Services(ATS) 스펙을 지원하는데 이는 Endpoint Device에서 장치에 제한된 DMA translations에 대한 캐슁을 허용하는 방법을 표준화하고 있다.


I/O performance through Direct Assignment

가상화는 다수의 virtual machines을 하나의 서버에서 생성하도록 지원하고 있다. 이러한 consolidation은 server hardware utilization을 높이는 것이 사실이지만, 추가적으로 server application들의 consolidation으로 인해서 높은 I/O performance를 요구하게 된다. Software기반의 IOV 방법론들은 I/O device들의 emulation을 사용하고 있는데, 이러한 emulation layer를 이용하는 VMM은 hardware device의 VM들에 대한 일관된 view를 제공하고, 이를 통해서 물리적인 장치는 다수의 VM들에 의해서 공유되도록 지원한다. 그러나 이는 high I/O performance device들의 I/O performance를 낮추게 되는데, VT-d 는 VM에 대한 직접적인 device의 할당을 통해서 가상화된 I/O device의 native capability 와 native performance에 대한 손실에 대한 해결책을 제공하게 된다.

이 모델에서는 VMM은 device들이 해당 파티션으로의 직접적인 할당을 가능하도록 하는 제어 기능에 대해서 일부 기능만을 수행하도록 한다. 즉, 파티션이 요청하는 모든 (혹은 대부분의) I/O request들을 진행하기 위해서 VMM이 호출되기 보다는, VMM은 guest software가 system functionality와 isolation에 관련된 조작을 하게 되는 protected resources (I/O configuration accesses, interrupt management 등과 같은)에 대한 접근을 진행하기 위해서만 VMM을 호출하게 된다.

I/O device들의 직접 VM에 할당되기 위해서, VMM 은 DMA request들이 isolation되도록 강제해야 한다. 또한 이렇게 I/O device들이 도메인들에 할당될 때, DMA remapping hardware는 I/O device로부터 해당 도메인이 현재 소유하고 있는 physical memory에 대한 DMA만을 사용하도록 제한하는데 사용되게 된다.

VM 혹은 guest 가 VMM 상에서 수행될 때, Guest Physical Address (GPA)로 알려져 있는, Guest OS의 physical address range로서 제공되는 address space는 실제 Host Physical Address (HPA)와는 같지 않을 수도 있다. DMA capable device들은 physical memory location들로부터/들로의 데이터 전송을 위해 HPA를 필요하게 된다. 그러나 direct assignment model에서는 guest OS device driver는 domain의 control하에 있게되고, DMA capable device이 필요로 하는 HPA 대신에 domain에 알고있는 GPA 를 제공하게 된다. 이때, VMM 은 DMA remapping hardware의 GPA to HPA 변환정보를 이용하여 필요한 변환을 수행하게 된다. 이러한 Remapping을 이용하여, data가 현재 중간에 존재하는 software emulation layer릍 통해서 전송되는 것이 아니라 guest들의 적절한 buffer로 직접적으로 전송될 수 있게 된다.

Figure 2. Software Emulation based I/O vs. Hardware based Direct Assignment I/O


Figure 2는 software emulation based I/O 와 hardware direct assignment based I/O 를 비교해 놓은 것이다. emulation based I/O에서는 중간의 software layer가 VM 과 device 간의 모든 I/O를 제어하는 것을 볼 수 있고, data가 emulation layer 를 통해서 device 로 전송되고 device로부터 emulation layer 로 전송되는 것을 보여준다.

direct assignment model에서는 unmodified guest OS driver가 해당 guest OS 에 할당된 device를 제어하는 것을 볼 수 있다. receive path에서 DMA remapping hardware는 guest OS driver에 의해서 제공되는 GPA를 옳은 HPA로 변환하고, 이에 따라 data는 guest OS의 버퍼로 직접적으로 전송되게 된다. VT-d 의 Interrupt Remapping 지원은 interrupt control 이 직접적으로 VM으로 할당되도록 허용하며, 이를 통해서 VMM의 overhead를 줄일 수도 있게 된다.


Intel VT-d usage models

VT-d를 지원하는 OS들과 VMM들은 I/O memory management의 VT-d functionality를 사용하여 device가 system의 기능에 영향을 줄 수 있는 delinquent DMA를 수행하는 것을 방지하여 protection domain들로부터 device들을 격리시킬수 있게 된다.

VT-d는 서버, 워크스테이션 그리고 software와 hardware의 결합에 의한 새로운 형태의 클래스에 대해서 보안을 제공하고 격리된 수행 공간인 virtual appliance라 불리는 컴포넌트를 수행함에 역시 사용될 수 있다. virtual appliance는 virus scanning과 firewall appliance 혹은 하드웨어 관리 appliance와 같이 미리 정의된 application들 그리고/혹은 service들을 위해서 최적화한 수행환경을 제공하게 된다.

가상 환경에서의 VM들은 응용단에서부터 device단까지 protection domain들로 격리시킬 수 있다. 이러한 방법은 하나의 도메인에서 발생하는 하나의 I/O device에 대한 문제가 다른 도메인들에게 문제를 발생시키는 것을 격리시킬 수 있게 되고, IT 사용자로 하여금 더욱 나은 system reliability 와 uptime을 제공할수 있게 된다.

Test와 development 환경에서도 다수의 VM들을 사용한 서버와, 가상환경에서 동작하는 공존하는 다수의 OS들를 이용한 workstation들은 work partition들을 isolate시킴으로써 장점을 취하게 된다.


Server Usage Models

많은 Server application들은 I/O-intensive 한데, 특히나 networking과 storage에 대해서는 더욱 그러하다. data center 내에서 생겨나는 중요한 I/O 요구사항들은 주로 scalability 와 performance인데, 이러한 부분은 mission-critical 응용들이 가상화된 data center server들과 infrastructure로 옮겨감에 따라서 server consolidation, reliability, 그리고 availability를 제공하기 위해서 필요하다. 또한 정부와 health-care는 동적인 health care 환경에서 mission-critical needs를 만족시키기 위해서 다수의 OS들을 제공하는 다수의 partition들에 대해서 secure I/O를 지원하고 isolation을 통해서 그 장점을 얻을 수 있다. 또한 health care에서 필요로하는 기관간의 개인 정보 보호에 관련된 보안에 대한 효과를 얻을 수 있다.


Enhancing Performance

가상화는 under-utilized server에 대해서 workload의 consolidation을 가능하게 해준다. 더욱 많은 work load가 consolidate됨에 따라서, I/O 의 사용과 bandwidth 가 많이 요구되고, I/O performance가 병목이 되게 된다. 성능을 높이기 위해서 높은 I/O 성능을 요구하는 VM에 대해서 직접적으로 전용의 고성능 I/O 장치가 할당될 수 있는데, Intel VT-d 기반의 I/O 가상화는 multi-port gigabit 그리고 10 gigabit 네트워크 아답터들과 같은 고성능 I/O 장치들로 하여금 platform상에 존재하는 다른 VM들이 고성능 장치의 동작에 영향을 주지 않도록 지원하게 된다. Intel은 PCI-SIG에서 I/O 가상화 스펙에 대해서 적극적으로 참여하고 있으며, 이는 다수의 VM들에 대해서 하나의 장치가 공유될 때에도 본연의 성능이 나오도록 지향하고 있다.


Enhancing Reliability and Security - Native OS and Server Consolidation

consolidated virtualized server들의 multiple I/O 장치들의 사용은 증가하고 있는데, 하나의 가상화된 서버에서 최대 네개의 networking 장치들이 사용되는 것이 찾기 어려운 일이 아니다. Intel VT-d 는 VMM들이 protected domain들에 대해서 이러한 device들을 isolate시킴으로써 reliability와 security 를 향상시키도록 돕게 된다.

지정된 memory range에 대해서 device들의 접근을 제어함으로써 end to end (VM to device) isolation이 VMM에 의해서 제공된다. 이는 security reliability 그리고 availability를 향상시킨다.

Device isolation은 비-가상화 플랫폼에서도 잘 적용될 수 있다. Device driver 개발자는 하드웨어 혹은 원치않는 memory range를 접근하는 device driver DMA를 debugging 하기 위해서 임의의 memory range들에 대해서 device isolation을 사용할 수 있다.


Getting around "Bounce Buffer" Conditions

Intel VT-d DMA remapping 기능을 사용한 시스템 소프트웨어는 bounce buffer conditions을 피함으로써 성능을 증가시킬 수 있다. bounce buffer들이 DMA를 수행하는 32bit device와 32bit address limitation들로 인해서 접근 불가한 physical memory range간에 사용될 때, 시스템 소프트웨어는 buffer 카피들을 수행하지 않고는 data를 high memory로의 data redirect를 사용할 수 있는데 이를 위해서 Intel VT-d DMA remapping을 사용할 수 있다.


Client Usage Models

Intel VT는 3rd party 회사로부터 필수적으로 필요한 security와 deep packet inspection과 Intel vPro technology를 이용한 desktop PC에서의 policy compliance 와 같은 activities를 위한 관리 서비스들을 수행하기 위해서 virtual appliance의 배포를 가능하게 한다. 이러한 tamper-resistant virtual appliance들은 중요한 서비스들을 위해서 더욱 secure하고 안정적인 환경을 제공하고 매우 쉽게 사용할 수 있도록 하나의 패키지에 모든 필요한 소프트웨어들을 포함하게 된다. 이러한 서비스 혹은 관리성에 있어서 VT-d는 가상 머신들을 위한 memory protections와 I/O optimization을 만족시키는 client platform을 제공하도록 isolate되고 control되는 그리고 protect되는 환경을 제공하게 된다.


VT-d based Virtual Appliances

virtual appliance는 application 그리고/혹은 서비스들을 미리정의된 집합으로써 최적화된 self-contained virtual execution environment이다. Lightweight Virtual Machine Monitor (LVMM)은 Intel VT를 사용하는 VMM으로써 두개의 수행 환경으로 client platform을 나누기 위해서 사용된다. 하나는 Windows XP와 같은 운영체제를 수행하기위한 사용자의 VM으로 video 혹은 rendering 응용들과 같은 사용자의 요구사항을 만족시키기 위한 응용, 개발과 테스트를 위한 응용, 그리고 기본적인 사무 응용들을 제공할 수 있다. 또 하나는 service partition (혹은 Server VM)으로 격리된 사용 공간에서 service OS 를 운영하게 된다. 사용자 파티션은 (예를 들어) network interface controller들을 제외한 플랫폼의 모든 장치들을 소유한다. 이때 network interface controller들은 service 파티션에 의해서 소유되는데, 이는 network traffic을 필터링하고 클라이언트 플랫폼을 위해서 다른 VM들에게 network device들을 가상화하게 된다. 서비스 파티션에서 수행되는 관리 응용들은 remote contol을 제공하여, 클라이언트 시스템을 이용해서 플랫폼의 나머지부분과 사용자 환경을 관리도록 지원한다.

Figure 3. Client VMM 구조


Figure 3에서 보여지는 구조는 서비스 파티션이 소유하고 있는 물리적인 network interface card 드라이버를 통한 network traffic 흐름을 보여준다. 브릿지 드라이버는 서비스 파티션 네트워크 스택과 사용자 파티션 네트워크 스택 사이에 패킷들을 라우팅해준다. 사용자 파티션에서는 가상 NIC 드라이버가 사용자 파티션으로 부터 모든 나가는 패킷들을 브릿지 드라이버로 보내고 브릿지 드라이버는 패킷들을 물리 NIC 으로 전달하게 된다.

이러한 네트워킹 구조는 부정적인 네트워크 트래픅으로부터 고수준의 보안을 제공하게 된다. 또한 하나의 파티션과 VT 그리고 VT-d의 사용을 통해서 할당된 자원으로부터의 부정적인 공격을 격리시키는 능력을 제공하게 된다. VT-d 는 가상 가전 기반의 새로운 종류의 응용을 만들어내는 초석을 마련하게 된다. 아는 NIC 장치 모델이 사용자 파티션에 드러난 가상화 schema 보다 잘 동작한다. 이러한 scheme에서는 모든 사용자 파티션의 NIC 장치로의 접근은 intercept되고 부정적인 코드의 확산을 보호하도록 emulate된다.

LVMM과 서비스 파티션은 사용자 파티션에 사상된 DMA 버스 마스터링 장치들로부터 보호받아야만한다. 이러한 DMA-capable 장치들은 정차시스템 메모리에 접근할 수 있고, 의도적 혹은 비의도적으로 LVMM과 서비스 파티션 코드와 데이터구조를 hosting하고 있는 메모리 페이지에 접근(읽기/쓰기)을 할 수 있다. 이러한 접근들은 IT 보안에 문제점을 야기시키고, memory corruption으로 인해서 플랫폼이 쓸모없어질 수 있는데, VT-d 는 이러한 문제점을을 방지하는데 사용될 수 있다.

앞서 언급했듯이, VT-d 는 system memory 에 대해서 두가지 view (Guest Physical Address (GPA) 와 Host Physical Address(HPA))를 허용하고 있다. LVMM은 HPA view, system physical address space 를 유지하고, 사용자 그리고 서비스 파티션들은 그들의 관련된 GPA view 를 유지하게 된다. LVMM은 CPU로부터의 접근을 위해서 GPA to HPA 로 변환하기 위해서 shadow page tables 들을 유지하게 된다. 유사하게 VT-d DMA remapping 엔진들과 관련된 변환 테이블들을 이용하여 LVMM은 모든 DMA-지원 I/O 장치들을 위해서 GPA-to-HPA 사상을 유지하게 된다. Figure 4는 이러한 사용 모델을 나타내고 있다.


Figure 4. 클라이언트 VMM에서의 VT-d 사용 모델


DMA 사상은 다음과 같이 동작한다:

  • 모든 서비스 파티션 메모리 페이지들은 하나의 도메인에 추가되고 서비스 파티션에 사상된 DMA 장치들 (NIC들)은 오직 이러한 패이지들을 통해서만 접근이 가능하다.
  • 모든 나머지 페이지들 (LVMM과 BIOS reserved를 제외한)은 사용자 파티션 도메인에 추가되고, 서비스 파티션에 사상된 페이지를 장치들을 제외한 모든 장치들 (예를 들어 iGFX, PCI/PCIe add-on 카드들 등)은 이러한 페이지들에 접근할 수 있다.
  • LVMM과 BIOS reserved 영역은 VT-d 변환 페이지 테이블에서 빠져있기 때문에 가상화된 환경에 의해서 DMA 접근들로부터 보호된다.

이러한 device-to-domain 사상은 다음과 같은 장점을 같는다.

  • 하나의 도메인에 사상된 I/O 장치들은 다른 도메인의 메모리에 접근할 수 없다. 예를 들어, 사용자 파티션의 PCI/PCIe add-on 카드들은 LVMM 혹은 서비스 파티션에 접근할 수 없다.
  • 서비스 그리고 사용자 파티션의 장치 드라이버들은 GPA-to-HPA 사상을 파악하기 위해서 어떠한 변화 없이 동작한다. 이러한 변환은 장치가 GPA를 통해서 I/O 요청을 이슈할 때 VT-d 하드웨어에 의해서 투명하게 수행된다.
  • 만약 장치가 도메인에 사상되지 않은 주소에 대해서 접근하려고 시도하는 잘못된 동작을 할 경우, VT-d 하드웨어는 fault 를 생성한다. 이러한 fault 는 LVMM에 캡춰되고 서비스 파티션에 알려진다. 서비스 파티션의 추가적인 관리 응용은 fault 의 정에 따라서 에러 메세지를 표시해주거나 platform reboot으로 초기화 등의 적절한 행동에 의한 이러한 fault 를 처리할 수 있다.


Intel VT-d requirements

VT-d 는 Intel Client, Workstation 그리고 일부 Server 에서부터 지원이 시작된다.

하드웨어

  • VT-d 를 지원하는 chipset을 갖는 플랫폼

소프트웨어

  • 가상환경에서 VT-d 기능을 지원하는 VMM (혹은 Hypervisor). VMM상에서 운영되는 Guest 는 수정이 필요없음.
  • native OS 환경 혹은 비-가상화 환경에서는 VT-d protection 특징을 OS 에서 사용할 수 있다.

BIOS requirements for the platform

  • VT-d 를 사용하도록 BIOS 에서 enabling 해주어야 함. BIOS는 VT-d capabilities (예를 들어 # of DMA remap engines etc)를 ACPI table 을 이용해서 VMM에게 드러내도록 해야한다.

결론

VT-d 구조는 완전한 application-to-I/O 장치 데이터 전송 격리를 지원하는 가상화된 환경을 생성할 수 있는 하드웨어 메카니즘을 제공한다. 이는 더욱 가용성있고, 신뢰성있고, 보안에 강한 가상 환경을 생성을 가능하게 한다. VT-d를 이용해서 소프트웨어 개발자들은 높은 가용성을 지원하고, 높은 성능을 제공하며, 증가하는 I/O 요구에 확장성있는 I/O 자원들을 완전히 보호하는 공유를 개발할 수 있게 된다.

I/O 장치 가상화를 위한 Intel 플랫폼에서의 VT-d 지원은 프로세서와 메모리 자원을 가상화하는 기존의 Intel VT 기능을 보완한다. 이를 통틀어서 VT 기술의 로드맵은 Intel 플랫폼의 가상화를 위한 완전한 하드웨어 지원을 제공하는 완벽한 솔루션을 제공한다. I/O 자원들의 가상화는 data center, enterprise, 그리고 home 에서의 새로운 사용 모델의 중요한 셋을 가능하도록 하는 중요한 step 이다.

참조

http://softwarecommunity.Intel.com/articles/eng/1416.htm
Trackback 0 Comment 0