Bochs源码分析 - 9: bochs对in/out指令的处理流程

本文详细介绍了Bochs模拟器中处理in/out指令的流程,从定位到out指令开始,分析了指令执行的具体步骤,以及IO注册的过程。在执行out指令时,数据被发送到连接于特定端口的设备,如DMA控制器。文章还回顾了IO注册的机制,强调了设备初始化时对端口的注册操作。最后,指出了在禁止CPU递归执行过程中遇到的问题,预示了后续将进一步探讨解决方案。

前言

        上一期,我们粗略分析了bochs中cpu执行的大体流程,并且修改了代码禁止指令的递归执行。众所周知,在众多指令中通过IO与外设进行交互的指令是in/out指令,我们这篇文章就来大体分析一下in/out指令执行流程。

        在第七篇文章中,我们通过floppy外设简单分析了一下IO中断的结构体,我们将它放在这篇文章开头处,可能在分析过程中具有参考价值。

定位到out指令

        在上篇文章中我们分析了BIOS的启动流程,其第三条指令为"BIOS_F:E05D out     0Dh, al",因此我们就使用该指令来作为分析指令。


BIOS_F:FFF0                 jmp     far ptr start_0
 
BIOS_F:E05B start_0:                                ; CODE XREF: sub_F5421+2BC↑J
BIOS_F:E05B                                         ; start↓J
BIOS_F:E05B                 xor     ax, ax
BIOS_F:E05D                 out     0Dh, al         ; DMA controller, 8237A-5.

         我们下面来设置软件条件断点定位到该指令处,首先必须看上篇文章将递归执行的宏给关掉。之后如下图,我们设置软件条件断点,其该指令的执行地址为0xf000:E05D,则条

Chapter 1 x86 体系结构与PC 系统概要.....................................1 1.1 x86 CPU 结构...............................................................................................................1 1.1.1 冯诺依曼架构和CISC 指令......................................................................1 1.1.2 CPU 结构........................................................................................................1 1.1.3 CPU 工作模式................................................................................................2 1.2 x86 体系结构概览........................................................................................................3 1.3 PC 系统.........................................................................................................................5 1.3.1 PC 系统概述...................................................................................................5 2.3.2 总线拓扑.........................................................................................................6 2.3.3 存储器与I/O 编址.........................................................................................6 2.3.4 关于系统的启动与引导.................................................................................8 Chapter 2 Bochs 工程概述....................................................... 11 2.1 开源项目Bochs 介绍.................................................................................................11 2.2 版本2.2.1 源码组织..................................................................................................11 2.3 工程类结构.................................................................................................................12 2.4 主体框架结构分析.....................................................................................................13 2.4.1 Bochs 工程中的重要类................................................................................13 (1) VM 控制台界面类.............................................................................................13 (2) CPU 模拟............................................................................................................14 (3) Memory 模拟......................................................................................................14 (4).I/O device 模拟...................................................................................................15 2.4.2 入口函数main()及Win32 Gui 初始化........................................................15 2.5 Bochs 的工作方式......................................................................................................18 Chapter 3 CPU 类的源码分析...................................................20 3.1 CPU 类概述................................................................................................................20 3.1.1 CPU 逻辑结构框图......................................................................................20 3.1.2 类BX_CPU_C 成员归纳.............................................................................20 3.2 类BX_CPU_C 源码分析..........................................................................................21 3.2.1 CPU 特性声明..............................................................................................21 3.2.2 类bxInstruction_c 成员分析........................................................................22 3.2.3 类BX_CPU_C 源码注释.............................................................................22 3.3 通用寄存器.................................................................................................................29 3.3.1 数据结构与注释...........................................................................................29 3.3.2 通用寄存器归纳...........................................................................................30 3.4 段寄存器、全局寄存器GDI 和IDT ........................................................................31 3.4.1 数据结构与注释...........................................................................................31 3.4.2 段寄存器结构分析.......................................................................................33 3.5 CPU 状态字EFLAGS................................................................................................35 3.5.1 数据结构与注释...........................................................................................35
Bochs项目源码分析与注释 Table of Content Chapter 1 x86 体系结构与 PC 系统概要1 1.1 x86 CPU 结构1 1.1.1 冯诺依曼架构和CISC 指令集 1.1.2 CPU 结构 1.1.3 CPU 工作模式 1.2 x86 体系结构概览 1.3 PC 系统 1.3.1 PC 系统概述 2.3.2 总线拓扑 2.3.3 存储器与I/O 编址 2.3.4 关于系统的启动与引导 Chapter 2 Bochs 工程概述 2.1 开源项目Bochs 介绍........................................11 2.2 版本2.2.1 源码组织..................................................................................................11 2.3 工程类结构.................................................................................................................12 2.4 主体框架结构分析.....................................................................................................13 2.4.1 Bochs 工程中的重要类................................................................................13 (1) VM 控制台界面类.............................................................................................13 (2 ) CPU 模拟............................................................................................................14 (3) Memory 模拟......................................................................................................14 (4 ).I/O device 模拟...................................................................................................15 2.4.2 入口函数main()及Win32 Gui 初始化........................................................15 2.5 Bochs 的工作方式......................................................................................................18 Chapter 3 CPU 类的源码分析...................................................20 3.1 CPU 类概述................................................................................................................20 3.1.1 CPU 逻辑结构框图......................................................................................20 3.1.2 类BX_CPU_C 成员归纳.............................................................................20 3.2 类BX_CPU_C 源码分析..........................................................................................21 3.2.1 CPU 特性声明..............................................................................................21 3.2.2 类bxInstruction_c 成员分析........................................................................22 3.2.3 类BX_CPU_C 源码注释.............................................................................22 3.3 通用寄存器.................................................................................................................29 3.3.1 数据结构与注释...........................................................................................29 3.3.2 通用寄存器归纳...........................................................................................30 3.4 段寄存器、全局寄存器GDI 和IDT ........................................................................31 3.4.1 数据结构与注释...........................................................................................31 3.4.2 段寄存器结构分析.......................................................................................33 3.5 CPU 状态字EFLAGS................................................................................................35 3.5.1 数据结构与注释...........................................................................................35 Understanding the source code of bochs
<think>我们面对的问题是:尽管X11/Xlib.h文件确实存在于/usr/include/X11目录中,但在编译Bochs时仍出现找不到该文件的错误。这通常是由于编译器在搜索头文件时没有包含该路径。可能的解决方案:1.检查编译器搜索路径:编译器默认会搜索/usr/include,因此/usr/include/X11应该被包括(因为Xlib.h位于/usr/include/X11目录下,我们应该使用`#include<X11/Xlib.h>`,所以路径是正常的)。但有时由于系统配置问题,可能需要显式指定。2.检查bochs的编译配置:在编译bochs时,可能由于配置阶段没有正确检测到X11,导致在Makefile中没有正确设置包含路径。3.检查环境变量:如CPATH,C_INCLUDE_PATH等是否设置异常。4.检查是否存在多个X11安装版本,导致路径混乱。具体步骤:第一步:验证X11开发包是否确实安装我们可以运行以下命令来确认:dpkg-llibx11-dev如果未安装,则安装它:sudoapt-getinstalllibx11-dev第二步:检查文件存在性我们已经知道文件存在于/usr/include/X11/Xlib.h,所以这一步可以跳过。第三步:检查bochs的configure脚本是否检测到X11在bochs的编译过程中,configure脚本负责检测系统环境并生成Makefile。如果configure没有正确检测到X11,那么编译时就会找不到头文件。我们可以尝试重新运行configure并确保它启用了X11支持,同时查看config.log以确认是否有关于X11的错误。建议步骤:1.进入bochs源码目录(/home/shan/bochs-2.7)2.运行:makedistclean(如果没有distclean,则运行makeclean)3.重新运行configure,并添加--with-x11选项(通常这是默认的),同时可以尝试指定X11路径(虽然通常不需要):./configure--with-x11--x-includes=/usr/include--x-libraries=/usr/lib4.检查configure的输出,确保它找到了X11库。第四步:如果configure成功检测到X11,然后再次运行make,观察是否还有同样的错误。第五步:如果问题仍然存在,可以手动修改Makefile。在出现错误的目录(这里是gui目录)的Makefile中,找到包含路径设置(CFLAGS或CXXFLAGS),添加:-I/usr/include/X11但注意,在头文件包含时,我们是包含<X11/Xlib.h>,所以实际上编译器搜索路径只需要包含/usr/include,而X11是子目录。所以通常不需要特别指定。第六步:检查编译命令在编译时,可以查看具体的编译命令(就是g++那一行),看看是否有`-I/usr/include`或类似选项?如果默认已经包含/usr/include,则应该能找到。但是,在您提供的错误信息中,编译命令是:g++-c-I..-I./..-I../iodev-I./../iodev-I../instrument/stubs-I./../instrument/stubs-g-O2-D_FILE_OFFSET_BITS=64-D_LARGE_FILES-pthreadx.cc-ox.o这里没有包含/usr/include,但通常g++会自动包含标准路径(包括/usr/include)。所以问题可能不在编译器的默认路径。那么为什么还找不到Xlib.h?可能原因:-系统没有将/usr/include作为默认包含路径(极少见,除非使用交叉编译或特殊环境变量覆盖)-头文件被安装到了非标准位置我们可以通过以下命令检查g++的默认包含路径:echo|g++-v-E-xc++-在输出中查找“#include<...>searchstartshere:”后面的路径,看是否包含/usr/include。第七步:环境变量检查是否有环境变量(如CFLAGS,CXXFLAGS,C_INCLUDE_PATH)设置不当,导致覆盖了默认路径。例如,如果设置了C_INCLUDE_PATH指向其他路径,那么可能会忽略/usr/include。可以尝试在编译前清除这些环境变量。第八步:尝试在编译命令中显式添加包含路径修改gui目录下的Makefile,在编译选项中加入`-I/usr/include`(虽然理论上不需要,但可以测试)。因为错误是在编译x.cc时,在x.cc中包含了<X11/Xlib.h>。我们可以临时修改x.cc的编译规则:在gui/Makefile中找到对x.o的编译规则,它应该是类似于:x.o:x.cc$(CXX)$(CXXFLAGS)-cx.cc-ox.o修改为:x.o:x.cc$(CXX)$(CXXFLAGS)-I/usr/include-cx.cc-ox.o然后重新编译。如果这样修改后编译通过,说明问题在于编译器没有正确包含/usr/include路径。但请注意,这种方式是临时的,最好通过configure来解决。第九步:如果上述都不行,可能系统需要安装更多与X11相关的开发包。除了libx11-dev,可能还需要安装libxrandr-dev、libxinerama-dev等。可以尝试安装完整X11开发包:sudoapt-getinstallxorg-dev因为xorg-dev包含了X11服务端和客户端所需的所有开发文件。下面按照这些步骤进行:1.重新运行configure并检查输出:cd/home/shan/bochs-2.7makedistclean#如果没有distclean,则用clean./configure--with-x11--x-includes=/usr/include--x-libraries=/usr/lib2.在configure的输出中,查找是否有X11相关的特性被启用。通常会有类似以下行:checkingforX...yescheckingforXShmGetEventData...yes3.然后运行make。如果仍然出现同样的错误,那么在编译时手动检查g++的默认包含路径,并检查config.log文件(位于bochs源码根目录)中的错误。由于您已经知道Xlib.h在/usr/include/X11下,我们也可以尝试在编译命令中直接使用绝对路径包含头文件(虽然不推荐,但可以测试):#include"/usr/include/X11/Xlib.h"修改gui目录下的x.cc文件,将#include<X11/Xlib.h>改为上面的绝对路径形式(注意:这只是测试,不要长期这样用)。如果这样改可以编译,说明问题在于编译器没有找到该头文件,需要确定为什么没有搜索/usr/include/X11。但注意,标准做法是使用<X11/Xlib.h>,因为X11目录在/usr/include下,所以应该能通过<X11/Xlib.h>找到。另一个可能性是权限问题?检查/usr/include/X11/Xlib.h的权限,确保所有用户可读。综上所述,最可能的解决方法是重新运行configure并确保X11被正确检测,或者安装xorg-dev完整包。如果问题仍然存在,可能需要详细检查config.log中的错误。下面,我们给出具体的步骤:步骤1:安装完整X11开发包(如果之前只装了libx11-dev)sudoapt-getinstallxorg-dev步骤2:清理并重新配置cd/home/shan/bochs-2.7makeclean./configure--with-x11步骤3:检查configure输出,然后运行make如果仍然不行,则检查config.log文件。步骤4:检查config.log在config.log中搜索"Xlib.h",看是否有相关的错误。例如,可能存在链接错误(虽然头文件存在,但是链接库不存在),这会导致configure认为X11不可用。步骤5:手动设置环境变量(如果必要)exportC_INCLUDE_PATH=/usr/includeexportLIBRARY_PATH=/usr/lib然后重新configure和make。注意:在大多数系统上,/usr/include是默认包含路径,所以通常不需要设置。最后,如果所有方法都试过还是不行,可以考虑使用其他显示库(如SDL)编译bochs,使用--with-sdl选项,或者使用--without-gui编译一个无图形界面的版本(但可能不是你的需求)。由于时间关系,我建议先尝试安装xorg-dev并重新configure。生成相关问题:1.如何查看g++的默认头文件搜索路径?2.如何理解config.log中的错误?3.Bochs是否支持其他图形界面(如SDL)?4.如何设置环境变量来影响configure的检测过程?5.在没有X11的环境下如何运行Bochs?</think> 您的反馈表明 X11/Xlib.h 文件已存在系统中但编译时仍无法找到。这通常是由头文件路径配置问题引起,以下是逐步解决方案: ### 问题诊断与解决步骤 1. **验证头文件位置** 确保文件确实在标准路径中: ```bash ls -l /usr/include/X11/Xlib.h # 确认文件存在性及权限 ``` 2. **检查g++默认搜索路径** 查看编译器实际包含路径: ```bash echo | g++ -v -x c++ -E - 2>&1 | grep "/usr/include" ``` 若输出**缺少 `/usr/include/X11`**,需要手动添加路径 3. **临时添加编译器参数** 修改 `gui/Makefile` 文件: ```makefile # 在CFLAGS行(约第119行)添加X11包含路径 CFLAGS += -I/usr/include/X11 ``` 或直接修改编译命令: ```bash cd gui g++ -c -I/usr/include/X11 x.cc -o x.o # 添加-I参数 ``` 4. **检查pkg-config配置** 验证X11开发包配置是否正确: ```bash pkg-config --cflags x11 ``` **期望输出**:`-I/usr/include/X11` 5. **检查系统符号链接** 查找是否有多版本X11冲突: ```bash ls -l /usr/include | grep &#39;X11 ->&#39; ``` 6. **彻底方案:重新配置项目** 退回源码根目录清理重建: ```bash make distclean ./configure --x-include=/usr/include/X11 --x-lib=/usr/lib make ``` ### 常见排查场景分析 | 场景 | 表现 | 解决方案 | |------|------|----------| | 多版本X11冲突 | `/usr/local/include/X11` 与 `/usr/include/X11` 共存 | 删除多余版本:`sudo rm -rf /usr/local/include/X11` | | 权限异常 | Xlib.h权限为600(非644) | `sudo chmod 644 /usr/include/X11/Xlib.h` | | 跨架构开发 | 64位系统编译32位程序 | 安装兼容库:`sudo apt-get install libx11-dev:i386` | ### 深度优化建议 1. **编译器缓存检查** ```bash g++ -dM -E -x c++ /dev/null | grep X11 ``` 检查预定义宏 `__X11__` 是否启用 2. **环境变量覆盖检查** 排查以下变量是否覆盖系统路径: ```bash echo $CPATH $C_INCLUDE_PATH ``` 3. **动态链接路径验证** ```bash ldconfig -p | grep libX11.so ``` ### 相关问题延伸 1. 当系统中存在多版本X11时如何指定特定版本? 2. 如何验证编译器查找头文件的完整搜索路径? 3. 在交叉编译环境下如何配置X11开发库路径? 4. 如何生成详细的GCC预处理阶段日志用于调试? 5. `pkg-config`机制在软件编译中的作用原理?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值