20160802

OpenSGX 소스 코드 분석
OpenSGX가 어떻게 동작하는지 대강 확인해보았다. OpenSGX를 빌드할 때 약간의 어려움을 겪기는 했으나, 라이브러리를 모두 설치해주면 잘 된다. OpenSGX는 QEMU를 수정하여 구현되어 있다. OpenSGX에서는 QEMU 내부에 SGX를 지원하기 위한 자료구조를 추가하고, 명령 집합을 확장했다. QEMU를 사용해서 바이너리를 실행하면, 바이너리가 내부적으로 확장된 명령 집합을 호출하는 방식으로 enclave를 구현하고 있다. QEMU가 에뮬레이터이고 가상화에 사용된다는 것 정도만 알고 있었고, 실제로 코드를 본 것은 처음이라 신기했다.
내가 이해한 것이 틀릴 수도 있지만, 이해한 코드 구조는 대강 다음과 같다 (QEMU가 enclave 바이너리 실행을 어떻게 지원하는지를 위주로). opensgx 를 실행하면 opensgx는 sgx를 실행한다. opensgx와 sgx는 모두 쉘 스크립트로 되어 있다. sgx는 내부적으로 수정된 QEMU를 실행한다. SGX를 지원하도록 수정된 QEMU는 ./user/sgx-runtime.c를 실행한다. sgx-runtime.c는 SGX 바이너리를 메모리에 올리고 실행하는 역할을 한다. 바이너리를 메모리에 올릴 뿐 아니라, 필요한 시점에 SGX 명령어를 에뮬레이션한다. 기본 실행은 기존의 코드를 따르지만, SGX-specific한 함수들에 대해서는 확장된 SGX 명령어를 사용하도록 한다. 예를 들어, init_enclave()를 호출하게 되면, 이는 sys_create_enclave() -> ecreate() -> ECREATE() -> encls()를 따라 확장된 명령어를 수행하게 된다(./user/sgx-kern.c). 이렇게 QEMU에 삽입된 명령어는 disas_insn()에서 실행된다(./qemu/target-i386/translate.c). disas_insn()에서는 gen_helper_sgx_enclu()를 호출한다. 그리고 이 함수에서는 결과적으로 helper_sgx_enclu()를 사용해 내부적으로 enclave를 생성하는 것으로 보인다 (./qemu/target-i386/sgx_helper.c).
오늘 대강 살펴본 OpenSGX 소스 코드에 대한 내 이해가 맞는지는 확신이 서지는 않지만, 대강의 흐름은 맞는 것 같다. QEMU에 대한 이해가 부족해서 어려움이 있었고, OpenSGX처럼 명령어 확장을 위해 사용하는 사례를 몰라서 더욱 어려웠다. 비슷한 사례를 알았다면 두 가지를 비교해가며 확인할 수 있었을 것 같다.

QEMU에 대한 슬라이드: http://lugatgt.org/content/qemu_internals/downloads/slides.pdf

QEMU에 대해 쉽고 빠르게 이해하는 방법?: 그런 거 없다…
https://lists.gnu.org/archive/html/qemu-devel/2013-01/msg04407.html

On Thu, Jan 24, 2013 at 05:27:00PM +0900, 한상훈 wrote:
> I want to analyze, Qemu Source Code, but It's too big and complex to start by 
> myself.
> Now, i'm trying to understand Make process and analyze 'Makefile'.
>  
> So, I'm writing this mail to get some advice as a new guy in Qemu-devel. 
> I'm looking for the information about Whole QEMU architecture or process 
> logic or build tree, kind of something. 
>  
> Please, help and let me get some useful information about Qemu source code. 
> I want to understand the whole qemu logic.

There is no up-to-date official documentation that will teach you the
QEMU source code.

Start in vl.c:main() and read the code.  See how vcpus are set up and
follow the main loop.

Focus on the aspects that interest you, for example TCG ARM emulation or
kvm on x86_64.  Don't try to follow all code paths at once, just focus
on one configuration.

If you want to understand the Makefile, build with the verbose option so
you can see each command-line:
$ make V=1

Here is a high-level overview of QEMU's architecture:
http://blog.vmsplice.net/2011/03/qemu-internals-big-picture-overview.html
http://blog.vmsplice.net/2011/03/qemu-internals-overall-architecture-and.html

Jan's KVM architecture talk is excellent:
http://www.linux-kongress.org/2010/slides/KVM-Architecture-LK2010.pdf

The best way to get started is by fixing a bug or adding a new feature.
It will give you a real problem to work on and you can learn the
codebase gradually.  The catch is that you need to decide what to work
on yourself, maybe start with the QEMU bug tracker:
https://bugs.launchpad.net/qemu.

Stefan
Advertisements
Tagged with: , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 88,534 hits
%d bloggers like this: