kvm 监控内存,替换页表(linux版的win VT晶核)(这个整复杂了,不用小内核也可以实现,留着吧,主要记录了bootLoad的启动过程)

VT虚拟化驱动入门教程 手把手教VT驱动框架编写及 无视检测和PG的无痕HOOK 阅读详情

 kvm 监控内存,替换页表等问题

一、如何利用kvm 监控整个linux系统

 不过kvm似乎只能监控自己的虚拟机,自己的主机监控不了。那么,只能利用kvm重新启动linux内核。kvm启动可以简化为小内核启动的方式。

利用完整内核:

         1.旧内核有漏洞,引入风险。但是我们只需把完整的内核简化为小内核,不需要完整内核。

         2.目的是启动kvm, ,甚至不需要页表转换,分配器初始化。

         3.应该保留那些内核必要的功能。

选一个较简单的内核作为载体:

sudo apt-get install -y gcc-4.7
sudo apt-get install -y g++-4.7
# 重新建立软连接
cd /usr/bin    #进入/usr/bin文件夹下
sudo rm -r gcc  #移除之前的软连接
sudo ln -sf gcc-4.7 gcc #建立gcc4.7的软连接
sudo rm -r g++  #同gcc
sudo ln -sf g++-4.7 g++

 编译需要降低gcc版本,如上。以linux-2.6.38为例。(gcc 发布时间最好和内核发布时间同步,否则错误比较多)

KVM 是 Linux 的一部分。Linux 2.6.20 或更新版本包括 KVM。KVM 于 2006 年首次公布,并在一年后合并到主流 Linux 内核版本中。

  • gpio – GPIO驱动,与处理器相关
  • gpu – 包括DRM图形渲染架构,访问图形界面的DMA引擎,IMX的IPU图像处理单元等
  •   media  video

以上部分是driver中较上层的驱动,和我们加载kvm无关删掉吧。

 

二、调试内核启动过程

因为我们大幅度修改内核的启动流程,所以记录下内核调试的方法。当然是利用qemu

qemu-system-i386 -s -S -vnc :2 boot_image
其中-s是设置gdbserver的监听端口,-S则是让cpu加电后被挂起。

-s
        Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234 (see gdb_usage).
-S
        Do not start CPU at startup (you must type ’c’ in the monitor).
输入gdb -q
连接gdb server target remote :1234
设置被调试环境架构 set architecture i8086
 qemu的 -S选项相当于将断点打在CPU加电后要执行的第一条指令处,也就是BIOS程序的第一条指令。

 详细的调试细节

三、kvm原始设计流程

一般意义上的kvm需要通过用户态到内核态交互来实现虚拟机的创建和操控。由于我们设计直接用小内核启动kvm,  启动linux原本的内核。所以这里可以简化直接调用内核程序。

1.查询KVM版本的请求操作
ioctl(kvm_fd, KVM_GET_API_VERSION,0)
2.创建虚拟机文件描述符的操作
vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0)
3.设置虚拟机内存
struct kvm_userspace_memory_region region={
        .slot = 0,
        .guest_phys_addr = 0,
        .memory_size = ram_size,
        .userspace_addr = (u64)ram_start
    };
    ioctl(vm_fd, KVM_SET_USER_MEMORY_REGION, &region);
4.新建虚拟CPU
vcpu->vcpu_fd = ioctl(kvm->vm_fd, KVM_CREATE_VCPU, i);
5.运行虚拟机
ioctl(vcpu->fd, KVM_RUN, 0) < 0)
6.接管中断和其他异常

https://github.com/dpw/kvm-hello-world

找到一个简单的虚拟机实例。总之,我的理解是利用接口的原理,直接在内核中创建虚拟机,启动linux就可以了。

* Opens `/dev/kvm` and checks the version.
* Makes a `KVM_CREATE_VM` call to creates a VM.
* Uses mmap to allocate some memory for the VM.
* Makes a `KVM_CREATE_VCPU` call to creates a VCPU within the VM, and
  mmaps its control area.
* Sets the FLAGS and CS:IP registers of the VCPU.
* Copies a few bytes of code into the VM memory.
* Makes a `KVM_RUN` call to execute the VCPU.
* Checks that the VCPU execution had the expected result.

这一段是实现的流程,简单讲就是把要执行的代码二进制数据拷贝进虚拟机,设置相应的vcpu寄存器,启动。

四、启动原生内核

有了上面的基础,我们其实就可以实现kvm控制的linux内核的启动。

1.正常的引导程序

上电--->实模式-->执行ROM-BIOS中的地址(0xffff0)-->读入磁盘第一扇区(512B)到绝对地址0x7c00-->跳转到0x7c00执行。

bootloader boot/bootsec.S将位于0x7c00(31kb这估计要比这个大)执行。之后将自己移动到0x90000(576KB)执行。boot/setup.s将读入0x90200处(2KB)。内核其他部分被读入0x10000(64KB)处。setup.s将会把system移动到内存起始位置处。

      setup结束后内存布局

head.s位于system模块的最前面,system模块一般被放置在磁盘上setup模块之后的扇区中。(0.11内核中约为120KB,占240扇区)执行完后的内存布局如下如:

 整个过程不断的设置idt和gdt的位置和定义方式。这里内存页目录和页表的设置完成。

32位保护模式:

当CPU运行在保护模式下时,会将实模式下的段地址当作保护模式下段描述符的指针被使用,此时段寄存器中存放的是一个描述符在描述符表中的偏移地址。

而当前描述符表的基地址将会被存放在描述符表寄存器中,如全局描述符表寄存器gdtr,中断们描述符表寄存器idtr.并使用专门的指令lgdt/lidt加载。

以上过程基于0.11内核实现,但对硬盘的描述不够完善,再次参考内核源码情景分析(内核为2.6)。

  • 一块硬盘可以有多个分区,每个分区都可以都可以由引导扇区,但属于逻辑硬盘。
  • bios默认只是别主引导扇区(MBR),MBR中有磁盘划分的信息,还有一段简短程序,但不是引导程序(512B)。
  • MBR中的程序读取逻辑期盼中的引导扇区,这里是引导程序。

 

  1. bootsect.s 引导扇区源码,编译后不得超过512字节。
  2. setup.S 辅助程序
  3. vidie.S 引导过程的显示。

PC体系中,线性地址0xA0000上,即640KB以上都用于图形接口以即bios本身。而0xA0000以下的640KB为基本内存。如配备更多内存,则从0x100000处为高内存。CPU在bootsec时尚处于16位实地址模式,然后利用setup转入32位保护模式段式寻址。

bzimage为压缩大内核,解压在基本内存中放不下,所以解压后一般放在0x100000地址处。setup为内核的执行作好了准备(包括解压),然后跳转到0x100000处执行。cpu执行内核映像的入口startup_32就在内核映像的开头的地方,因此其物理地址为0x100000 。此时的系统空间地址映射时线性的VA=PA+0xC0000000; 所以startup_32地址为0xC0100000;

2.如何启动原生内核 

我们目前小内核已经完全实现了页表查询的地址转换过程,我们这里称为HPA-->HVA的转换。我们需要启动的内核将会实现另一套GPA-->GVA的地址转换。bootsect和setup会加载解压内核到0x100000的物理地址处。这里我们可以直接令HVA=GPA。将解压的bzImage放到任意的HVA(ip_hva), 虚拟机直接执行ip_hva。理论上我们将启动我们的新内核,新世界的大门也会打开。

0x90000处的代码将会被setup程序修改为启动内核的参数,所以HVA不能等于GPA. 因为system也就是内核本身会在0x90000处查找参数。“console=ttyS0 root=/dev/ram rdinit=/sbin/init”

startup_32入口运行与保护模式下的段式寻址方式。段描述表中与_KERNEL_CS和__KENREL_DS相对应的描述想所提供的基地址都是0,所以此时地址为线性地址。CPU的中断已经在进入startup_32之前关闭。

虽然代码段寄存器CS已经设置成__KERNEL_CS, startup_32的地址为0xC0100000。但是在转入这个入口时使用的指令时ljmp 0x100000, 而不是 “ljmp  startup_32”,所以装入cup中的寄存器ip的地址是物理地址0x100000而不是虚拟地址。

分段:

描述符表(全局、局部)+ 选择子(选择符)= 描述符

 

3.关于磁盘和文件系统虚拟的问题

另一个比较棘手的问题是,原生内核在执行前会有个简易的文件系统,但此时我们的虚拟机内核没有。操作硬盘将会是一个问题。换句话说就是虚拟机此时没有虚拟硬盘。理论上可以直接转换到主机的硬盘操作,这个走一步看一步吧。

五、内核中直接接管跟模式

kvm_arch_vcpu_init负责填充x86 CPU结构体,kvm_arch_vcpu_init

1.查询KVM版本的请求操作
ioctl(kvm_fd, KVM_GET_API_VERSION,0)
2.创建虚拟机文件描述符的操作
vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0)
3.设置虚拟机内存
struct kvm_userspace_memory_region region={
        .slot = 0,
        .guest_phys_addr = 0,
        .memory_size = ram_size,
        .userspace_addr = (u64)ram_start
    };
    ioctl(vm_fd, KVM_SET_USER_MEMORY_REGION, &region);
4.新建虚拟CPU
vcpu->vcpu_fd = ioctl(kvm->vm_fd, KVM_CREATE_VCPU, i);
5.运行虚拟机
ioctl(vcpu->fd, KVM_RUN, 0) < 0)
6.接管中断和其他异常


vmx->vmcs = alloc_vmcs();
if (!vmx->vmcs)
    goto free_msrs;
vmcs_init(vmx->vmcs);

执行vm entry的时候将vmm状态保存到vmcs的host area,并加载对应vm的vmcs guest area信息到CPU中,vm exit的时候则反之,vmcs具体结构分配由硬件实现,程序员只需要通过VMWRITE和VMREAD指令去访问。

KVM_RUN的实现函数是kvm_arch_vcpu_ioctl_run,进行安全检查之后进入__vcpu_run中,在while循环里面调用vcpu_enter_guest进入guest模式,首先处理vcpu->requests,对应的request做处理,kvm_mmu_reload加载mmu,通过kvm_x86_ops->prepare_guest_switch(vcpu)准备陷入到guest,prepare_guest_switch实现是vmx_save_host_state,顾名思义,就是保存host的当前状态。

准备工作搞定,kvm_x86_ops->run(vcpu),开始运行guest,由vmx_vcpu_run实现。

handle_exit退出函数由vmx_handle_exit实现,主要设置vcpu->run->exit_reason,让外部感知退出原因,并对应处理。

VMCS寄存器

http://oenhan.com/kvm-src-3-cpu

VMCS保存虚拟机的相关CPU状态,每个VCPU都有一个VMCS(内存的),每个物理CPU都有VMCS对应的寄存器(物理的),当CPU发生VM-Entry时,CPU则从VCPU指定的内存中读取VMCS加载到物理CPU上执行,当发生VM-Exit时,CPU则将当前的CPU状态保存到VCPU指定的内存中,即VMCS,以备下次VMRESUME。

VMLAUCH指VM的第一次VM-Entry,VMRESUME则是VMLAUCH之后后续的VM-Entry。VMCS下有一些控制域:

VM-execution controlsDetermines what operations cause VM exitsCR0, CR3, CR4, Exceptions, IO Ports, Interrupts, Pin Events, etc
Guest-state areaSaved on VM exits,Reloaded on VM entryEIP, ESP, EFLAGS, IDTR, Segment Regs, Exit info, etc
Host-state areaLoaded on VM exitsCR3, EIP set to monitor entry point, EFLAGS hardcoded, etc
VM-exit controlsDetermines which state to save, load, how to transitionExample: MSR save-load list
VM-entry controlsDetermines which state to load, how to transitionIncluding injecting events (interrupts, exceptions) on entry

 

bluepill

这一段是关于win vt 的启动跟模式的代码VmxInitialize


  Cpu->Vmx.MSRBitmap = MmAllocateContiguousPages (VMX_MSRBitmap_SIZE_IN_PAGES, &Cpu->Vmx.MSRBitmapPA);
  if (!Cpu->Vmx.MSRBitmap) {
    _KdPrint (("VmxInitialize(): Failed to allocate memory for  MSRBitmap\n"));
    return STATUS_INSUFFICIENT_RESOURCES;
  }
  RtlZeroMemory (Cpu->Vmx.MSRBitmap, PAGE_SIZE);
  _KdPrint (("VmxInitialize(): MSRBitmap VA: 0x%p\n", Cpu->Vmx.MSRBitmap));
  _KdPrint (("VmxInitialize(): MSRBitmap PA: 0x%llx\n", Cpu->Vmx.MSRBitmapPA.QuadPart));

  if (!NT_SUCCESS (VmxEnable (Cpu->Vmx.OriginaVmxonR))) {
    _KdPrint (("VmxInitialize(): Failed to enable Vmx\n"));
    return STATUS_UNSUCCESSFUL;
  }

  *((ULONG64 *) (Cpu->Vmx.OriginalVmcs)) = (MsrRead (MSR_IA32_VMX_BASIC) & 0xffffffff); //set up vmcs_revision_id      

  if (!NT_SUCCESS (Status = VmxSetupVMCS (Cpu, GuestRip, GuestRsp))) {
    _KdPrint (("Vmx(): VmxSetupVMCS() failed with status 0x%08hX\n", Status));
    VmxDisable ();
    return Status;
  }

VmxEnable启动cr4虚拟化的功能。

既然可以直接启动跟模式,那么那么核心问题就变成了host 和 guest的状态的切换和保存了。虚拟化驱动处于内核状态,host的状态就是我们驱动的状态,guest的状态反而变成了整个内核。内核要继续运行,host要接管整个内核的各种行为。

 


int run_vm(struct vm *vm, struct vcpu *vcpu, size_t sz)
{
	struct kvm_regs regs;
	uint64_t memval = 0;

	for (;;) {
		if (ioctl(vcpu->fd, KVM_RUN, 0) < 0) {
			perror("KVM_RUN");
			exit(1);
		}

		switch (vcpu->kvm_run->exit_reason) {
		case KVM_EXIT_HLT:
			goto check;

		case KVM_EXIT_IO:
			if (vcpu->kvm_run->io.direction == KVM_EXIT_IO_OUT
			    && vcpu->kvm_run->io.port == 0xE9) {
				char *p = (char *)vcpu->kvm_run;
				fwrite(p + vcpu->kvm_run->io.data_offset,
				       vcpu->kvm_run->io.size, 1, stdout);
				fflush(stdout);
				continue;
			}

			/* fall through */
		default:
			fprintf(stderr,	"Got exit_reason %d,"
				" expected KVM_EXIT_HLT (%d)\n",
				vcpu->kvm_run->exit_reason, KVM_EXIT_HLT);
			exit(1);
		}
	}

 check:
	if (ioctl(vcpu->fd, KVM_GET_REGS, &regs) < 0) {
		perror("KVM_GET_REGS");
		exit(1);
	}

	if (regs.rax != 42) {
		printf("Wrong result: {E,R,}AX is %lld\n", regs.rax);
		return 0;
	}

	memcpy(&memval, &vm->mem[0x400], sz);
	if (memval != 42) {
		printf("Wrong result: memory at 0x400 is %lld\n",
		       (unsigned long long)memval);
		return 0;
	}

	return 1;
}

从这段代码看,vmm要陷入死循环。然后监控虚拟机状态,进行相应的处理。那也就是说,我们的VMM驱动也要陷入死循环。然后让虚拟机继续内核的运行。

要处理的问题,进入我们VMM的时刻,有多少cpu的状态需要恢复。

又看了下hyperviser的代码,启动所有vcpu后,cpu自然被占用,不需要VMM死循环。需要的是设置vm_exit的各种回调,这样更方便。

    mp::ipi_call([&start_err]() {
      mm::allocator_guard _;

      const auto idx = mp::cpu_index();
      const auto err = global.vcpu_list[idx].start();

      auto expected = error_code_t{};
      start_err.compare_exchange_strong(expected, err);
    });
    // Create VM-exit handler instance.
    //
    vmexit_handler_ = new vmexit_handler_t();

    device_->handler(std::get<vmexit_dbgbreak_handler>(vmexit_handler_->handlers));

    //
    // Example: Enable tracing of I/O instructions.
    //
    std::get<vmexit_stats_handler>(vmexit_handler_->handlers)
      .trace_bitmap().set(int(vmx::exit_reason::execute_io_instruction));

    if (auto err = hvpp::hypervisor::start(*vmexit_handler_))
    {
      destroy();
      return err;
    }

 

高级操作系统——第七周【页表置换】 CPU 内存-Cache-寄存器(CPU里) (1)计算对位进行操作的函数的组合逻辑(ALU); (2)存储位的存储器元素(寄存器);[貌似速度比cache还快?] (3)控制存储器元素更新的时钟信号。 (4)cache :Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在C... 阅读详情

相关推荐

NewBluePill深入理解硬件虚拟机(PDF+配套源码

这是本人在实际项目中 借鉴的资料,电子书都是随书以前购买而来,请放心使用

Linux虚拟化:KVM影子页表

2019年是崭新的一年,Linux kernel 5.0 低调发布了,给我的感觉就是,牛人不断在飞跃,我们也要策马奔腾赶紧追赶才有些许出路。 内核子系统众多,我发现KVM是个非常有意思的子系统,对cpu,内核,IO的虚拟化玩的太溜了,一些技巧真是令人折服,简直就是一个超级魔法师,也可以成为"骗术”,而且还是里因外和。话不多说,进入主题。 VM虚拟化,对虚拟cpu很好理解,cpu采用两种模式,一种是root模式下的0 – 3特权级,另一种是非root模式下的0 - 3特权级别。在...

RToax 1128

NewBulePill深入理解硬件虚拟化

介绍了因特尔虚拟化源码NewBulePill的实现原理。可以很好地理解VT

KVM之EPT与影子页表(七)

一、简述Linux内存映射 这部分其实是一个很庞大的话题,它包括分段、分页机制等,在不同架构、不同地址转换机制下,地址转换过程是不同的。本文的重点不在于这些复杂的分段分页保护机制、保护模式、实模式等内容。主要着眼于以下几个概念和问题: 虚拟地址和物理地址 MMU 内存置换 缺页中断处理 页表项初始化过程 1.1 虚拟地址和物理地址 从进程和CPU角度分析虚拟地址和物理地址: 虚拟地址(VA,virtual address):对于正在运行的进程而言,代码指令中指针所指的地址、函数入口地址、返回地址等,进程

bob的博客 2540

VT过游戏保护,调试有保护的游戏

VT过游戏保护,调试有保护的游戏。无视TP,HP,PP。

VT虚拟化驱动+内存读写+机器码修改源代码

纯c++源代码,不是.sys, 可以修改CPUID和硬盘ID,里面集成了各种钩子处理、隐藏驱动、伪装、PatchGuard、文件保护、窗口保护、拦截数据包、绕过反调试、等等...非常适合拿来做技术研究。

MIT6.S081-2020-Lab: page tables

继续上次的xv6实验,从做完第一个实验后,到现在已经过去很久了6.S081-Lab: Xv6 and Unix utilities 操作系统实验分享。中途只做完了系统调用,也没有写上笔记。 这次学习页表一章,从看书到看代码再到编写实验,花费了很多时间,遇到了很多坑,反反复复修改代码才得到正确的结果。 还是和以前一样,对操作系统有兴趣的千万不要错过这个实验。这次的实验会接触到很多内核知识,尤其是编写实验代码过程中,将页表理论知识化为实际的代码,别说有多舒服了。 分页可谓是操作系统中一个非常重要的思想,在操作系

Valishment的博客 1152

VT_X64(VT 支持x64的源码).rar_64位进程保护_VT_Vt进程隐藏_vt源码_进程保护

开启VT保护模式,保护自己的进程不被其它进程访问

利用Intel VT实现进程保护

Intel VT即Intel公司的Virtualization Technology虚拟化技术, 在硬件级别上完成计算机的虚拟化。为实现硬件虚拟化 ,VT增加了12条新的 VMX指令。VT可以让一个CPU工作起来像多个CPU在并行运行,从而使得在一部电脑内同时运行多个操作系统成为可能。在安全领域,利用VT技术,64位系统的防护可以做到跟32位同级别的强度。 一、vt调试方法 1. 修改vmx文

andy7002的博客 9820

Xilinx-复旦微-FPGA-眼图BlockDesign系统制作-针对PCIE系统

XIlinx-复旦微电子-FPGA-眼图BlockDesign系统制作-针对PCIE系统,手把手教你如何建立眼图测试

weixin_43444334的博客 2597

从流体力学到深度学习:手把手教你用PINN预测涡流场(基于TensorFlow2.10+GPU)

本文详细介绍了如何利用物理信息神经网络(PINN)结合TensorFlow 2.10和GPU加速,预测Navier-Stokes方程的涡流场。通过核心原理讲解、实战环境配置、网络架构设计及物理约束实现,帮助读者掌握从流体力学到深度学习的跨学科技术应用,特别适合处理复杂流体问题和非定常流动场景。

weixin_29048309的博客 212

冲破内核限制:使用DPDK快速提升网络应用程序的性能

大家好,这里是极客重生,移动互联网爆炸式发展,导致网络流量徒增,从而推动着网络技术不断地发展,而CPU的运行频率基本停留在10年前的水平,为了迎接超高速网络技术的挑战,软件也需要大幅度创新,结合硬件技术的发展,DPDK(Data Plane Development Kit),一个以软件优化为主的数据面技术应时而生,它为今天高性能网络IO技术的发展提供了绝佳的平台可行性。极客星球:深入理解网络编程同...

极客重生 2093

基于STM32的半导体制冷片温度控制

制冷片温度控制,温控范围15℃~45℃,本人菜鸡一枚,大佬绕路。 #include "stm32f10x_gpio.h" #include "relay.h" void relay_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ê...

大白兔的博客 9015

【x86架构】Intel 处理器 VT-d 架构 Kernel DMA 保护机制研究

这篇文章是对Intel VT-d入门研究的总结,主要是关于DMA重映射编程以及Windows上使用的内容,希望本文可以帮助你对它有一个基本的了解,并在感兴趣的基础上开始研究更多细节。 英特尔VT-d 英特尔VT-d(正式名称是定向I / O的英特尔VT)具有以下三个功能: · DMA Remapping · Interrupt Remapping · Interrupt Posting DMA重映射是其中最常讨论的功能,也是本文的重点。 DMA重映射 DMA重映射是一项重要功能,因为它允许软件通过为每个物理

humanof的专栏 4135

ur3手眼标定+realsenseL515

知乎 csdn

AI_future的博客 978

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6101

让Windows控制台应用程序支持VT100---原理篇

微软的操作系统在历史上对VT的支持可追溯到 DOS 年代,那时候有一个设备驱动程序名字叫 ANSI.SYS,加载后就可以让终端支持VT控制符,后来进入桌面时代后就没有类似的支持了。直到Windows 10的Anniversary Update(1607),微软追加了对VT的支持,这可能是得益于微软在内核层面支持Linux kernel的努力(WSL)。下面是详细的介绍和示例内容 https://docs.microsoft.com/en-us/windows/console/console-virtual

mengxp的博客 2640

基于XDMA 的PCIE读写DDR

基于XDMA 的PCIE读写DDR 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。 实现功能:PC通过PCIE读写DDR,同时用户通过逻辑代码可以读取被写入DDR内的数据(我是通过VIO实现DDR任意地址,任意数据大小的读取。)。 实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 P

Crazzy_M的博客 1万+

自己动手利用KVM和Intel VT实现简单虚拟机

自己动手利用KVM和IntelVT实现简单虚拟机 计划开发一套虚拟机最小系统。该原型系统会利用Linux原生提供的内核模块kvm.ko,使用该模块提供的API接口,自行开发一个用户态程序,实现一个最基本的虚拟机。 这个虚拟机能够运行一段x86指令代码,例如简单的算术运算,最终能够将运算结果通过IO端口写入客户机的串口设备中。这套最小系统能够模拟一个串口设备,将客户机串口设备中的数据显示在终端屏幕上。 本章是开发实践的基础章节,通过自己动手实践本章提供的源代码,能够为后续高阶内容打下坚实的基础。在动手开

omnispace的博客 2043

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

运维简历优化指南,DeepSeek助您运维简历秒变高分!

例如,当掌握了新的运维技术,如 Serverless 架构的运维管理,就将其添加到简历的专业技能部分,并简要描述在相关项目中的应用情况和成果,如 “在 [项目名称] 中,负责 Serverless 架构的运维工作,成功实现了应用的低成本、高弹性运行,降低了运维成本 30%”。上传简历至 DeepSeek,并输入指令:“请根据以下岗位招聘要求,帮我重新解构我的简历,按照【教育背景→实习经历→项目经历→个人评价→技能证书】的模块,输出一份符合下述岗位的简历,提升我的求职竞争力。

大模型大数据攻城狮的专栏 1469

如何知道 CPU 是否支持虚拟化技术(VT)

作者: Sk 译者: LCTTgeekpi 我们已经知道如何检查你的 Linux 操作系统是 32 位还是 64 位以及如何知道你的 Linux 系统是物理机还是虚拟机。今天,我们将学习另一个有用的话题 - 如何知道 CPU 是否支持虚拟化技术 (VT)?在安装虚拟化程序(如 VirtualBox 或 VMWare workstation)以在 Linux 系统上运行虚拟机之前,你应该首...

Pipcie的博客 5096

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VT笔记(2)突破patchguard保护完成X64Hook

win10,2018新年版后好像不支持了? MSR hook MSR (Model Specific Registers)是CPU 的一组64 位寄存器,可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作,前提要在ECX 中写入MSR 的地址(MSR地址就像一个宏STAR,LSTAR,CSTAR,SFMASK)。对于RDMSR 指令,将会返回相应的MSR 中64bit 信息到(ED...

kernweak的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

检测CPU是否具备VT的功能,并开启

检测CPU是否具备VT的功能,并开启

小烟的博客 3498

KVM获取cpu和内存以及磁盘信息

cat /proc/meminfo 或者free。

tiging的博客 801

向分析某VT加持的无畏契约纯内核挂

最近玩JD上头但是被各路挂壁打的头大,偶然看到隔壁群友发的村瓦挂壁赛直播,起了逆下看看的念头。遂顺着网线一路找到了发卡网,拿到了本次逆向的主角。貌似不简单阿,不过“易语言程序”这几个字了怎么没了???

2401_88751384的博客 3612
上一篇: dwarf 栈解析格式小结
下一篇: KVM 代码详解
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值