Qemu虚拟arm开发板驱动开发详解(一)——驱动基本架构

本文介绍了在WSL2环境下,基于Ubuntu22.04的Qemu模拟的ARM32开发板,如何构建Linux内核驱动的基本架构,包括模块的初始化和退出函数,以及如何实现一个简单的HelloWorld驱动。

        此前在《WSL2下Ubuntu22.04使用Qemu搭建虚拟Vexpress-A9开发板》系列文章中,我们已建立好Linux最小系统的运行环境,并将其成功移植到了由Qemu模拟的arm32开发板上。接下来将介绍如何基于上述环境进行驱动开发。

        本节主要带各位读者了解Linux内核驱动的基本架构,并在WSL的Ubuntu22.04子系统下实现基于x86操作系统的简易Linux驱动“HelloWorld”。

Linux驱动框架

#include <linux/module.h> //包含内核编程最常用的函数声明,如printk
#include <linux/kernel.h> //包含模块编程相关的宏定义,如:MODULE_LICENSE

/*init初始化函数在模块被插入进内核时调用,主要作用为驱动功能做好预备工作
  被称为模块的入口函数
  
  __init的作用 : 
1. 一个宏,展开后为:__attribute__ ((__section__ (".init.text")))   实际是gcc的一个特殊链接标记
2. 指示链接器将该函数放置在 .init.text区段
3. 在模块插入时方便内核从ko文件指定位置读取入口函数的指令到特定内存位置
*/
int __init mydriver_init(void)
{
	……………………
	return 0;
}

/*exit退出函数在模块从内核中被移除时调用,主要作用做些init函数的反操作
  被称为模块的出口函数
  
  __exit的作用:
1.一个宏,展开后为:__attribute__ ((__section__ (".exit.text")))   实际也是gcc的一个特殊链接标记
2.指示链接器将该函数放置在 .exit.text区段
3.在模块插入时方便内核从ko文件指定位置读取出口函数的指令到另一个特定内存位置
*/
void __exit mydriver_exit(void)
{
	……………………
}

/*
MODULE_LICENSE(字符串常量);
字符串常量内容为源码的许可证协议 可以是"GPL" "GPL v2"  "GPL and additional rights"  "Dual BSD/GPL"  "Dual MIT/GPL" "Dual MPL/GPL"等, "GPL"最常用

其本质也是一个宏,宏体也是一个特殊链接标记,指示链接器在ko文件指定位置说明本模块源码遵循的许可证
在模块插入到内核时,内核会检查新模块的许可证是不是也遵循GPL协议,如果发现不遵循GPL,则在插入模块时打印抱怨信息:
	myhello:module license 'unspecified' taints kernel
	Disabling lock debugging due to kernel taint
也会导致新模块没法使用一些内核其它模块提供的高级功能
*/
MOD
<think> 嗯,用户想了解指令集模拟和系统级模拟的概念,以及QEMU架构中的TCG动态翻译和设备模拟。这个问题很有深度,需要结合计算机体系结构和虚拟化技术来回答。 用户可能是计算机相关专业的学生或开发者,正在学习虚拟化技术。从提问的精准度来看,用户应该已经对QEMU基本了解,现在需要深入理解其核心机制。用户特别关注TCG和设备模拟这两个关键技术点。 先整理核心概念: 指令集模拟(ISA Simulation)关注CPU指令级别的精确模拟,比如RISCV或ARM指令的执行过程。而系统级模拟(System-level Simulation)更全面,需要模拟整个计算机系统,包括CPU、内存、外设等。QEMU属于后者,它通过TCG实现跨架构的指令翻译。 关于TCG(Tiny Code Generator),这是QEMU的核心技术。引用[2]提到TCG目录下的代码负责将目标架构指令转换为x86指令,这是个状态机式的翻译过程。特别值得注意的是内存访问和跳转指令的处理,因为它们涉及内存管理单元的模拟。用户可能对翻译流程感兴趣,需要解释decode tree和trans_xxx函数的作用。 设备模拟方面,QEMU采用动态建模方式。每个虚拟设备都有对应的状态机模型,比如时钟中断会触发虚拟PIC的状态变化。这里可以结合用户提到的RISCV CPU初始化代码(引用[3]),说明misa_ext_mask如何控制支持的指令集扩展。 用户可能存在的知识盲区是TCG如何兼顾性能与准确性。实际上QEMU使用代码块缓存(translation block cache)和直接跳转优化来解决这个问题。当执行跳转指令时,如果目标块已翻译就直接跳转,避免重复翻译。 最后需要强调QEMU的模块化设计。从引用[1]的目录结构看,TCG、设备模型、硬件加速都是独立模块,这种设计使得QEMU能同时支持KVM加速和纯软件模拟两种模式。用户如果做开发,可以重点研究target/riscv和hw/riscv这两个目录。 </think>以下是关于指令集模拟、系统级模拟及QEMU架构详解: --- ### **、核心概念** 1. **指令集模拟(ISA Simulation)** - **定义**:精确模拟特定CPU指令集的执行过程,不涉及外围设备。 - **用途**:编译器开发、二进制分析(如[Radare2](https://rada.re/))、单指令调试。 - **局限**:仅关注CPU状态(寄存器、内存),无法模拟完整计算机系统。 2. **系统级模拟(System-level Simulation)** - **定义**:模拟完整硬件系统,包括CPU、内存、外设(磁盘、网络、显卡等)。 - **用途**:操作系统开发(如Linux内核调试)、固件测试、跨平台应用验证。 - **代表工具**:QEMU、VirtualBox。 > **关键区别**:指令集模拟是系统级模拟的子集,后者需额外处理设备交互和系统状态致性[^1][^2]。 --- ### **二、QEMU架构详解** #### **1. TCG动态翻译(Tiny Code Generator)** - **核心流程**: ```mermaid graph LR A[Guest二进制代码] --> B{TCG前端} B -->|生成中间表示IR| C[TCG优化器] C -->|平台无关优化| D{TCG后端} D -->|生成Host指令| E[Host机器码] ``` - **关键技术**: - **前端解码**:根据目标架构(如RISC-V)的`decode tree`语法解析指令,调用对应的`trans_xxx()`函数生成IR[^1][^2]。 - **内存访问模拟**:通过软件MMU处理Guest物理地址到Host虚拟地址的映射,拦截非法访问[^2]。 - **跳转优化**:使用**翻译块缓存(TB Cache)** 缓存已翻译代码,直接跳转避免重复翻译[^2]。 - **示例(RISC-V初始化)**: 在QEMU中,RISC-V CPU初始化时通过`misa_ext_mask`设置支持的指令集扩展: ```c static void riscv_cpu_init(Object *obj) { RISCVCPU *cpu = RISCV_CPU(obj); CPURISCVState *env = &cpu->env; env->misa_ext_mask = env->misa_ext = mcc->def->misa_ext; // 指令集扩展配置 } ``` [^3] #### **2. 设备模拟(Device Emulation)** - **原理**: - **总线与设备建模**:模拟PCI/USB总线拓扑,设备通过`MemoryRegion` API注册地址空间。 - **中断处理**:虚拟中断控制器(如APIC)转发中断信号,触发Guest OS中断服务例程。 - **I/O模拟**:磁盘/网络数据通过Host系统调用(如`read()`/`write()`)转发到真实设备。 - **关键模块**: - **QEMU Object Model (QOM)**:实现设备的继承与实例化(如`virtio-net`继承自`DeviceClass`)。 - **事件循环**:主循环`main_loop_wait()`处理设备异步事件(如定时器、I/O完成)。 --- ### **三、QEMU模式对比** | **模式** | **TCG(纯软件)** | **KVM(硬件加速)** | |----------------|-------------------------------|---------------------------| | **原理** | 动态二进制翻译 | 利用CPU虚拟化扩展(如Intel VT-x) | | **性能** | 慢(20-50% Host速度) | 接近原生(>95% Host速度) | | **适用场景** | 跨架构模拟(如ARM on x86) | 同架构加速(如x86 on x86) | | **内存管理** | 软件MMU | 硬件辅助的EPT/NPT | > **注**:KVM需与QEMU协同工作——KVM负责CPU虚拟化,QEMU处理设备模拟[^1][^2]。 --- ### **四、典型应用场景** 1. **嵌入式开发**:在x86主机上模拟ARM开发板运行RTOS(如Zephyr)。 2. **安全研究**:通过修改TCG指令翻译逻辑,实现模糊测试(如[AFL++](https://github.com/AFLplusplus/AFLplusplus))。 3. **异构计算**:利用QEMU模拟RISC-V GPU指令,验证图形驱动[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值