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

IDT系列:(二)中断处理过程,使用bochs调试IDT中的中断服务程序 一、中断处理的过程根据Intel 64 and IA-32 Architectures Software Developer’s Manual 的介绍,在中断或异常产生是,CPU会将当前执行的指令(或下一条指令)在内存中的地址,也就是EIP的值,放入栈中,同时还会放入CS段寄存器和eflags标志寄存器的值等。根据当前的优先级不同(ring0或ring3,也就是执行与用户态还是内核态)会有较大的不同。如果异常或中断发生时,系统正执行在内核态,那么CPU不会切换栈,直接将EFLAGS、CS、EIP和Error 阅读详情

前言

        上一期,我们粗略分析了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,则条件断点的激活规则为 "bx_cpu.gen_reg[16].rrx == 0xe05d"。

OUT指令的执行流程

        "out 0Dh,al",简单来说就是将al中存储的一个字节的数据输出到0xd端口处,至于这个字节的数据去往哪里,关键要看哪个设备连接着这个端口,这里时DMA控制器。当这个字节传输到0xd端口中,DMA会接收到该数据然后来进行内部处理。

>	bochs.exe!bx_dma_c::reset_controller(unsigned int num) Line 187	C++
 	bochs.exe!bx_dma_c::write_handler(void * this_ptr, unsigned int address, unsigned int value, unsigned int io_len) Line 512	C++
 	bochs.exe!bx_devices_c::outp(unsigned short addr, unsigned int value, unsigned int io_len) Line 1044	C++
 	bochs.exe!BX_CPU_C::OUT_IbAL(bxInstruction_c * i) Line 748	C++
 	bochs.exe!BX_CPU_C::cpu_loop() Line 85	C++

        上图是bochs的cpu对该指令的处理调用堆栈,其调用逻辑还是比较清晰的,我们简单整理一下该指令运行的流程图,该流程图很好理解。

 IO注册过程回顾

        上面我们分析了IO事件的处理办法,现在我们回顾一下IO的注册过程,之前在floppy第七篇文章中作为一个小部分来分析过,现在再来重新拿出来分析一下。

        其bx_devices_c结构体中有两个成员"read_port_to_handler"与"write_port_to_handler",其指向一张由io_handler_struct结构体组成的一张表,每一个端口号各对应一个。

class BOCHSAPI bx_devices_c : public logfunctions {  
private:
    ....
    struct io_handler_struct **read_port_to_handler;
    struct io_handler_struct **write_port_to_handler;
    ...
public:
    ...
}

struct io_handler_struct {
   struct io_handler_struct *next;
   struct io_handler_struct *prev;
   void *funct; // C++ type checking is great, but annoying
   void *this_ptr;
   char *handler_name;  // name of device
   int usage_count;
   Bit8u mask;          // io_len mask
 };

         在各个设备初始化时会对每个端口来注册一个,其中写入自己的io处理函数的地,依次注册上去。如下代码是在第七篇文章中分析的floppy的注册端口号:

  for (unsigned addr=0x03F2; addr<=0x03F7; addr++) {
    DEV_register_ioread_handler(this, read_handler, addr, "Floppy Drive", 1);
    DEV_register_iowrite_handler(this, write_handler, addr, "Floppy Drive", 1);
  }

        其整体的数据结构如下,还是之前的那一张图,很好理解。

总结

        这篇文章比较简单,其bochs对于io的模拟没想的那么复杂,很好理解。但是,在调试过程中发现那个宏修改来禁止cpu递归执行还是存在一系列的问题,接下来我们尝试来解决这个问题,并且分析CPU在执行流程上存在的差异。

Bochs源码分析 - 8:bochs的CPU代码初步分析 前言 上一篇文章,我们分析了floppy设备的初始化,本来我们希望看看floppy的工作原理,但是调试时发现其运行cpu,通过BIOS启动指令来调用floppy。(从现在来看这是肯定的,floppy是外设,要想调用必须通过cpu,还是自己对底层不太熟悉) Bochs的CPU模块特别复杂,函数众多,我们是第一次分析,对其结构还是不太熟悉,我们先尝试来看其执行流程。在分析前,我浏览了一遍喻强老师的《Bochs项目源码分析与注释》,其CPU模块的核心图如下。 CPU模块的... 阅读详情

相关推荐

Bochs源码分析 - 11:《X86探索及编程》代码初步解释

前言 现在我们来阅读邓志老师的《x86/x64体系探索及编程》,边阅读边将其代码放到bochs中运行,然后观察bochs的CPU是如何来模拟的。现在我们来详细分析ex3-2目录里面的内容。 boot.asm 代码解读 自己在工作中经常看汇编代码,但是写汇编代码真的很少写过,我们现在一边分析着这段boot汇编代码一边回顾其如何编写。 ; Int 19h 加载 sector 0 (MBR) 进入 BOOT_SEG 段, BOOT_SEG 定义为 0x7c00 ...

WriteAnything_的博客 1021

Bochs源码分析 - 17:分析Bochs对于int指令的实现

前言 在《x86/x64编程体系探索及编程》的第207页,其举了一个使用中断服务例程的例子,我们现在来分析其源码以及探究bochs是如何实现的(重点探究int指令)。 代码分析 其首先设置好调用set_user_interrupt_handler来调用中断向量,内容如下: mov esi, SYSTEM_SERVICE_VECTOR // 0x40 mov edi, system_service // lib ...

WriteAnything_的博客 633

Bochs源码分析 - 12:这才是真正的调试姿势!!

前言 之前我们为了正确的调试bochs,采用了很多方法,一种是利用IDA进行调试,第二种是采用bochs-dbg配合调试,第三种是在cpu_loop(..)中下循环来进行调试。这三种来实际操作中都很不方便。 真正的调试姿势 IDA以二进制模式分别以0x7c00,0x8000-2为偏移打开uboot.bin与setup.bin文件,静态分析;配置调试模式编译bochs,精确下断点定位指令;再通过visual studio 在cpu_loop(..)函数中下软件断点分析指令...

WriteAnything_的博客 688

Bochs源码分析 - 6: bochs的物理内存初始化

前言 上一篇文章,我们走马观花地介绍了bochs从启动到CPU执行流程的大体流程,里面相关数据结构没详细分析。这篇文章我们尝试来详细分析一下bochs的物理内存初始化,首先有个概念需要理清(相信来看bochs源码的人肯定会知道):bochs只负责处理物理内存,而虚拟内存是运行在bochs中运行的OS来负责的,我们只需要关注物理内存。 找到内存初始化函数 在上篇文章中,我们提到过一个比较重要的函数bx_init_hardware(),该函数负责初始化各种硬件(内存,Io...

WriteAnything_的博客 941

Bochs源码分析 - 4: 使用ida来调试bochs

前言 bochs内部提供了一个调试器,但是这个命令行调试器相当难用,想找一个gui的debugger。第一次是在百度百科的bochs词条中介绍的peter-bochs-debugger调试器(java编写),但是后来发现ida也有一个bochs调试器,因为对ida比较熟悉,就选用此作为bochs调试器。 在配置过程中参考博客 https://blog.csdn.net/cssxn/article/details/90738498 中的配置,但是这是直接发布版本,拿源码编译...

WriteAnything_的博客 2756

Linux 0.01内核源码深度解析:从启动到进程调度的操作系统原理

操作系统是计算机系统的核心软件,负责管理硬件资源与进程调度。Linux内核作为开源操作系统的代表,其早期版本Linux 0.01仅约9000行代码,却完整实现了进程管理、内存分页、文件系统与系统调用等关键机制。理解这些基础概念,有助于开发者掌握操作系统的设计原理,也为嵌入式开发与内核源码阅读打下坚实基础。本文从源代码结构、启动流程、核心子系统入手,结合QEMU模拟器与GDB调试,剖析Linux 0.01的进程调度、写时复制和Minix文件系统实现,并给出实际运行与调试方法,帮助读者在真实场景中理解操作系统的

weixin_34116482的博客 228

使用Bochs学习硬件原理

什么是Bochs? 简单地说,Bochs是一款仿真软件,可以用软件的方式模拟硬件的工作。同类软件有Qemu,仿真软件与虚拟机(hypervisor)还不完全相同,仿真软件是完全软件模拟硬件,而虚拟机软件(比如Vmware, VirtualBox)是利用主机的硬件进行工作。 Bochs的主页地址:http://bochs.sourceforge.net/ Bochs软件的下载地址:http:/...

weixin_33850015的博客 1372

Bochs项目源码分析与注释.pdf

关于BOCHS虚拟机的源码分析,适合对操作系统和虚拟机感兴趣的朋友。

在Visual C++中调试Linux 0.11内核:搭建混合开发环境与实战指南

操作系统内核是计算机系统的核心,负责管理硬件资源和提供基础服务。理解其工作原理对于深入计算机体系结构至关重要,而调试是学习内核不可或缺的环节。传统上,内核调试依赖于命令行工具和模拟器,流程割裂,体验不佳。现代集成开发环境(IDE)通过远程调试技术,能够将源码管理、智能导航和图形化调试界面整合,极大提升学习与开发效率。Visual Studio凭借其强大的C++开发与跨平台调试能力,结合GDB远程调试协议,可以构建一个高效的混合开发环境。这使得开发者能够在熟悉的Windows IDE界面下,对运行在Linux

weixin_34214500的博客 311

Ubuntu22.04实战:基于VLLM高效部署Qwen3系列模型并构建Dify智能体

本文详细介绍了在Ubuntu22.04系统上使用VLLM高效部署Qwen3系列模型并集成Dify平台的实战指南。从环境配置、Conda管理到VLLM优化部署,再到Dify智能体构建,提供了全面的技术方案和性能调优建议,帮助开发者快速实现AI模型的高效部署与应用。

weixin_28323057的博客 161

Pytorch.nn.Linear 解析(数学角度)

pytorch.nn.Linear 是一个类,下面是它的一些初始化参数 in_features : 输入样本的张量大小 out_features : 输出样本的张量大小 bias : 偏置 它主要是对输入数据做一个线性变换。 y=xAT+b y=xA^T+b y=xAT+b 这里A是权重矩阵,b是偏置。他们都是根据 in_features 生成 测试代码: m = torch.nn.Linea...

Medlen 1万+

Bochs源码分析 - 5: 从启动到cpu运行之前的一系列初始化

前言 现在正式开始调试bochs源代码,在这之前我也没读过bochs源码,算是从零开始读,自己可能会走入一些误区,有些可能猜错,如果发现之后会来改正。我们先大体走一遍整个系统,不要纠结于各种复杂细节流程。 这篇文章开始分析程序在点击启动后如何开始并且一步步初始化完成初始化,完成相关配置文件。说实话,如下图bochs启动时一系列的配置参数,对像我这种新手来说是相当恐怖的,各种启动参数信息。其实调试过一遍之后,虽然里面很多细节还是不太懂,但是再看这些信息心里踏实多了。 启...

WriteAnything_的博客 1313

RK3566开发板实战:YT8512C百兆网卡调试全记录(附DTS配置避坑指南)

本文详细记录了RK3566开发板上YT8512C百兆以太网卡的调试全过程,包括硬件信号检测、DTS配置优化及常见错误排查。特别针对DTS配置中的关键参数和避坑指南进行了深入解析,为开发者提供实用的调试技巧和经验分享。

weixin_29189381的博客 272

Bochs源码分析-CPU类

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 在Bochs模拟机里面CPU类是最复杂的一个类,也是最重要的一个类。原因很简单,在整个计算机体系中CPU处于中心位置,计算机其它部件都是在CPU的调控下进行有序的工作,当然C...

weixin_30635053的博客 267

【博客汇总】UV打印机博客汇总

UV平板机博客汇总

Print World的专栏 1740

基于YOLOv13+CBAM注意力机制

本教程详细介绍了CBAM注意力机制的原理及其在YOLOv13中的集成方法。CBAM通过通道注意力和空间注意力两个模块,动态调整特征权重以增强模型性能。通道模块利用池化操作和共享MLP生成通道权重,空间模块则通过池化和卷积生成空间权重。教程提供了在YOLOv13中实现CBAM的具体步骤,包括模块代码定义、模型配置修改等关键环节,帮助开发者在目标检测任务中提升模型表现。

FJN110的博客 305

Bochs源码分析 - 2:使用bochs运行引导代码

前言 这一篇文章中,我们尝试使用编写引导代码,然后配置bochs让其可以运行这份代码,过程中遇到的问题,为什么这么做,我会尽可能详细的描述给大家,当然自己可能存在错误,请见谅!! 安装 nasm 编译器 ...

WriteAnything_的博客 1312

【STK】手把手教你利用STK进行光电红外仿真04-STK/EOIR模块的实战操作1航天器星载相机对LEO卫星成像

今天引入一个实际的场景,帮助大家完成对于这个模块的理解与运用。

weixin_44184852的博客 2417

Bochs源码分析-MEM类

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 计算机系统最主要的两个部件是CPU和内存。CPU负责不断读取内存里面的指令进行工作。一块固定大小的内存条(2G)和能由很多ROM,RAM,SDRAM通过位扩展法、字扩展法共同...

weixin_30725315的博客 271

Python调用CANoe

我们可以创建CANoe应用程序对象,打开配置文件,启动模拟,发送和接收消息,并在完成后关闭CANoe应用程序。这使得我们能够使用Python自动化执行测试任务,并集成CANoe的功能到我们的Python应用程序中。CANoe是一款功能强大的汽车网络仿真和测试工具,它能够模拟和分析汽车网络通信,并提供丰富的测试功能。通过Python编程语言,我们可以方便地调用CANoe的API,实现自动化测试和集成CANoe的功能到我们的Python应用程序中。在CANoe中,我们可以为不同的汽车网络创建配置文件。

AzqLinux的博客 1287

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

Bochs源码分析 - 19:分析Bochs对于bound,into的实现

前言 在《x86/x64体系探索及编程》的ex10-7代码中,使用了int3,bound,into来加载CS寄存器。我们现在来尝试分析bochs对于这几条指令的实现。 into指令分析 关于into以及处理OF异常的代码如下,比较好理解。into指令只是判断eflag的of位,这位标志着是否存在溢出发生,如果存在溢出,则触发OF异常。 ;; 测试 INTO 指令 mov eax, 0x80000000 mov ebx, eax ...

WriteAnything_的博客 871

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Bochs源码分析-初始化部分

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 从程序运行到模拟机真正开始工作,即模拟程序代码的运行,这一部分称为程序的初始化。其中主要包括1:获取用户参数决定程序运行方式,2:获取模拟器配置信息(主要放在配置文件boch...

weixin_30919571的博客 338

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Bochs源码分析-调试功能

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 Bochs虚拟机一个很重要的功能就是调试,有助于系统程序的开发与研究,虚拟机可以让操作系统在任何时候停止运行,并查看此时计算机内部所有部件的内容与数据状态。在Bochs源码中...

weixin_30423977的博客 380

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于 Bochs 的操作系统内核实现

简介 Bochs 简介 Bochs(读音Box)是一个开源的模拟器(Emulator),它可以完全模拟x86/x64的硬件以及一些外围设备。与VirtualBox / VMware等虚拟机(Virtual Machine)产品不同,它的设计目标在于模拟一台真正的硬件,并不追求执行速度的高效,而追求模拟环境的真实,同时带有强大的调试功能,比如观察寄存器、对实地址/虚拟地址下断点、装载符号

xyjikl 4183
上一篇: Bochs源码分析 - 8:bochs的CPU代码初步分析
下一篇: Bochs源码分析 - 10: BX_NEXT_INSTR宏指令修改的错误
WriteAnything_
博客等级 码龄5年 66粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值