Bochs源码分析 - 18:分析Bochs对于iret指令的实现

汇编语言——第13章 int指令 阅读详情

前言

         上篇我们分析了bochs对于int产生的interrupt事件的模拟处理流程,只是我们还没看看其返回如何实现的,我们这篇文章来分析一下。

         虽然源代码还没看,但我估计这篇文章有点短,昨晚失眠到两点多,今天早上还是七点起来,中午竟然睡不着,我人麻了,早写完回家洗个澡休息。

 bochs-dbg定位

        这个之间按上篇文章 int 指令往前jmp几条指令后就很容易看见,不用ida来逆向分析了,因为其还要逆向lib32库挺麻烦的。

代码分析

        其iret与int一样,在不同模式下其行为不一样,因此iret指令一上来就需要做当前CPU模式判断,在保护模式中,之后其按顺序出栈,加载段选择子,这些很好理解,在上篇文章中这些具体操作我们都分析过了,这里就不过多解释了。

        值得注意的是,好像无论trap还是interrupt,其iret时执行的行为方式没有差别,在分析过程中没有看到对此的区分,之后我们还会对trap再来一轮分析。

BX_CPU_C::iret_protected(bxInstruction_c *i)
{

  /* 16bit opsize  |   32bit opsize
   * ==============================
   * SS     eSP+8  |   SS     eSP+16
   * SP     eSP+6  |   ESP    eSP+12
   * -------------------------------
   * FLAGS  eSP+4  |   EFLAGS eSP+8
   * CS     eSP+2  |   CS     eSP+4
   * IP     eSP+0  |   EIP    eSP+0
   */
    temp_ESP = ESP;
    new_eflags      =          stack_read_dword(temp_ESP + 8);
    raw_cs_selector = (Bit16u) stack_read_dword(temp_ESP + 4);
    new_eip         =          stack_read_dword(temp_ESP + 0);


    parse_selector(raw_cs_selector, &cs_selector);
    fetch_raw_descriptor(&cs_selector, &dword1, &dword2, BX_GP_EXCEPTION);
    parse_descriptor(dword1, dword2, &cs_descriptor);

  // check code-segment descriptor
  check_cs(&cs_descriptor, raw_cs_selector, 0, cs_selector.rpl);
    raw_ss_selector = stack_read_word(temp_ESP + 16);


    parse_selector(raw_ss_selector, &ss_selector);
    fetch_raw_descriptor(&ss_selector, &dword1, &dword2, BX_GP_EXCEPTION);
    parse_descriptor(dword1, dword2, &ss_descriptor);

    new_esp = stack_read_dword(temp_ESP + 12);

    // 加载cs段选择子,修改RIP
    branch_far(&cs_selector, &cs_descriptor, new_eip, cs_selector.rpl);

        writeEFlags(new_eflags, changeMask);

    // load SS:eSP from stack
    // load the SS-cache with SS descriptor
    load_ss(&ss_selector, &ss_descriptor, cs_selector.rpl);
    if (ss_descriptor.u.segment.d_b)
      ESP = new_esp;
    else
      SP  = new_esp;

      validate_seg_reg(BX_SEG_REG_ES);
      validate_seg_reg(BX_SEG_REG_DS);
      validate_seg_reg(BX_SEG_REG_FS);
      validate_seg_reg(BX_SEG_REG_GS);
    
}


// stack
>	bochs.exe!BX_CPU_C::iret_protected(bxInstruction_c * i) Line 318	C++
 	bochs.exe!BX_CPU_C::IRET32(bxInstruction_c * i) Line 569	C++
 	bochs.exe!BX_CPU_C::cpu_loop() Line 109	C++
 	bochs.exe!bx_dbg_stepN_command(int cpu, unsigned int count) Line 2083	C++

总结

        iret指令本身没什么复杂的,就是出栈修改cs,ss,esp,eip,eflag这个几个值。我们之后如果遇见retf来在进行对比一番,并不复杂。        

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源码分析 - 25:关于内存寄存器及属性有关机制说明

前言 之前我们一直没有介绍与内存相关的寄存器以及页项中的各个属性位及其影响,现在我们写这篇文章来分析一下有关机制。 CR0.PG Paging (bit 31 of CR0) — Enables paging when set; disables paging when clear. When paging is disabled, all linear addresses are treated as physical addresses. The PG fla...

WriteAnything_的博客 503

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

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

WriteAnything_的博客 688

操作系统---中断/异常的处理过程

操作系统---中断/异常的处理过程

m0_57449653的博客 1万+

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

Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。

基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)...

综述作者:aresmiki链接:https://www.zhihu.com/question/23701194/answer/167005497来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。非平稳信号处理应该是现在信号处理技术最新的也是最热的研究方向了,信号处理方法从最早的时域统计到傅里叶变换的频域分析,是人们认识信号本质的一次巨大飞跃,给了分析人员换个角度看世界的...

weixin_32144483的博客 1249

IRET指令详解

copy from http://lion3875.blog.51cto.com/2911026/532347 当使用IRET指令返回到相同保护级别的任务时,IRET会从堆栈弹出代码段选择子及指令指针分别到CS与IP寄存器,并弹出标志寄存器内容到EFLAGS寄存器。 当使用IRET指令返回到一个不同的保护级别时,IRET不仅会从堆栈弹出以上内容,还会弹出堆栈段选择子及堆栈指针分别到SS

菜鸟的逆袭 1万+

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

Bochs源码分析 - 0 文章集合

为什么要阅读Bochs源码 Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。 ...

WriteAnything_的博客 1803

昇腾Ascend310b部署deepseek-r1-7b的学习记录

9.鲲鹏服务器+昇腾卡(Atlas 300I pro)搭建DeepSeek-R1-Distill-Qwen-7B(自己存档详细版)5.如何使用昇腾Ascend 300I Pro 310P芯片 单卡运行DeepSeek-R1-Distilled-Qwen-7B。6.鲲鹏服务器+昇腾卡(Atlas 300I pro)搭建DeepSeek-R1-Distill-Qwen-7B。7.鲲鹏+昇腾部署DeepSeek-R1-Distill-Qwen-32B+Open-webui。

maken 2368

同花顺 python量化交易_开启量化第一步!同花顺iFinD数据接口免费版简易操作教程...

来源:雪球App,作者: 同花顺-iFinD,(https://xueqiu.com/6706494343/141951051)金融市场波动频繁,投资往往会夹杂非理性的情绪。而量化交易,旨在以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,辅助投资者进行理性投资。不过计算机分析存在一定的技术门槛,有没有简单易学的量化交易方式,能够...

weixin_35911805的博客 2万+

汇编ret ,retf ,iret ,int指令详解

1.恢复 IP(instruction pointer):(IP)←((SP)+1:(SP)),(SP)←(SP)+2。2.恢复 CS(code segment):(CS)←((SP)+1:(SP)),(SP)←(SP)+2。3.恢复中断前的 PSW(program status word),即恢复中断前的 标志寄存器的状态。最后,call、ret、retf 这三条指令执行后不会对标志位产生影响。ret指令用栈中的数据,修改IP的值,从而实现近转移。IRET指令影响所有标志位。

我写写哈的博客 3977

Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)

本文深入解析Fluent UDF中DEFINE_PROFILE宏在复杂边界条件中的高阶应用,涵盖温度场、组分浓度和壁面接触角等关键场景。通过实战代码示例,展示如何实现空间梯度温度场、动态组分控制和接触角动态调整,助力CFD工程师突破标准界面限制,提升仿真精度和效率。

weixin_28688385的博客 449

头歌操作系统2.2 第三关

`iret` 地址找不到 | 函数名可能不同或已被优化 | 在 `display_interrupt` 反汇编中直接搜索 `iret`,或使用 `finish` 返回到调用者再找 || 栈地址 `esp` 不是 `0xffffec` | 每次运行内核栈位置可能不同 | 以你 `info registers` 显示的实际 `esp` 值为准 || `disas` 中 `int` 地址不是 `0x798f` | 编译版本或配置不同 | 以你实际看到的地址为准,填入答案 |

Seraphina_y的博客 489

【新手流程】1小时解决Anaconda+Cuda+Cudnn+Pytorch+Pycharm深度学习环境配置

一小时速通Anaconda+Cuda+Cudnn+Pytorch+Pycharm环境配置

m0_57190453的博客 4085

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

汇编 (八) CALL 和 RET 指令

call 和 ret 都是转移指令,都修改IP,或同时修改 CS和IP. 1.1 ret 和 retf ret 指令用栈中的数据,修改IP的内容,从而实现近转移。 CPU在执行ret指令的时候,进行下面2步操作: (IP)=((ss)*16+(sp)) (sp)=(sp)+2 相当于进行pop IP. 举例: ret指令执行后,(IP)=0; CS:IP指向代码段的第一...

Hulk 1559

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

iret指令详解

在“实地址模式”中,IRET 指令执行到中断程序或过程的远返回。在执行此操作的过程中,处理器从堆栈将返回指令指针、返回代码段选择器以及 EFLAGS 映像分别弹入 EIP、CS 以及 EFLAGS 寄存器,然后恢复执行中断的程序或过程。 在“保护模式”中,IRET 指令的操作取决于以下因素:EFLAGS 寄存器中 NT(嵌套任务)与 VM 标志的设置,以及当前堆栈中存储的 EFLAGS 映像

GetnextWindow的专栏 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

利用Bochs调试linux0.11启动过程

看到这文章写的不错,顺便就当学习下Bochs的使用,不过没有图,图片都是自己添加上的。利用Bochs调试linux的启动过程  Sean Yi  2006/11/17  摘要:现在hack linux kernel的人很多,而调试工具很少,Bochs的最大的好处就是它的调试功能,它能仿真IA-32的全部指令,所有这些都是用C++写成的,并且开源。  名词:Bochs  Bochs是Kevin La

rein07的专栏 1507

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Intel 64/x86_64/x86/IA-32处理器的指令指针(IP/EIP/RIP)

Instruction Pointer 指令指针IP/EIP/RIP的基本功用是指向要执行的下一条地址。在8080 8位微处理器上的寄存器名称是PC(program counter,程序计数器),从8086起,被称为IP(instruction pointer,指令指针)。主要区别在与PC指向正在执行的指令,而IP指向下一条指令。 指令指针EIP寄存器包含了当前代码段中的一个偏移量,通过CS...

一凡stkeke 9791

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

十分钟快速上手CCS,选择器(Selector)

主要有四个选择器「元素」、「class」、「id」、「属性」,被选择到的对象,就会套用该设定值,未被选择到的项目就已预设值显示。使用方式:先输入「元素」或「class」或「id」,再接着「>」符号或「一个空格」,在输入「子元素」。可以针对「元素」或「class」或「id」下的子元素进行设定,减少「子元素」设定「元素class」或「元素id」的动作。会使用「属性」,表示仅针对有相应的「属性」之元素进行套用,有一定程度的减少设定「元素class」或「元素id」的动作。(一)、「元素(tag)」选择器。

hdtmd的博客 1172

Orange'S学习笔记(一)

学习环境 Ubuntu 11.04 + Bochs 2.4.6 + NASM 主要工作 1. 第一章 马上动手写一个最小的“操作系统” 代码如下: 1 org 07c00h     ; tell the compiler that the program is loaded at 7c00 2 mov ax, cs 3 ...

weixin_30254435的博客 818

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

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

WriteAnything_的博客 1313

微机技术题库复习题

这几天写题写的头晕,下下周就期末,只对微机技术发愁。1【单选题】 无论是微处理器、微型计算机还是微型计算机系统,都是采用(A )连接各部件而构成的一个整体。 A总线结构框架 B控制总线 C输入输出接口 D内外存储器 2【单选题】 8086微处理器有20根地址线,所以物理地址编址范围为(A )。 A0000H-FFFFH

2puT 8943
上一篇: Bochs源码分析 - 17:分析Bochs对于int指令的实现
下一篇: Bochs源码分析 - 19:分析Bochs对于bound,into的实现
WriteAnything_
博客等级 码龄5年 66粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值