Bochs源码分析 - 13:结合intel手册尝试分析CLI指令的实现

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

前言

        上篇文章我们讲了如何调试bochs的cpu代码,这篇文章我们尝试结合intel手册来一起研究一下其cpu代码的实现。

定位到cli指令的代码

        还是利用ext3-2中的代码,其0x7c00处的指令是cli,利用ph 0x7c00定位到该指令处。然后在vscode中设置断点,单步进入“BX_CPU_CALL_METHOD(i->execute1, (i));”函数中,代码如下。

void BX_CPP_AttrRegparmN(1) BX_CPU_C::CLI(bxInstruction_c *i)
{
  Bit32u IOPL = BX_CPU_THIS_PTR get_IOPL();

  if (protected_mode())
  {
#if BX_CPU_LEVEL >= 5
    if (BX_CPU_THIS_PTR cr4.get_PVI() && (CPL == 3))
    {
      if (IOPL < 3) {
        BX_CPU_THIS_PTR clear_VIF();
        BX_NEXT_INSTR(i);
      }
    }
    else
#endif
    {
      if (IOPL < CPL) {
        BX_DEBUG(("CLI: IOPL < CPL in protected mode"));
        exception(BX_GP_EXCEPTION, 0);
      }
    }
  }
  else if (v8086_mode())
  {
    if (IOPL != 3) {
#if BX_CPU_LEVEL >= 5
      if (BX_CPU_THIS_PTR cr4.get_VME()) {
        BX_CPU_THIS_PTR clear_VIF();
        BX_NEXT_INSTR(i);
      }
#endif
      BX_DEBUG(("CLI: IOPL != 3 in v8086 mode"));
      exception(BX_GP_EXCEPTION, 0);
    }
  }

  BX_CPU_THIS_PTR clear_IF();

  BX_NEXT_INSTR(i);
}

 INTEL手册中对cli的说明

        我们该如何阅读cpu代码的呢,我们计划与Intel的CPU手册中对该指令的解释来进行对比。我们先看intel手册中对该指令的描述(https://www.felixcloutier.com/x86/cli)

in most cases, CLI clears the IF flag in the EFLAGS register and no other flags are affected. Clearing the IF flag causes the processor to ignore maskable external interrupts. The IF flag and the CLI and STI instruction have no effect on the generation of exceptions and NMI interrupts.

Operation is different in two modes defined as follows:

  • PVI mode (protected-mode virtual interrupts): CR0.PE = 1, EFLAGS.VM = 0, CPL = 3, and CR4.PVI = 1;
  • VME mode (virtual-8086 mode extensions): CR0.PE = 1, EFLAGS.VM = 1, and CR4.VME = 1.

If IOPL < 3 and either VME mode or PVI mode is active, CLI clears the VIF flag in the EFLAGS register, leaving IF unaffected.

        看Intel手册,其CLI指令清除ELFAGS中的IF标志位,其他的标志位不会受映像。清除IF标志位可以让intel忽视可屏蔽中断,而其余的异常和NMI中断不会受影响,操作在保护模式(PVI)与虚拟8086模式(VME)模式下是不同的。

        如果IOPL<3 并且 (VME 或 PVI模式被激活),CLI将清除EFLAGS的cr4.VLF标志位,IF标志位不会受到影响。

CPU代码解读

        我们来解读其CPU代码,这块比较简洁,同时intel也给出了各种清空,因此综合来看绘制成表格比较清晰。

         因为我们现在是在实模式地址中,其仅仅将IF标志位置为零,之后调用inhibit_interrupts函数来屏蔽可屏蔽中断,其中的很多细节我们暂时还接触不到,之后随着深入学习,我们会逐渐了解其bochs中断的实现原理。

总结

        这篇文章只是尝试结合intel手册初步分析一下指令,可以看出,bochs的代码还是比较简洁的,通过intel手册中对指令的描述非常容易地来理解代码。

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

相关推荐

Linux内核(二)中断基本概念

转载请注明出处:jiq•钦's technical Blog    首先解释一些容易混淆的概念:   中断上下文:正在执行ISR或者下半部。没有进程背景(只是暂停CPU去内存中其他地方执行一段快速代码),所以不能被切换(比如睡眠,被其他进程抢占等都不行)。 进程上下文:非中断上下文(比如执行系统调用或者内核线程的时候)。此时内核代表线程在执行,所以允许睡眠,被抢占等(被切

jiq•钦's technical Blog 1491

Bochs源码分析 - 23:页表构建的汇编分析

前言 上一篇文章,我们使用C++来简单模拟了分页机制,现在我们来看汇编代码,看看其如何来构建汇编代码的,这里如果新手可能会犯糊涂,很久之前我被这份代码搞晕了好久,现在来一起解释一下。 页表构建代码分析 代码如下,在《x86/x64体系探索及编程》的ex11-2\protected.asm中,来负责初始化页表。 ;--------------------------------------------- ; init_32bit_paging(): 建立 32-b...

WriteAnything_的博客 439

bochs中文用户手册

X86架构的虚拟机BOCHS的中文用户手册,详细介绍了bochs的调试命令

Intel 8086 汇编指令手册

一、数据传输指令   它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   1. 通用数据传送指令.     MOV  传送字或字节.     MOVSX 先符号扩展,再传送.     MOVZX 先零扩展,再传送.     PUSH  把字压入堆栈.     POP  把字弹出堆栈.     PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.

Katapeltes 5011

Bochs核心代码分析(中文PPT、WORD格式,755K)

Bochs关键代码的分析,主要是CPU部分。讲得比较透彻。

Bochs安装手册.pdf

Bochs安装手册.pdf

Bochs源码分析-调试功能

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

weixin_30423977的博客 379

bochs中文用户手册(看雪)

和破解 逆向等有关。对于具体是些什么,看了就知道。看雪

Bochs源码分析1

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 总结:模拟器其实也是主机里面难得一个应用程序,在编译器编译时要有一个程序入口,编译完从此处一直执行下去。其实入口在bochs之目录下main.cpp,有WinMain和mai...

weixin_30500663的博客 522

阿里云CDN HTTPS 证书配置流程

可以使用HTTPS方式访问资源,如果浏览器中URL旁边出现锁的HTTPS标识,表示HTTPS安全加速已生效。: 证书配置完成后,需要留意证书过期时间并在证书过期前手动配置新的证书。注意 ⚠️ 一定是需要复制 以下标识之间的内容。如果已在阿里云数字证书管理服务中购买了证书,请选择。,该证书将在阿里云数字证书管理服务中保存。如果使用第三方服务商签发的证书,请选择。第四步,在指定域名的左侧导航栏,单击。第二步,在左侧导航栏,单击。开关,并配置证书相关参数。页面,找到目标域名,单击。中选择已购买的证书。

w风雨无阻w的专栏 2198

Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建

本文介绍Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建方法。

无线通信实验室 1万+

Bochs源码分析 - 10: BX_NEXT_INSTR宏指令修改的错误

前言 还记得我们在八篇文章中为了禁止CPU递归执行指令而取消的BX_NEXT_INSTR宏嚒,当时分析没有问题,但事后发现虚拟机跑不起来,其效果与日志如下: 解决方案一(失败) 我们先尝试着对比和正常的Bochs相比流程上存在哪些错误,我们用vscode的文本对比工具来进行对比,效果如下。经过仔细分析,其配置执行的流程已经被打乱,想要通过这种途径来分析代码似乎很困难。 解决方案二(成功) 我们只能从源代码中找答案,来看BX_NEXT_IN...

WriteAnything_的博客 296

初识colmap

COLMAP是一款开源的计算机视觉软件,主要用于从一系列二维图像中进行三维重建。它全称为“COLLISION-MAPping”,是一个高度集成的Structure-from-Motion (SfM) 和 Multi-View Stereo (MVS) 管道工具,由斯坦福大学开发和维护。COLMAP的主要功能包括特征检测与匹配、增量式SfM、多视图立体匹配以及优化。它能够从无序或有序的二维照片集合中恢复出三维场景的几何结构(点云)以及每张图像对应的相机姿态。

Hhsjehejj的博客 5537

Bochs源码分析 - 0 文章集合

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

WriteAnything_的博客 1801

Ubuntu20.04实时内核补丁PREEMPT_RT编译与安装全流程解析

本文详细解析了在Ubuntu20.04系统上编译与安装实时内核补丁PREEMPT_RT的全流程。从内核与补丁版本匹配、编译环境准备,到内核配置、编译排错,再到最终安装、验证与进阶优化,提供了手把手的实战指南,旨在帮助机器人、工业控制等对实时性有苛刻要求的开发者构建低延迟、高确定性的Linux系统。

weixin_29213827的博客 176

需要Perfetto分析的anr

anr类的问题,经常会有系统cpu,内存负载不高,iowait也不高,主线程状正常的,这类问题通过常规的日志无法分析,需要抓取Perfetto来分析应用的情况。event log中也没有异常。

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

Intel8086处理器使用NASM汇编语言实现操作系统12-中断向量表0号中断(cli/sti/iret/hlt)

怀念二抱三抱

文天大人 3215

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

视觉人机器视觉的博客 2026

使用Bochs学习硬件原理

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

weixin_34125592的博客 531

RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程

当我们在公司接触Autosar开发环境时,基本都是完整的Davinci Configurator的配置工程,我们只能修修补补。 从本章开始将手把手搭建Rh850基于Vector公司Davinci Configurator的autosar配置工程。主要涉及到OS,COM,DCMM,NVM,BSWM,ECUM等基本模块,包括Vlink,memap使用,XCP标定的实现等。基本是实现一个基础版的项目开发。包括后期的GreenHills编译问题处理,生成最终的Hex文件。

weixin_42412049的博客 1万+

RT-DETR 跨模态检测改进:融合红外数据提升 R50 夜间检测效果

本文提出跨模态自适应融合RT-DETR(CMF-RTDETR-R50),通过双分支骨干网络、可变形模态对齐和门控注意力融合三大模块,将红外数据融入RT-DETR-R50检测器,显著提升夜间目标检测性能。该方法在夜间场景下mAP@0.5提升11.7%,小目标检测AP_S提升15.3%,同时保持实时性(38 FPS)。关键技术包括:1)独立提取可见光与红外特征;2)可变形卷积解决模态对齐问题;3)动态门控机制自适应融合双模态特征。该方案适用于安防监控、自动驾驶等夜间检测场景,为跨模态实时检测提供实用解决方案。

走向CTO的路上... 1439

bochs使用手册

对于每一个尝试自己写计算机开机引导甚至是一个操作系统的人来说bochs是一个很好用的工具,强大的调试功能以及自带的制作虚拟盘的工具都是亮点。 和大多数人一样,初次接触这个工具难免会比较生疏,所以要把很常用的命令记录下来,以便查看。 本手册不定期更新。1、如何运行自己的扇区引导1)、自己写好的扇区引导用nasm编译成.bin为后缀的纯二进制文件。(nasm是一个很强大的编译工具,他可以直接把汇编源

sium__的专栏 3279

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汇编指令CLI / STI

汇编指令CLI/STI   CLI禁止中断发生 STL允许中断发生        这两个指令只能在内核模式下执行,不可以在用户模式下执行;而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的执行(如移动鼠标等等),系统就会变得不稳定。在标志寄存器中中断标志清零的情况下,可以以“int  ××”的形式调用软中断。

那些年 4157

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IMSL CNL 7.0.0 (x86-64)Crack

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

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_的博客 631

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

nvme-cli,更新intel pcie硬盘固件

github项目地址https://github.com/linux-nvme/nvme-cli下载:wget https://codeload.github.com/linux-nvme/nvme-cli/zip/mastermv master nvme-cli.zip解压unzip nvme-cli.zip编译安装make &amp;&amp; make install操作命令查看列表nvme...

公司扫地僧 6677
上一篇: Bochs源码分析 - 12:这才是真正的调试姿势!!
下一篇: Bochs源码分析 - 14:bochs关于实地址模式下IVT表的管理
WriteAnything_
博客等级 码龄5年 66粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值