首页 > 编程语言 >Qemu源码分析(10)—Apple的学习笔记

Qemu源码分析(10)—Apple的学习笔记

时间:2023-10-03 18:31:47浏览次数:55  
标签:10 Apple mem region system 源码 io memory 虚化

一,前言

Qemu的虚化主要包括cpu虚化,内存虚化,io虚化。而且3类虚化都包括了全虚化,半虚化和硬件虚化,这些也是网上看到的,大概了解了下。而我本节看qemu源码主要分析内存虚化,至于内存应该是硬件虚化,也就是多用了也EPT扩展页表,这是内核kvm中的代码不是qemu的代码了,不是我现在关注的内容。

二,分析

Qemu主要是创建内存mapping信息,转换关系应该是GVA->IVA->HPA(客户端物理地址->内部虚拟地址->主机物理地址)若用全虚化,需要用到影子表页,GVA->GPA->HVA->HGA,这样速度就很慢。

1. 初始化memeoryRegion对象,包括内存和io设备,对象名字为system和io,分别再为其设置AddressSpace对象名字分别为memory和I/O。这4个都是全局变量,而且都有链表,所以之后就会在链表后继续添加对象。

static
void memory_map_init(void)
{
    system_memory =
g_malloc(sizeof(*system_memory));
 
    memory_region_init(system_memory, NULL,
"system", UINT64_MAX);
   
address_space_init(&address_space_memory, system_memory,
"memory");
 
    system_io = g_malloc(sizeof(*system_io));
    memory_region_init_io(system_io, NULL,
&unassigned_io_ops, NULL, "io",
                          65536);
    address_space_init(&address_space_io,
system_io, "I/O");
}

2.Mcu中内存的创建,先通过memory_region_init_ram进行初始化,然后通过memory_region_add_subregion将对象/memory添加到了内存的root对象system下。vmstate_register_ram_global是在ramblock对象中创建idstr名字。

// Get the system memory region, it must
start at 0.
    MemoryRegion *system_memory =
get_system_memory();
 
    int flash_size = cm_state->flash_size_kb
* 1024;
    int sram_size = cm_state->sram_size_kb *
1024;
 
    Object *mem_container =
container_get(cm_state->container, "/memory");
 
    MemoryRegion *flash_mem =
&cm_state->flash_mem;
    // Flash programming is done via the SCU,
so pretend it is ROM.
    memory_region_init_ram(flash_mem,
mem_container, "flash", flash_size,
            &error_fatal);
    vmstate_register_ram_global(flash_mem);
    memory_region_set_readonly(flash_mem,
true);
memory_region_add_subregion(system_memory, 0x00000000, flash_mem);

3.关于memory_region_transaction_begin和memory_region_transaction_commit,只要操作memoryRegion对象就有这2个函数,我没细看代码,直接网上搜索了,主要是region中物理地址更新及进行KVM地址同步。address_space_update_topology函数主要就是将nr指向FlatView,也就是实现GHA->GPA,GPA就是RamBlock对象的list。memory_listener_register用来监听地址空间发送变化,就调用listener的相应函数。从而保持内核和用户空间的内存信息一致性。

4.最后ram的更新都会传给kvm,主要通过此函数的ioctl,KVM_SET_USER_MEMORY_REGION来进行关联,接着就是GPA->HVA。

static int
kvm_set_user_memory_region(KVMMemoryListener *kml, KVMSlot *slot)
{
    KVMState *s = kvm_state;
    struct kvm_userspace_memory_region mem;
 
    mem.slot = slot->slot | (kml->as_id
<< 16);
    mem.guest_phys_addr = slot->start_addr;
    mem.userspace_addr = (unsigned
long)slot->ram;
    mem.flags = slot->flags;
 
    if (slot->memory_size &&
mem.flags & KVM_MEM_READONLY) {
        /* Set the slot size to 0 before
setting the slot to the desired
         * value. This is needed based on KVM
commit 75d61fbc. */
        mem.memory_size = 0;
        kvm_vm_ioctl(s,
KVM_SET_USER_MEMORY_REGION, &mem);
    }
    mem.memory_size = slot->memory_size;
    return kvm_vm_ioctl(s,
KVM_SET_USER_MEMORY_REGION, &mem);
}
  1. 主要的类对象

Qemu源码分析(10)—Apple的学习笔记_qemu

三,小结

这个内容还是很多的,我主要看了开头,也就是MCU是怎么添加内存定义的一些高层级的API,及通过网上找到了些资料来了解映射机制。

标签:10,Apple,mem,region,system,源码,io,memory,虚化
From: https://blog.51cto.com/u_16247275/7694211

相关文章

  • 2023.10.03补题两则
    2023.10.03T2Solution在\(\bmod{2}\)意义下,\(-x^{c}=x^{c}\)。对于\(A_i\equivC\pmod{B}\),变为\(A_i-C\equiv0\pmod{B}\),那么\(-C\)操作可以看成是异或上\(C\)。对于\(A^{'}_i\equiv0\pmod{B}\)的形式,欲找到最大的\(B\),则\(B\)显然是\(\gcd\......
  • 以下是一个比较复杂的R语言代码示例: ```R # 生成随机数 set.seed(123) data <- rnorm
    以下是一个比较复杂的R语言代码示例:#生成随机数set.seed(123)data<-rnorm(1000)#数据处理和分析data_mean<-mean(data)data_sd<-sd(data)data_median<-median(data)#创建一个绘图窗口par(mfrow=c(2,2))#绘制直方图hist(data,main="HistogramofDat......
  • 100.总结
    15分钟是一个分界线狂神说:https://www.bilibili.com/video/BV1JJ41177di?p=30&vd_source=499f37677e6da77de2c7d851e9cf00df总结就是多练,多抄。到现在都没练过前前后后花了一周时间看完JavaScript。看是看上了,没练,都是假把戏......
  • 10.3闲话
    欸我草今晚有牛客的模拟赛晚上写不了闲话了。下午写吧。早上睡到七点,妈的我还想接着睡。然后去打模拟赛。感觉模拟赛质量越来越好了,这次感觉水平还不错,挺正常的,除了题目顺序。T1一眼不会,跳题dp学得很好。T2刚了发现还好,T3纯水题。T4打暴力。哦对了jimmy还让写赛后总结,所......
  • jdk8中的ConcurrentHashMap原理和源码解读
    HashMap本身是线程不安全的,所以jdk提供了ConcurrentHashMap,这一篇来看下jdk8中的实现一、基本原理在jdk7中采用了Segment分段锁的思想来实现,在jdk8中不再采用分段锁的思想,jdk8中的ConcurrentHashMap和HashMap一样,都只有一层Entry数组来实现,那么它是怎么保证线程安全呢,我们通......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定义......
  • jdk7中的ConcurrentHashMap原理和源码解读
    HashMap是线程不安全的,所以jdk提供了ConcurrentHashMap这个线程安全的map集合实现,这一篇文章来分析下jdk7中ConcurrentHashMap的实现原理一、分段锁Segmentjdk7中ConcurrentHashMap的实现使用了分段锁的思想。先来思考下Hashtable是一个线程安全的map,但为什么它的效率不高......
  • 10.03模拟赛总结
    总结寄掉啦,\(50+30+100+8\)。T1组队(team)分析很简单的题目,通过充分发扬人类智慧,设\(x\)为二元组\((i,j)\)满足\(i<j,a_i=a_j\)的数量,则答案为\(2^x-1\)。代码没有。T2话外世界奇观:、附:题面组队(team)题目描述穗织镇上共有\(n\)个种族的秽神,第\(i\)个......
  • 20231002
    23/10/02NOIP模拟赛总结时间安排1:50-2:40先看了T1和T2,直接过样例。2:40-3:00T3没想到正解,先把40%打了。3:00-3:50上了个厕所,发现T3正解直接枚举,写完和自己的暴力对拍。3:50-4:00看了看后3题,感觉都不好做。4:00-4:50感觉T4是DP,但不会设状态,去打T5,T6暴力。4:50-5:40......