QEMU源码全解析31 —— Machine(1)

本文是QEMU系列的第31篇,开始解析QEMU中主板与固件模拟的部分。首先介绍了INTEL 440FX芯片组,它是QEMU默认的x86架构,尽管已有较长时间历史,但在QEMU中仍被广泛使用。文章详细阐述了440FX的组成,包括北桥82441FX/82442FX和南桥PIIX3 82371SB,以及它们的功能。北桥负责连接处理器、内存和PCI总线,而南桥则连接低速设备和ISA总线。文中还提到了I/O APIC在中断处理中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

通过本系列前30篇文章,笔者已经将QEMU的一些基础知识进行了讲解。从本回开始,我们正式开始系统各个组成硬件的代码解析。

首先要介绍的当然是machine,即主板与固件的模拟。对应的文件是hw/core/machine.c。不过要在讲解代码之前,要先从QEMU命令行讲起。一个QEMU命令行的示例如下:

-machine pc-i440fx-trusty,accel=kvm,usb=off

命令行中的pci-i440fx是x86机器默认的架构。这里要对i440fx进行简要介绍。

INTEL 440FX芯片组

Intel 440FX(i440fx)是Intel(英特尔)在1996年发布的用来支持Pentium II(奔腾2)的主板芯片,距今已有20多年的历史,是一代比较经典的架构。虽然QEMU已经能够支持更先进的q35架构的模拟,但目前QEMU仍然默认使用i440fx架构。

当年,Intel公司凭借TRITON系列芯片组赚取了巨额利润后丝毫没有松懈,因为他们需要生产出更新的芯片组来配合PENTIUM PRO,就这样440FX芯片组诞生了。此款芯片组是Intel生产的第一款基于SLOT 1构架的芯片组,被人们称为NATOMA。NATOMA由四块芯片构成:82441FX/82442FX/82371SB/82093AA。其中82093AA可选,采用1*64-PIN PQFP形式封装,其余三块采用3*208-PIN PQFP形式封装。82093AA这枚芯片的作用就在于它能使440FX芯片组支持两个CPU并支持进行对称多进程独立I/O APIC处理。NATOMA不存在内存CACHE范围限制问题,因为PENTIUM PRO CPU的片内二级缓存可对所有内存进行CACHE操作。在内存管理方面,NATOMA也有很大进步,它可支持1GB内存容量。然而另人遗憾的是,它缺乏对SDRAM的支持。此外440FX采用PIIX3硬盘控制器,支持总线控制,最大数据传输率为PIO MODE 4/DMA MODE 2(16.6MB/S),它还支持USB,支持同步PCI,其支持的总线速度为60/66MHZ。

Intel 440FX由一个两芯片的北桥组成。主要组件是82441FX PCI桥和内存控制器,以及用于PCI总线的82442FX数据总线加速器。

该芯片组使用PIIX3 82371SB南桥芯片,支持高速总线主DMA IDE接口和USB,并充当PCI和ISA总线之间的桥梁。

主板以及核心芯片的实物图如下所示:

以i440fx为北桥、piix3为南桥的芯片组结构如下图所示:

Intel 440FX架构图

如上图所示,i440fx北桥包括PMC(PCI Bridge and Memory Controller)以及DBX(Data Bus Accelerator)。北桥的作用是向上连接多个处理器,向下连接内存以及PCI总线,该PCI总线可以衍生出一个PCI的设备树。北桥中存放的主要部件不过是存储器控制器、显卡控制器和Host主桥而已。

pii3南桥主要用来连接低速设备,包括IDE控制器、USB控制器等。各种慢速设备可以通过控制器连接到系统,如硬盘、USB设备等(与控制器对应)。南桥还会连接ISA总线,传统的ISA设备可以借此连接到系统。

这里边还有一个需要注意的地方,即中断控制器I/O APIC(Advanced Programmable Interrupt Controller,高级可编程中断控制器)直接连接到处理器,设备的中断可以通过I/O APIC路由到处理器。

欲知后事如何,且看下回分解。

### BitBake 入门教程 BitBake 是一个强大的构建工具,广泛应用于嵌入式 Linux 系统的开发中,尤其是 Yocto Project 的核心组件之一。它通过解析元数据文件(通常是 `.bb` 文件),并按照指定的方式自动化整个软件包的下载、配置、编译和安装过程。 #### 1. 安装 BitBake 首先需要确保系统上已经安装了 Python 和必要的依赖项,然后可以使用包管理器直接安装 BitBake 或者从源码编译: ```bash # Ubuntu/Debian 用户可以通过 apt-get 来快速安装: sudo apt-get update && sudo apt-get install bitbake -y ``` 对于其他操作系统,请参考官方文档获取具体的安装步骤。 #### 2. 创建第一个 BitBake 配方 (Recipe) 在 BitBake 中,“配方”是指描述如何构建某个特定程序或库的一组指令。我们可以创建一个简单的 "Hello World" C++ 应用来演示基本工作流程。 ##### 步骤一:准备环境目录结构 建议建立一个新的项目根目录,并在此基础上搭建如下的初始布局: ``` my-project/ ├── conf/ │ └── local.conf # 自定义设置选项的地方 └── recipes-example/ ├── example_0.1.bb # 我们的 Hello World 示例应用 ``` ##### 步骤二:编写 `local.conf` 文件内容示例如下: ```ini MACHINE ??= "qemuarm" DISTRO ?= "poky" BBPATH = "${TOPDIR}" BDIR = "/tmp/bitbake_builds" DL_DIR = "${TOPDIR}/downloads/" SSTATE_DIR = "${TOPDIR}/sstate-cache/" INHERIT += "gitpkgv" PACKAGE_CLASSES = "package_rpm package_deb" EXTRA_IMAGE_FEATURES = "" USER_CLASSES ?= "" PARALLEL_MAKE = "-j8" BB_NUMBER_THREADS = "4" ``` 这里主要是设定了一些默认值和其他局参数。你可以根据实际需求调整它们。 ##### 步骤三:编辑 `example_0.1.bb` 文件作为我们的简单测试例子: ```makefile SUMMARY = "A simple hello world application written in C++." HOMEPAGE = "http://www.example.com/" LICENSE = "MIT" SRC_URI = "\ file://${WORKSPACE_PATH}/hello_world.cpp \ " do_compile() { g++ ${WORKDIR}/hello_world.cpp -o hello-world-app } do_install() { install -d ${D}${bindir} install -m 0755 ${WORKDIR}/hello-world-app ${D}${bindir}/ } FILES_${PN} += "${bindir}" PR = "r1" ``` 同时,在同一层还需要添加 `files/hello_world.cpp` 源代码文件如下所示: ```cpp #include <iostream> int main(int argc, char **argv) { std::cout << "Hello from BitBake!" << std::endl; return 0; } ``` 请注意以上路径中的 `${WORKSPACE_PATH}` 可能会因个人电脑环境而有所变化;此外还需保证所有涉及路径都存在相应的权限以便读取资源及输出结果。 #### 3. 构建工程 进入顶层的工作空间(`my-project`)之后运行下面命令启动一次完整的构建任务: ```shell bitbake example ``` 如果一切顺利的话,在几分钟内你就能看到生成好的可执行文件位于临时目标树(Temporary Staging Tree,TST)当中。 --- **注意:** 上述只是一个非常基础的例子用于理解 BitBake 工作原理及其大致操作方法。真实场景往往比这复杂得多——包括处理不同版本控制系统的检出策略、解决复杂的依赖关系等更多高级特性也都在等待着您去探索!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值