Calmisi Lee

Never like what you think.


  • Home

  • Archives

  • Tags

  • Categories

  • About

  • Search

QEMU对MSR的处理(一)

Posted on 2019-02-14 | Edited on 2019-03-06 | In QEMU | Views:
Symbols count in article: 1.9k | Reading time ≈ 2 mins.

在kvm-all.c里面的kvm_init()函数,
会调用kvm_arch_init()函数,

  1. kvm_get_supported_msrs();
  2. kvm_get_supported_feature_msrs();
Read more »

Intel MSR介绍和vmx对MSR的处理总结

Posted on 2019-02-01 | Edited on 2019-03-06 | In KVM | Views:
Symbols count in article: 15k | Reading time ≈ 14 mins.

MSR寄存器的介绍

The scope of an MSR defines the set of processors that access the same MSR with RDMSR and WRMSR.
Thread-scope MSRs are unique to every logical processor; Core-scope MSRs are shared by the threads in the same core; similarly for module-scope, die-scope, and package-scope.
When a processor package contains a single die, die-scope and package-scope are synonymous. When a package contains multiple die, they are distinct。
MSR寄存器的作用域可以是thread,即单个超线程,可以是每个core有单独的,也可以是一个die共用,还是是整个package。

Read more »

kvm对guest中MSR寄存器的处理(四)-- wrmsr

Posted on 2019-01-25 | Edited on 2019-03-06 | In KVM | Views:
Symbols count in article: 3.2k | Reading time ≈ 3 mins.

本文为kvm操作MSR寄存器的第四部分,主要介绍kvm trap guest中的wrmsr指令的处理过程。

当guest中因为执行wrmsr指令产生vm exit时,其exit reason为32,相应地最后会调用KVM中的handle_wrmsr()函数。
其函数实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static int handle_wrmsr(struct kvm_vcpu *vcpu)                                                                                                              
{
struct msr_data msr;
u32 ecx = vcpu->arch.regs[VCPU_REGS_RCX];
u64 data = (vcpu->arch.regs[VCPU_REGS_RAX] & -1u)
| ((u64)(vcpu->arch.regs[VCPU_REGS_RDX] & -1u) << 32);

msr.data = data;
msr.index = ecx;
msr.host_initiated = false;
if (kvm_set_msr(vcpu, &msr) != 0) {
trace_kvm_msr_write_ex(ecx, data);
kvm_inject_gp(vcpu, 0);
return 1;
}

trace_kvm_msr_write(ecx, data);
return kvm_skip_emulated_instruction(vcpu);
}

Read more »

kvm对MSR寄存器的处理(三)

Posted on 2019-01-23 | Edited on 2019-03-06 | In KVM | Views:
Symbols count in article: 8.3k | Reading time ≈ 8 mins.

msrs_to_save[], emulated_msrs[], msr_based_features[]

在x86.c文件中定一个了msrs_to_save[], emulated_msrs[], msr_based_features[]三个保存MSR寄存器index的数组,
以及num_msrs_to_save, num_emulated_msrs, num_msr_based_features三个静态全局变量来表示以上三个数组的大小。

其中msrs_to_save[]和emulated_msrs[]数组合起来为暴露给userspace的MSRs: userspace(QEMU)通过KVM_GET_MSR_INDEX_LIST ioctl获取,并且之后就可以调用KVM_GET_MSRS, KVM_SET_MSRS对这些MSRs进行读写
msr_based_features[]数组向userspace传递KVM支持的feature-based MSRs.

注意
msr_based_features[]数组和前面2个数组不是互斥的。
即msr_based_features[]数组中的MSR可以同时属于前面两个数组,但msr_to_save[]和emulated_msrs[]是互斥的。

Read more »

kvm对guest中MSR寄存器的处理(二)-- rdmsr

Posted on 2019-01-21 | Edited on 2019-03-06 | In KVM | Views:
Symbols count in article: 19k | Reading time ≈ 17 mins.

本文为kvm操作MSR寄存器的第二部分,介绍guest中rdmsr指令的处理过程。
之前在(一)中有介绍,如果对guest设置了Use MSR bitmaps VM-execution control bit,那么Read bitmap for low MSRs(0000 0000H - 0000 1FFFH)和Read bitmap for high MSRs(C000 0000H - C000 1FFFH)范围中的为0的bit对应的地址的MSR在执行rdmsr的时候不会产生VM EXIT。
其他情况,运行rdmsr均会触发VM exit,最后会进入vmx.c中的handle_rdmsr()函数。

Read more »

kvm中MSR的处理(1) -- percpu变量shared_msrs

Posted on 2019-01-18 | Edited on 2019-03-06 | In KVM | Views:
Symbols count in article: 7.9k | Reading time ≈ 7 mins.

本文介绍KVM中percpu变量shared_msrs,以及其相关的一些的数据结构。
其最终是为了在VM entry和VM exit的时候切换host和guest之间几个重要的MSR的值。

Read more »

size of segment

Posted on 2018-10-28 | In Intel-SDM | Views:
Symbols count in article: 2.7k | Reading time ≈ 2 mins.

在segment descriptor中,高4个bytes(4-7bytes)的bit 22为D/B字段。

(this flag should always be set to 1 for 32-bit code and data segments and 0 for 16-bit code and data segments)

Read more »

CPL,RPL,DPL三者的关系,以及CPL的切换规则

Posted on 2018-10-18 | Edited on 2018-10-28 | In Intel-SDM | Views:
Symbols count in article: 5.6k | Reading time ≈ 5 mins.

三个概念:

  • CPL: Current privilege Level, 当前特权级,其为当前的CS段和SS段的段寄存器的第0-1位的值,如下图所示,段寄存器中的可见部分的内容,即为segment selector的值,所以当前代码的CPL即为载入段描述符时,段选择符的RPL的值。
    注意:当前的CS段和SS段的段寄存器总的CPL值一定是一样的,当发生CPL切换时,对应的也会切换SS堆栈
  • DPL: Descriptor privilege level,为segment或者gate的特权级。其值在segment decriptor或gate descriptor的DPL区域。
  • RPL: Requested Privilege level,如下图所示为segment selector的最低2位。

CPL,DPL,RPL的取值为0,1,2,3.数值越大,特权级越低。
当要访问数据段中的操作数的时候,数据段(data segment)对应的段选择符(segment selector)必须加载到对应的数据段寄存器(data segment registers, DS, ES, FS or GS)或者堆栈段(stack-segment register,SS)。
在加载的时候,需要进行特权级检查,需要对比当前正在运行的程序的CPL,目标操作数所在段的段选择符的RPL,以及目标操作数所在段的段描述符的DPL
只有当CPL <= DPL && RPL <= DPL,目标操作数所在的段才会加载成功,否则产生一个GP,general protection.

Read more »

kvm源码解析之kvm-intel.ko模块初始化

Posted on 2018-09-18 | In KVM | Views:
Symbols count in article: 8.7k | Reading time ≈ 8 mins.

1. x86 arch with Intel cpu needs two modules kvm.ko and kvm-intel.ko

KVM是kernel-based virtual machine,但平台使用的是Intel CPU的时,需要用到内核中的2个模块:kvm.ko和kvm-intel.ko。
其中kvm-intel.ko模块由vmx.c和pmu_intel.c两个文件编译。
本文分析KVM源码中,系统加载这两个模块的时候,内核做了哪些工作。

Read more »

kvm源码解析之kvm_main.c

Posted on 2018-08-30 | Edited on 2018-09-18 | In KVM | Views:
Symbols count in article: 2.8k | Reading time ≈ 3 mins.

kvm_main.c中的init函数首先会调用,kvm_arch_init(opaque);

  1. kvm_arch_init
    这时会调用与architecture相关的对应的初始化函数,
    我们只关心x86平台,所以看对应的arch/x86/kvm/x86.c中的实现:
Read more »
123…7
Calmisi Lee

Calmisi Lee

Pas de regrets

67 posts
19 categories
52 tags
GitHub E-Mail
0%
© 2015.6 – 2019 Calmisi Lee | Symbols count total: 319k | Reading time total ≈ 4:50
Powered by Hexo
|
Theme – NexT.Pisces v7.0.0