kvm文档翻译-第四章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解移植到特定平台所需的特定...
说明
翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.
为何翻译该文档
此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解
移植到特定平台所需的特定文件和函数
本节介绍必须为每个平台定义的文件和函数
machine_md.h
每个kvm 平台 必须提供一个名为vmport/h/machine_md.h的文件。此文件的目的是覆盖vmcomon/h/main.h中提供的默认编译时定义和声明,并提供特定平台可能需要的任何其他定义和声明。请参阅第6章“编译标志、定义和宏”,以获取端口通常需要重写的定义和声明列表。
所有平台特定声明、函数原型、typedef语句、include语句和define语句必须出现在此machine_md.h中,或直接或间接包含在machine_md.h中,或自动包含在开发环境中的某些文件中,或通过compiLER开关.
平台特定的功能可以出现在任何机器特定的文件中。除非另有说明,任何必需的平台特定函数也可以定义为宏,前提是其实现要小心确保每个参数只计算一次。
File main.c
您通常需要提供适合您的目标平台的main.c的新版本。目录vmextra/src/main.c中提供的默认实现可以用作平台特定实现的起点。有关更多信息,请参阅第7章“虚拟机启动”。
移植相关的运行时函数
每个平台必须定义下面给出的函数(参见vmcomon/h/runtime.h)。它们可以定义为宏或C代码。传统上,C代码放在名为vmport/src/runtime.c的文件中
-
void AlertUser(const char* message)
警告用户发生了严重事件。此函数调用通常位于致命错误之前。
-
cell *allocateHeap(long *sizeptr, void **realresultptr)
创建一个大小(以字节为单位)大约为sizept的堆。堆必须以4的倍数的地址开始。堆的地址作为此函数的值返回。堆的实际大小(以字节为单位)在*sizeptr中返回。释放堆时,放置在*realresultptr中的值用作freeheap的参数。
对于大多数平台,*realResultPtr将被设置为本机空间分配函数返回的实际值。如果该值不是4的倍数,则四舍五入到下一个4的倍数,*sizept将减少4。
-
void freeHeap(void *heapPtr)
释放使用allocateheap分配的堆空间。请参阅上面的heapptr参数的含义.
-
void GetAndStoreNextKVMEvent(bool_t forever, ulong64 waitUntil)
此函数用作虚拟机和主机操作系统的事件处理功能之间的接口。(在vmcomon/h/events.h中定义)有关详细信息,请参阅第12章。
-
void InitializeVM()
以任何必要的方式初始化虚拟机。在许多当前支持的平台上,这是一个不起任何作用的宏。
-
void InitializeNativeCode()
以任何必要的方式初始化本地代码。平台可以使用此函数(例如)初始化窗口系统并执行其他特定于本地代码的初始化。
-
void InitializeClassLoading()
以任何必要的方式初始化类加载器。平台可以使用此功能(例如)执行某些文件/存储系统初始化操作。
-
void InitalizeAsynchronousIO(void)
初始化系统以处理异步本地方法
-
void FinalizeVM()
在关闭虚拟机之前执行任何必要的清理. -
void FinalizeNativeCode()
在本地函数之后执行任何必要的清理。许多平台使用此功能关闭窗口系统。
-
long RandomNumber_md()
返回一个随机数
-
void FinalizeClassLoading()
在关闭类加载器之前执行任何必要的清理。平台可以使用此功能(例如)执行某些文件/存储系统终结操作。
-
ulong64 CurrentTime_md(void)
返回自1970年1月1日UTC以来的时间(毫秒)。在不支持时区概念的设备上,可以接受从1970年1月1日起返回当前时区的时间(以毫秒为单位)。
-
unsigned long *Calendar_md(void)
初始化日历字段,这些字段表示日期的与日历相关的属性。
在设置任何全局变量之前和在初始化内存管理系统之前,顺序调用函数initializeNativeCode()和initializeVM()。
函数FinalizeVM()在FinalizeNativeCode()之前调用。在那些启用了分析的平台上,在对这两个函数的调用之间输出分析信息。这允许探查器在必要时查找有关窗口系统的信息,并使用窗口系统创建其输出。
注意 – 如果要使用KVM运行其他库,如由移动信息设备配置文件(MIDP)或PDA配置文件定义的库,则需要进行其他移植工作,以移植这些库所需的本机功能。
异步本地函数。如果平台支持使用异步本地方法,则必须定义其他特定于端口的函数:
- yield_md()
- CallAsyncNativeFunction_md()
- enterSystemCriticalSection()
- exitSystemCriticalSection()
Note – 函数entersystemCriticalSection()和exitSystemCriticalSection()的接口在vmcomon/h/thread.h中定义。这些函数在§11.4中作了进一步描述.
必需的C库支持
KVM使用以下C库函数:
- String 的操作函数: strcat, strchr, strcmp, strcpy, strncpy, strlen
- 内存的操作: memcpy, memove, memset, memcmp
- 打印: atoi, sprintf, fprintf, putchar
- 随机数生成: rand
- 异常处理: setjmp, longjmp (not absolutely necessary)
如果开发环境没有为这些函数提供定义,则必须自己定义它们,或者使用宏将这些名称映射到开发环境识别的等效函数上。
memmove函数必须能够处理源和目标重叠的情况。函数memcpy仅在已知源和目标不重叠的情况下使用.
函数fprintf和sprintf使用以下格式:
%s, %d, %o, %x, %ld, %lo, %lx, %%
这些格式从来没有选项或标志
没有直接调用printf。
注意 –目录vmextra中包含的组件和随此版本提供的特定于机器的平台可能需要上面未列出的其他本机功能。
- 例如,Metrowerks CodeWarrior允许用户创建前缀文件。
- 有些编译器允许您添加开关-dname=value,这相当于将
#define name value
放在文件的开始处
- 请注意,不同平台上的参数顺序可能不同。例如,函数memset采用参数memset(location, value, count)。相应的palm os函数是memset(location, count, value)。
更多推荐
所有评论(0)