Dalvik VM 바이트코드 설계 개요

Source

  • Evernote/Technote scraps/Bytecode for the Dalvik VM.md

Summary

이 문서는 Android의 Dalvik 가상 머신(DVM) 바이트코드의 일반적 설계 원칙을 설명한다. DVM은 레지스터 기반이며, 프레임 크기가 고정되어 있다. 레지스터는 32비트 값을 위해 32비트 너비로 사용되며, 64비트 값은 인접한 레지스터 쌍을 사용한다(정렬 제약 없음). 객체 참조는 단일 레지스터에 저장되며, null은 0과 동일하다. 메서드 인수는 호출 프레임의 마지막 N개 레지스터에 할당된다. 명령어 스트림의 저장 단위는 16비트 무부호 정수이다. 명령어는 타입에 따라 불필요하게 제한되지 않으며(예: 32비트 이동 명령어는 int/float 구분 없음), 문자열, 타입, 필드, 메서드에 대한 별도의 상수 풀을 가진다. 대부분의 명령어는 첫 16개 레지스터만 주소 지정하지만, 일부는 최대 256개 또는 65535개 레지스터까지 지원한다. 가변 길이 데이터 페이로드를 위한 ‘의사 명령어(pseudo-instructions)‘는 4바이트 정렬되어야 하며, 필요시 nop 명령어로 패딩된다. 실행 시 정적 링크 최적화를 위해 명령어 형식이 변경될 수 있다. 인간 가독성을 위해 목적지-출처 순서, 타입 접미사(-wide, -int 등), 및 오퍼코드 변형 접미사(/from16 등)를 사용한다.

Key Points

  • Dalvik VM은 레지스터 기반이며 고정 크기 프레임을 사용한다.
  • 32비트 값은 단일 레지스터, 64비트 값은 인접 레지스터 쌍 사용 (정렬 제약 없음).
  • 메서드 인수는 호출 프레임의 마지막 레지스터들에 할당되며, 인스턴스 메서드는 ‘this’ 참조를 첫 인수로 받는다.
  • 명령어 스트림은 16비트 단위로 구성된다.
  • 타입에 따른 명령어 중복을 피하기 위해 타입-일반적 명령어를 사용하며, 필요시 타입 접미사를 붙인다.
  • 대부분의 명령어는 v0-v15 레지스터만 주소 지정하지만, 확장 명령어는 v0-v255 또는 v0-v65535까지 지원한다.
  • 가변 길이 데이터용 의사 명령어는 4바이트 정렬되어야 하며, 정렬되지 않을 경우 nop 명령어로 패딩된다.
  • 실행 시 정적 링크 최적화를 위해 명령어 형식이 변경될 수 있다.
  • 명령어 명명 규칙: 목적지-출처 순서, 타입 접미사(-wide, -int 등), 오퍼코드 변형 접미사(/from16 등).