`
micheal19840929
  • 浏览: 163220 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

KVM的类加载

    博客分类:
  • J2ME
阅读更多

首先简要介绍一下class文件的结构(详细内容请参考Java虚拟机规范,在《深入Java虚拟机》一书中也有详细描述):

 

文件系统中的一个class文件,要想成为能在虚拟上运行的Java程序的一部分,必须经过“装载->连接->初始化”三个步骤。其中装载是最基础的一步,它的作用是读取class文件的信息,并生成对象。下面介绍一下KVM中与类加载相关的内容是如何实现的。

 

长度(字节) 名称 解释
4 magic 0xCAFEBABEJava文件的标识,常称为“魔数”
2 minor_version 次版本号
2

major_version

主版本号
2

constant_pool_count

常量池中项目个数
(constant_pool_count-1)*cp_item

constant_pool

常量池,其中存放了(constant_pool_count-1)个常量池项
2

access_flags

class的类型信息
2 this_class

class的全限定名的常量池项索引

2 super_class 超类的全限定名的常量池项索引
2 interfaces_count

实现/扩展的接口数

2*interfaces_count interfaces

实现/扩展的接口名的常量池项索引

2

fields_count

字段数

fields_count* cp_item

fields 字段信息表
2 methods_count

方法数

methods_count* cp_item methods

方法信息表

2 attributes_count 属性数
attributes_count* cp_item

attributes

属性信息表

数据结构:

在头文件kvm/vmcommon/h/class.h中定义有两个非常重要的结构体:
 

/* CLASS */
struct classStruct {
    COMMON_OBJECT_INFO(INSTANCE_CLASS)
    UString packageName;            /* Everything before the final '/' */
    UString baseName;               /* Everything after the final '/' */
    CLASS   next;                   /* Next item in this hash table bucket */
    unsigned short accessFlags;     /* Access information */
    unsigned short key;             /* Class key */
};
typedef struct classStruct*         CLASS;

/* INSTANCE_CLASS */
struct instanceClassStruct {
    struct classStruct clazz;       /* common info */
    /* And specific to instance classes */
    INSTANCE_CLASS superClass;      /* Superclass, unless java.lang.Object */
    CONSTANTPOOL constPool;         /* Pointer to constant pool */
    FIELDTABLE  fieldTable;         /* Pointer to instance variable table */
    METHODTABLE methodTable;        /* Pointer to virtual method table */
    unsigned short* ifaceTable;     /* Pointer to interface table */
    POINTERLIST staticFields;       /* Holds static fields of the class */
    short   instSize;               /* The size of class instances */
    short status;                   /* Class readiness status */
    THREAD initThread;              /* Thread performing class initialization */
    NativeFuncPtr finalizer;        /* Pointer to finalizer */
};
typedef struct instanceClassStruct* INSTANCE_CLASS;

 

classStruct与instanceClassStruct这两个结构体都是与class(可能包括类和接口)有关的,但不所不同。classStruct所提供是一些“外围信息”,包括全限定名和可见性等,是一个class区分其它class的基本信息;instanceClassStruct所提供的是一些“内容信息”,是一个类本身所定义的内容,比如方法表、字段表等等。

 

程序实现:

下面来看一看在KVM中instanceClassStruct的信息是如何读取的。

一个kvm虚拟机在运行时,class来自于两种来源:一是系统类库,这些类来自KVM本身;二是用户程序,来自文件系统。下面分别介绍:

1、前文提到过,对于系统类库,KVM会先把class文件转化为C语言源代码,然后编入kvm可执行程序中,这样当使用系统类库时,kvm就不再访问外部,这一步骤叫可暂称为ROM,ROM过程中所做的事情之一就是生成所有系统类库中class的INSTANCE_CLASS,也就是说,这些类的信息早在ROM的过程中就已准备好,使用时只要读入即可。

ROM生成的INSTANCE_CLASS信息存放在源文件tools/jcc/ROMjavaUnix.c的static struct AllClassblocks_Struct AllClassblocks结构中,使用这一结构的代码也在同一文件中,比如:

INSTANCE_CLASS JavaLangString =
     (INSTANCE_CLASS)&AllClassblocks.java_lang_String;

 

这里就生成了String类对应的INSTANCE_CLASS结构。

2、对于用户定义的类,INSTANCE_CLASS信息就要从文件系统中获得。

获得类信息的主要入口函数是

void loadClassfile(INSTANCE_CLASS InitiatingClass, bool_t fatalErrorIfFail);

在文件kvm/vmcommon/src/loader.c中。其中参数InitiatingClass就是一个空的INSTANCE_CLASS结构体,在loadClassfile函数中,InitiatingClass的内容将被逐步填充。

在loadClassfile中,将调用另一个重要的函数:

static void loadRawClass(INSTANCE_CLASS CurrentClass, bool_t fatalErrorIfFail);

在这个函数中,将调用下列各方法分别载入class文件中的各种信息:

函数名(参数及返回值省略 功能
loadVersionInfo() 载入版本号
loadConstantPool() 载入常量池
loadClassInfo() 载入类型信息
loadInterfaces() 载入所实现的接口
loadFields() 载入字段表
loadMethods()

载入方法表

ignoreAttributes() 载入扩展的属性表
 

上表中的每一个函数都会带有一个FILEPOINTER_HANDLE型的参数,它是一个文件的句柄,这些函数就是从这个文件中顺序读取各种信息并存入INSTANCE_CLASS结构中的。

分享到:
评论

相关推荐

    kvm虚拟机安装介绍,KVM

    在 Linux 系统中,首先我们可以用 modprobe 系统工具去加载 KVM 模块,如果用 RPM 安装 KVM 软件包,系统会在启动时自动加载模块。 加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM 模块是远远不够...

    KVM.rar_kvm

    **四、KVM类的加载** KVM类是用于管理KVM虚拟机的C语言API,主要包含在`<linux/kvm.h>`头文件中。使用这些API,你可以创建、配置和管理虚拟机。例如,创建一个新的虚拟机实例,需要打开KVM设备,分配内存,设置CPU和...

    KVM 虚拟机安装

    如果执行指令后有类似返回,则证明 KVM 模块加载正常,否则检查 BIOS 中是否开启了 CPU VT 支持。 4. 安装 virtsh virt-install 管理工具 使用以下命令安装 virtsh virt-install 管理工具: `yum install libvirt...

    KVM架构及其优点

    KVM架构的工作原理是通过加载KVM内核模块,将Linux内核转换为一个系统管理程序,然后使用QEMU模拟器来模拟硬件环境,最后使用libvirt管理工具来管理虚拟机。这种架构可以提供一个高效、可靠的虚拟化环境,同时也可以...

    kvm虚拟机安装与配置

    如果你的 CPU 是 Intel 的,可以加载 kvm-intel 内核: ``` [root@target ~]# modprobe kvm-intel ``` 如果你的 CPU 是 AMD 的,可以加载 kvm-amd 内核: ``` [root@target ~]# modprobe kvm-amd ``` 我们可以使用...

    KVM 源代码分析-虚拟机创建和运行流程代码分析.pdf

    - **函数`kvm_run()`**:调度vCPU执行,通过`ioctl(KVM_RUN)`将vCPU状态加载到物理处理器并开始执行。 了解这些关键函数和流程对于深入理解KVM的工作原理至关重要,这有助于开发者调试和优化KVM虚拟化环境,以实现...

    KVM(windows)驱动

    KVM(Kernel-based Virtual Machine)是Linux内核中的一个模块,它允许你在Linux系统上运行多个虚拟机。在KVM环境中安装Windows操作系统时,为了确保最佳的性能和兼容性,通常需要安装特定的驱动程序。这些驱动主要...

    kvm_client华为ibmc作系统使用

    将ISO文件加载到KVM虚拟机的CD/DVD驱动器中,这通常可以通过KVM客户端的图形界面完成。 4. 创建虚拟机:在KVM客户端中,创建一个新的虚拟机实例。定义所需的硬件配置,如内存大小、CPU数量以及磁盘空间等。 5. ...

    kvm热添加.docx

    然后,使用 virsh attach-device 命令将 XML 文件加载到虚拟机中。 ``` [root@kvm11 ~]# virsh attach-device web37 web37add02.xml --persistent ``` 2. attach-disk 方式 首先,需要创建一个 qcow2 格式的磁盘...

    Qemu-kvm虚拟化技术介绍.pdf

    如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式,执行异常处理,之后重新进入客户模式,执行客户代码。 二、Qemu原理介绍 Qemu是一个纯软件实现的虚拟化模拟器,能够...

    Linux KVM虚拟化架构

    KVM 是 Linux 的一个模块,可以使用 modprobe 加载 KVM 模块,但仅有 KVM 模块是不够的,因为用户无法直接控制内核模块去做事情,还需要一个用户空间的工具来控制 KVM。 KVM 使用 QEMU 作为用户空间的工具,QEMU 是...

    Ubuntu18.04下的KVM网络配置(附各种问题解答)

    2. 检查 KVM 相关模块和 tun 模块的加载情况:使用“lsmod”命令可以查看 KVM 相关模块和 tun 模块是否已经加载,使用“modprobe tun”命令可以加载 tun 模块。 3. 检查 /dev/net/tun 的权限:/dev/net/tun 是一个...

    Qemu-kvm虚拟化技术介绍.pptx

    KVM(Kernel-based Virtual Machine)是一种基于内核的虚拟机技术,使用libkvm 库通過ioctl 进入内核模式,创建虚拟内存和虚拟CPU,执行VMLaunch 指令进入客户模式,加载 Guest OS 并执行。KVM 模块位于 Linux 内核...

    CentOS8安装KVM虚拟机详解.docx

    安装完成后,检查 KVM 模块是否被正确加载: `lsmod | grep kvm` KVM 相关安装包及其作用: * qemu-kvm:主要的 KVM 程序包 * python-virtinst:创建虚拟机所需要的命令行工具和程序库 * virt-manager:GUI ...

    kvm-kernel

    KVM-kmod,即Kernel Module for KVM,是KVM的一部分,它作为一个内核模块加载到Linux内核中,提供了硬件虚拟化的基础设施。它的主要职责是利用CPU的虚拟化扩展(如Intel的VT或AMD的V技术)来创建和管理虚拟机。 2....

    OSX-KVM-master-2021-12-28.zip

    3. **启动加载器**:由于OSX通常使用Apple的Boot Camp加载器,所以在KVM中安装需要特殊的引导加载器,如 Clover 或 OpenCore。这些加载器能够解析和加载OSX的内核,并处理兼容性和驱动程序问题。 4. **ISO映像**:...

    kvm实战:原理、进阶与性能调优.zip

    - **KVM模块**:KVM是加载到Linux内核中的一个模块,它提供了一个API来管理和控制虚拟机。 - **QEMU**:QEMU(Quick Emulator)是KVM的重要组成部分,负责模拟I/O设备,实现虚拟机与硬件之间的通信。 - **libvirt...

    KVM虚拟机的性能优化

    5. **启动时间优化**:使用预热(preloading)技术,提前加载内核模块和驱动,可以缩短虚拟机启动时间。此外,启用KSM(Kernel Samepage Merging)技术,合并相同页面以减少内存占用,也能提高启动效率。 6. **监控...

    大二下学期KVM虚拟化实践与编程实验报告.zip

    加载ISO映像文件作为启动介质,或者使用预装系统的镜像文件。 5. **虚拟化应用实践**:实验可能包括在虚拟机上安装不同的操作系统,如Windows、Ubuntu等,体验不同系统的特性。还可以进行多虚拟机间的网络通信测试...

    liunx 安装KVM(win7)文档.docx

    liunx 安装KVM(win7)文档,所需安装包,安装程序步骤,详细解说,一、环境介绍 操作系统:centos6.6 内核版本:2.6 IP地址:172.16.57.24 二、检查CPU ...5、查看kvm模块是否正常加载: lsmod |grep kvm

Global site tag (gtag.js) - Google Analytics