沙箱程序之虚拟机篇

简介:

由上而下的描述。

  • libvirt

最顶层是管理虚拟机的入口,linux开源套件 libvirt(官网:www.libvirt.org):
Introduction

The libvirt project:

is a toolkit to manage virtualization platforms
is accessible from C, Python, Perl, Java and more
is licensed under open source licenses
supports KVM, QEMU, Xen, Virtuozzo, VMWare ESX, LXC, BHyve and more
targets Linux, FreeBSD, Windows and OS-X
is used by many applications

Recent / forthcoming release changes

事实上我刚开始接触的时候只知道virsh用来管理虚拟机,感觉十分奇怪,而virsh其实就是virtual shell,CLI常用的有:list,dumpxml,edit,start,shutdown等,该套件还有一套GUI接口,virt-manager,到了图形界面就相当方便了,跟vmware差不多用法。坦白讲已经这个GUI早已大行其道的时代,我非常热衷于图形界面,因为我属于联想型,发散思维,懒得死记硬背,最好看到图形就知道怎么用,连手册都不用看,马云说“需要看长长说明书的产品就丢掉”,能用超级自动化工具,绝不手工作业,毕竟程序员就是用来发明超级自动化工具的,够懒,才能发明出更好的超级自动化工具。

还要补充一点,虚拟机配置通过xml管理,使用dumpxml命令查看,这个配置文件包含了虚拟机模拟器的路径,你可以在这里将其指向不同的虚拟机,比如x86,arm,mips,powerpc等等。这一点对于以后的安卓沙箱会用帮助。

  • qemu

这一层就到了虚拟机层了,开源项目,但是可以模拟多种cpu,模拟外设,目前我主要修改和编译其中的部分代码来对抗反虚拟机病毒,细节不必透露,以后还会做一些类似ring -1的事情,以后做到了再写一篇更深入的文章。网上有大量资料,目前不多介绍了。centos6,对应的虚拟机版本为2.5,最新版本会有很多新库的依赖,比如libc,有很多坑要填,因此使用老旧的2.5,centos7之后,我们将采用最新版2.12的qemu。这一层所做的事其实和java vm以及.net vm有些类似,还有WebAssemblly。

还有一点,采用增量镜像的好处,第一层为操作系统层,第二层为应用软件层(安装office,wps等样本运行环境),第三层为空(目的是便于镜像还原,由于是空层使得这一层文件非常小,当样本运行过后,用这个很小的空层文件覆盖样本运行后的那个增量,即可将沙箱还原为运行样本之前的面貌)。

  • kvm

hypervisor层,使用了x86 cpu的VT技术,硬件级虚拟化技术,需要开启cpu vt,安装后会在设备目录有一个/dev/kvm设备,运行在内核当中,与之对应的有windows下的hyper-V,还有苹果的什么我忘记了,不重要。这一层可以跟上一层集成在一起,也就是说cpu可以由这一层提供,而外设则由上一层提供。

越往底层写的越少,因为有些不必写,更底层的还没深入研究,我是由qemu切入,然后上下延申,下一篇是驱动篇,由驱动程序入手,窥探操作系统的设计。

目录
相关文章
|
3月前
|
Java
程序计数器和虚拟机栈
这篇文章介绍了Java虚拟机(JVM)的内存结构,特别解释了程序计数器(Program Counter Register)的作用,即用来记录下一条JVM指令的执行地址和行号。
程序计数器和虚拟机栈
|
3月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
5月前
|
存储 Java C++
Java虚拟机(JVM)在执行Java程序时,会将其管理的内存划分为几个不同的区域
【6月更文挑战第24天】Java JVM管理内存分7区:程序计数器记录线程执行位置;虚拟机栈处理方法调用,每个线程有独立栈;本地方法栈服务native方法;Java堆存储所有对象实例,垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息;运行时常量池存储常量;直接内存不属于JVM规范,通过`java.nio`手动管理,不受GC直接影响。
50 5
|
5月前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
66 2
|
5月前
|
监控 算法 Java
Java虚拟机(JVM)使用多种垃圾回收算法来管理内存,以确保程序运行时不会因为内存不足而崩溃。
【6月更文挑战第20天】Java JVM运用多种GC算法,如标记-清除、复制、标记-压缩、分代收集、增量收集、并行收集和并发标记,以自动化内存管理,防止因内存耗尽导致的程序崩溃。这些算法各有优劣,适应不同的性能和资源需求。垃圾回收旨在避免手动内存管理,简化编程。当遇到内存泄漏,可以借助VisualVM、JConsole或MAT等工具监测内存、生成堆转储,分析引用链并定位泄漏源,从而解决问题。
54 4
|
安全 Java Linux
08-JVM的内存结构之程序计数器和虚拟机栈
接下来我们继续深入第二个环节,也就是JVM的内存结构,很多人想到BAT等大厂去面试,但是现在互联网大厂面试几乎都会考核JVM相关知识的积累,所在在了解完了JVM的类加载机制之后,我们有必要一起来学习下JVM的内存区域划分。
94 0
08-JVM的内存结构之程序计数器和虚拟机栈
|
存储 缓存 安全
【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈
【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈
77 0
|
存储 缓存 安全
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈(四)
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈(四)
|
存储 Java 编译器
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈(三)
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈(三)
|
存储 Java 编译器
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈(二)
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈
<JVM上篇:内存与垃圾回收篇>03-程序计数器 | 虚拟机栈(二)