QEMU 虚拟化
文章平均质量分 71
古道上的西风与瘦马
14年嵌入式开发,精通linux。
展开
-
QEMU 6.2 源代码分析之 [ 9 ] —— 如何单步跟踪QEMU程序
另外,build/arch/arm64/boot/Image 本身在编译时,是需要编译出它自己的调试信息的。b function, 设置一个断点,也可指定一个源文件的某一行,甚至可以通过 if 加上条件断点。**run命令:**开始执行,遇到断点会自动停下来。**finish命令:**从一个函数返回。**info命令:**查看当前所有断点。**step命令:**进入函数内部。继续全速跑,直到再次遇到断点。查看一个地址处的结构体。原创 2024-06-25 14:35:23 · 548 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 8 ] ——对pci虚拟设备edu进行读写测试
当加载后,由于my_pcie_edu_driver.ko中的vendor id和device id将会与1234:11e8 匹配成功,从而正确地调用到my_pcie_edu_probe()函数中来,这里,就可以通过request_mem_region以及ioremap将EDU设备的BAR空间映射过来,后面就可以正常读写EDU设备的BAR空间了。如下是pci_edu_realize(),可以看到,它注册了 PCI设备的BAR空间,该空间的操作函数是:edu_mmio_ops。原创 2024-06-25 12:12:56 · 723 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 7 ] —— PL011串口控制器虚拟化
type_init(pl011_register_types)Pl011 Typeinfo定义初始化pl011对应的class:初始化pl011串口:memory_region_init_io()对于 virt 这个虚拟开发板,它的各个外设的地址定义如下,可以看到UART的寄存器基地址是 0x09000000,长度是 0x1000。Virt虚拟开发板的外设中断号是1。经过如下的流程,当虚拟的linux内核中,串口驱动在操作串口时,将会从DTB中,找到基地址 0x09000000 这个信息原创 2024-06-17 19:18:56 · 294 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 6 ] —— MMU 虚拟化
接着,再通过 section.mr,得到MemoryRegion, 再通过 mr->ram_block,得到 ram_block,再 ram_block->host + 0x2a68000,而 ram_block->host 是0x7fa793e00000,所以最终得到的HVA就是( 0x7fa793e00000 + 0x2a68000 )成功时返回 true。否则,如果正在探测,返回 false。假设已经知道了 GPA 地址,接下来,又该如何读写到里面的数据呢?原创 2024-06-17 19:08:44 · 399 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 5 ] —— GIC 虚拟化
0x02,表示来了外部的硬件中断,正因为如此,在下面的cpu_handle_interrupt中,才会因为检测到 cpu->interrupt_request 不为0,所以才会进入cc->tcg_ops->cpu_exec_interrupt(cpu, interrupt_request) 中去处理外部中断。原创 2024-06-17 19:03:19 · 281 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 4 ] —— 内存虚拟化
当Guest对RAM或者IO进行读写时,一定会调用 store和load汇编指令,该指令,会被TCG捕捉到,然后,进入store_helper或者load_helper中,IO空间的 MemoryRegion 是有对应的 ops 中的read/write接口的,但是对于 system ram,并没有ops,那么,各自是如何读写的呢?因此,对于 Guest的RAM 访问,直接mempcy即可,不需要 ops() 设置的,而对于IO空间,会通过mr->ops->write()接口来读写IO空间。原创 2024-06-17 18:58:19 · 175 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 3 ] —— CPU虚拟化
/将这个typeinfo存到一个hash表中去// create_vcpu_thread 函数指针在多线程情况下被初始化为 accel/tcg/tcg-accel-ops-mttcg.c 下的 void mttcg_start_vcpu_thread(CPUState *cpu) 函数,//单线程情况下则被初始化为 accel/tcg/tcg-accel-ops-rr.c 下的 void rr_start_vcpu_thread(CPUState *cpu) 函数。原创 2024-06-17 18:46:22 · 525 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 2 ] —— 开发板虚拟化
{ }},.parent = TYPE_VEXPRESS_MACHINE, //它的父亲是 TYPE_VEXPRESS_MACHINE.class_init = vexpress_class_init, //这里的 class_init具体在哪里调用,还需要进一步理解?原创 2024-06-17 18:39:59 · 353 阅读 · 0 评论 -
QEMU 6.2 源代码分析之 [ 1 ] —— Main()函数入口
默认情况下,没有指定优先级的初始化函数被视为具有中等优先级(0),而通过显式设置优先级,可以控制初始化函数的执行顺序。((constructor)) 属性时,就会告诉编译器,在程序加载时(在 main 函数执行之前),需要自动调用这个函数。((constructor)) 是 GCC编译器中的一个特性,它用于指示编译器将一个函数标记为在程序启动时自动执行的初始化函数。这个特性为开发者提供了一种方便的方式来定义在程序启动时自动执行的初始化函数,使得全局的初始化工作变得更加简单和方便。原创 2024-06-17 18:22:30 · 336 阅读 · 0 评论