Bochs源码分析 - 27:8259中的SMM模式介绍

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

前言

        SMM,全称为 Special Mask Mode,特殊掩码模式。在一般情况下(普通的Mask Mode),IRQ的中断请求得到响应执行,ISR相应位置位,在中断服务发起EOI命令前,ISR的位不会清位,8259会抑制优先级低的IRQ。

        然而,在开启ESMM模式中,其允许在中断服务例程里动态依据IMR及IRR来响应中断请求,而不需要例会ISR。

代码分析

        在《x86/x64体系探索及编程》的ex17-2中实现了这个,简单分析一下代码吧。

        首先,在do_timer_handler函数中先开启键盘中断,然后再开启SMM模式,然后再关闭键盘中断,之后一直loop等待着键盘中断触发。

do_timer_handler:
        call enable_keyboard
        call send_smm_command
        call disable_timer
        sti        
        mov esi, t_msg2
        call puts        
wait_for_keyboard:        
        mov ecx, 0xffff
delay:        
        nop
        loop delay
        bt DWORD [keyboard_done], 0
        jnc wait_for_keyboard  

        这时候屏幕内容如下,可以看到其正在处理IRQ0中断,并且等待键盘中断。

         此时按下键盘,进入键盘中断,键盘中断处理流程如下代码所示。该键盘中断就是简单dump了8259的IMR,IRR,ISR三个标志位。之后调用write_master_EOI函数,该函数像寄存器中写入,表示中断事件完成。

keyboard_handler:
        jmp do_keyboard_handler
k_msg   db 10, '>>> now: entry keyboard handler', 10, 0
k_msg1  db 'exit the keyboard handler <<<', 10, 0
do_keyboard_handler:
        mov esi, k_msg
        call puts
        call dump_8259_imr
        call dump_8259_irr
        call dump_8259_isr
        bts DWORD [keyboard_done], 0                ; 完成
        mov esi, k_msg1
        call puts        
        call write_master_EOI
        iret     


write_master_EOI:
	mov al, 00100000B				; OCW2 select, EOI
	out MASTER_OCW2_PORT, al
	ret

        我们看其8259A三个寄存器的相关属性位,内容如下。可以看到IRQ0与IRQ1同时在执行,这说明SMM模式起到效果了。

 

Bochs对键盘的实现

        关于8259A芯片我们先暂时不分析了,源码一共几百行配合手册很好理解。我们现在主要来简单提一句键盘的处理流程,之后获取会分析键盘的实现,到时候为我们提供一些思路。

        关于键盘的堆栈调用图如下,我们慢慢来进行分析:

>	bochs.exe!bx_keyb_c::kbd_enQ(unsigned char scancode) Line 915	C++
 	bochs.exe!bx_keyb_c::gen_scancode(unsigned int key) Line 800	C++
 	bochs.exe!bx_devices_c::gen_scancode(unsigned int key) Line 1151	C++
 	bochs.exe!bx_win32_gui_c::handle_events() Line 1555	C++
 	bochs.exe!bx_devices_c::timer() Line 575	C++
 	bochs.exe!bx_devices_c::timer_handler(void * this_ptr) Line 568	C++
 	bochs.exe!bx_pc_system_c::countdownEvent() Line 381	C++
 	bochs.exe!bx_pc_system_c::tick1() Line 110	C++
 	bochs.exe!BX_CPU_C::cpu_loop() Line 120	C++

        通过函数堆栈调用图,我们可以了解其键盘事件是由设备时钟来触发的。

void bx_devices_c::timer()
{
  SIM->periodic();
  if (!bx_pc_system.kill_bochs_request)
    bx_gui->handle_events();
}

        在handle_events( )中来处理界面的各种事件,核心函数如下,可以看到其来处理WIN_GUI发来的鼠标移动,键盘按下,弹起,滚动条移动等各种事件。

  while (head != tail) {
    QueueEvent* queue_event = deq_key_event();
    if (!queue_event)
      break;
    key = queue_event->key_event;
    if (key == MOUSE_MOTION)
    {
      DEV_mouse_motion(queue_event->mouse_x, queue_event->mouse_y,
                       queue_event->mouse_z, queue_event->mouse_button_state, win32MouseModeAbsXY);
    }
    else if (key == FOCUS_CHANGED) {
      DEV_kbd_release_keys();
    }
    // Check for mouse buttons first
    else if (key & MOUSE_PRESSED) {
      DEV_mouse_motion(0, 0, 0, LOWORD(key), 0);
    }
    else if (key & TOOLBAR_CLICKED) {
      win32_toolbar_click(LOWORD(key));
    }
    else {
      key_event = win32_to_bx_key[(key & 0x100) ? 1 : 0][key & 0xff];
      if (key & BX_KEY_RELEASED) key_event |= BX_KEY_RELEASED;
      DEV_kbd_gen_scancode(key_event);
    }
  }

        之后其会生成对应的码,指出对应的按键。之后如果分析键盘这部分,我们会回过头来详细分析,现在只是在这里稍微提一下。

 unsigned char *scancode;

总结

        8259A芯片的内容就到这里了,这部分芯片实物也没真正编写过,但是通过bochs代码深刻了解了ISR,IMR,IRR三个寄存器以及其对应的主从芯片,之后我们会来深入学习AIPC,这个是重点。

漫谈IA32的系统管理模式(SMM) 写在前面 这是我的BIOS启蒙文章第二篇了,上一篇我谈了谈什么是legacy USB,和大家聊了聊在USB键盘背后的那些不为人知的故事。大家可以去(http://blog.csdn.net/prostar/archive/2009/04/17/4088521.aspx)这里来看看这个文章。现在是第二篇了。今天我打算给大家讲讲什么是Ia32架构具备的系统管理模式(SMM),这是CPU四种 阅读详情

相关推荐

保姆级避坑指南:在Ubuntu 18.04上搞定速腾Helios雷达驱动与fast-LIO2的完整配置流程

本文提供了一份详细的速腾Helios雷达与fast-LIO2在Ubuntu 18.04上的配置避坑指南,涵盖驱动安装、数据格式转换到建图全流程。特别针对常见编译错误和数据转换问题提供了解决方案,帮助开发者高效完成环境搭建与建图任务。

weixin_27252001的博客 107

BIOS工程师手边事--SMM模式

一,SMM概念及特色      1,基本概念        SMM是Intel在386SL之后引入x86体系结构的一种CPU的执行模式。加上SMM,X86 CPU支持四种工作模式。分别是:实模式,保护模式,虚拟8086模式和SMM模式。SMM是一种特殊的工作模式,它不依赖于具体的操作系统,完全由固件来控制。     SMM模式只能通过系统管理中断SMI进入,并只能通过执行RSM指令退出。

zhao_longwei的专栏 1万+

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 350

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

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

WriteAnything_的博客 941

手把手教你用STM32F103的IO口模拟XY2-100协议驱动数字振镜(附Keil O3优化代码)

本文详细介绍了如何使用STM32F103的IO口模拟XY2-100协议驱动数字振镜,包括协议解析、偶校验算法、寄存器级优化及Keil O3编译下的性能调优。通过硬件配置、核心代码实现和优化技巧,帮助开发者实现高速二维偏转控制,适用于工业激光雕刻和精密定位系统。

weixin_42527401的博客 258

大模型微调框架之TRL

近年来,大语言模型(LLMs)的快速发展推动了下游应用的繁荣,但如何高效地对这些模型进行对齐和微调,依然是研究与应用的热点。Hugging Face 开源的 TRL(Transformer Reinforcement Learning) 框架,提供了基于强化学习的语言模型训练方法,并支持 SFT(监督微调)、PPO(近端策略优化)、DPO(直接偏好优化)等多种方式,是目前对齐和微调 LLM 的重要工具。

和大家一起涨芝士 891

SMM 详解

SMM System Management Mode(SMM)他是CPU的一个模式,当我们触发CPU的SMI pin 的时候就会进入SMM Mode. SMM 模式下的执行程序被称作SMM处理程序,所有的SMM 处理程序只能在称作系统管理内存(System Management RAM, SRAM)的空间内运行。   1. SMM Service       SMM service 是

Helping BIOSer become Awesome! 2万+

QNX侧触摸屏(TP)Bringup流程与源码深度解析

QNX侧TP Bringup的核心在于构建。

QQ_778132974的博客 473

计算机体系结构——操作系统

1. 多种工作态和硬件保护机制 1 工作态 利用 程序状态字的态(模式)来对特权指令、访存范围进行控制 一般分为用户态和核态 进入核态由中断/异常机制实现,按照中断/异常向量表进入到约定程序入口 2 以arm32处理器为例 七种运行模式 除用户模式外,其他六种模式为特权模式。低权模式进入高权模式要通过中断或异常 用户模式 系统模式 快中断模式 中断模式 管理模式 种植模式 未定义模式 线程/进程/虚拟机的现场: 大多与操作系统无关。 线程现场:寄存器的值 进.

知识,既贵,又便宜。 2250

vue2/3 - 详细实现高德地图轨迹回放,vue高德地图车辆历史行驶轨迹播放,在地图上绘制行程轨迹|起点和终端的路程绘制|用户运动轨迹绘制及播放等(支持开始/暂停、进度条拖放、控制播放轨迹的倍速等)

vue2,vue3,nuxt,高德地图,轨迹,vue高德地图轨迹回放,历史轨迹回放,轨迹回放功能支持倍速及进度条拖拽,VUE高德地图轨迹回放、倍速调整、进度条拖拽,vue3高德地图轨迹回放,Vue实现地图路径回放,vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速,多条轨迹陆续播放,巡航轨迹做带进度条和倍速的轨迹回放,Vue高德地图路径回放,历史轨迹回放并能控制播放轨迹的倍速,使用高德地图实现轨迹播放和进度条控制,vue高德地图如何实现轨迹回放,高德地图做轨迹绘制用什么api,高德轨迹API,驾车轨

✅ 精选推荐文章 1万+

rk3576 适配以太网(百兆)

百兆以太网,也常被称为快速以太网,是一种在1990年代中期推出的计算机网络技术标准。它相当于把当时主流的10兆以太网速度提升了10倍,最高能提供 100 Mbps 的传输速率,让文件共享、视频传输等网络应用变得流畅许多。它在数据链路层面完全保留了传统以太网的帧格式和MAC机制,这意味着现有的网络软件可以无缝对接,用户从10兆网络升级到百兆网络时,通常只需要更换网卡和集线器/交换机即可,非常方便。 在rk3576平台上,原生以太网接口支持百兆、千兆,还有pcie转换的2.5G。

weixin_35723192的博客 198

Bochs源码分析 - 0 文章集合

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

WriteAnything_的博客 1801

飞牛NAS1.1.19更新后SSH连不上?两步快速恢复连接

飞牛NAS1.1.19版本更新后SSH无法连接😟,实则是官方安全策略升级默认关闭了该服务,本文分享两步实操配置恢复SSH连接💻,还同步了官方的设备安全配置建议,帮助用户兼顾使用与设备防护🔒。

XiaoqiangClub的博客 2069

Bochs源码分析 - 16:conforming与non-conforming代码段区别以及Bochs代码的实现

前言 之前在学习x86架构时,在代码段中有一个点让我感到困惑,就是type field 11位。这个之前一直似懂非懂,说不理解吧知道这么个玩意,说理解吧又不知道其具体干嘛,感觉是方便系统调用加快速度,尤其当遇到权限问题,自己就糊里糊涂,这篇文章让自己彻底分析明白这个问题。 Intel手册说明 下面来引用intel手册中对这问题的描述(卷三 3.4.5.1节) Code segments can be either conforming or no...

WriteAnything_的博客 603

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SMM和如来佛手掌心

久未更新这个公众号了,很感觉愧疚。今天有些空闲,又静不下心写代码,那么就写篇文章吧,比虚度要好。今天的题目是突然从大脑里里冒出来的,先冒出来的是“SMM”,后冒出来的是“如来佛的手掌心”...

格友 1021

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SMM模式

System Management Mode系统管理模式 SMM是一个对所有Intel处理器都统一的标准体系结构特性。出现于Intel386 SL芯片。这个模式为OS实现平台指定的功能(比如电源管理或系统安全)提供了一种透明的机制。当外部的SMM interrupt pin(SMI#)被激活或者从APIC(Advanced Programming Interrupt Controller)收到一...

fgupupup的博客 1437

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SMM系列

from http://blog.csdn.net/huangkangying/article/details/8143641 SMM系列(1)-- SMM基本概念 SMM的定义:     SMM, System Management Mode, 即系统管理模式。在intel 386SL, intel486SL引入的一种特殊的操作模式,在这种模式下,可以执行高级电源管理,硬件控制和运

cassienj的博客 4464

【x86架构】SMM

SMM是什么 SMM全称System Manage Mode。 从名字也可以大致看出,它是x86平台CPU的一种模式,该模式用来做系统管理的操作,具体来说,可以参考《64-ia-32-architectures-software-developer-system-programming-manual.pdf》中的说明: 以上也只是Intel建议的在SMM下应该做的事情,而实际用来做什么,就只能看你写的具体代码了。 总览 下面简单说明SMM的基本特性: 通常只在BIOS下实现,OS基本不需要特别关注SM

humanof的专栏 3613

【我所認知的BIOS】—>SMM (SYSTEM MANAGEMENT INTERRUPT )

【我所認知的BIOS】—>SMM(System management mode 学习笔记)By LightSeed2009-9-11  1、System management mode综述这篇文章里面我主要是谈谈对IA32的了解,而且也纯粹是笔记而已,没有太多的组织语言。1.1 什么是SMMSMM是一种特殊用途的运行模式,他是用来处理影响整个系统功能的模式。影响整个系统

肢解BIOS 4万+

系统管理模式(System Management mode)(以下简称SMM)是Intel在80386SL之后引入x86体系结构的一种CPU的执行模式

(以下简称)是在之后引入体系结构的一种的执行模式。系统管理模式只能通过系统管理中断(System Management Interrupt, SMI)进入,并只能通过执行RSM指令退出。SMM模式对透明,换句话说,操作系统根本不知道系统何时进入SMM模式,也无法感知SMM模式曾经执行过。为了实现SMM,Intel在其CPU上新增了一个引脚SMI# Pin,当这个引脚上为高电平的时候,CPU会进入该模式。在SMM模式下一切被都屏蔽,包括所有的中断。

weixin_40191861的博客 1517

BIOS-SMI Introduction

了解SMI之前先了解一些基本的知识。 1.0  SYSTEM MANAGEMENT MODE OVERVIEW          SMM是一个特定的操作模式,用于处理系统级的功能。比如:Power management, system hardware control, special OEM designed code . 它被设计成只给system firmware 使用,不是给应用软件或

冰峰的专栏 1万+

SMM 系统管理模式

SMI#(System Management Interrupt系统管理中断)为一由ICH输出至CPU的讯号。当CPU侦测到SMI#为LOW时,即进入SMM模式(系统管理模式)并到SMRAM(System Management RAM)中读取SMI#处理程序,当CPU在SMM模式时NMI、INTR及SMI#中断讯号都被遮蔽掉,必需等到CPU执行RSM(RESUME)指令后SMI#、NMI及INTR

小卢的专栏 3476

UEFI SMM

SMM 介绍 SMM (System Management Mode) 是Intel IA32/Intel64 CPU 架构的一种特殊模式。CPU 通过SMI(System Management Interrupt) 进入SMM 模式。然后,CPU 保存当前环境,跳转到 预先定义的地址,执行完后通过RSM指令返回。目前主流的的操作系统和Intel CPU 都支持SMM. BIOS...

Helping BIOSer become Awesome! 5999

系统管理模式(SMM)推测执行攻击

2017年底,Google和其他安全研究人员发现了影响现代处理器架构推测执行的漏洞。本地无权限的攻击者利用无序执行CPU的微架构的能力来泄漏受保护的内存中的内容。研究人员扩展了该方法来访问高权限的系统管理模式(System Management Mode,SMM)内存。 影响 因为SMM有访问包括与操作系统隔离的物理内存的权限,本研究说明了基于Spect...

weixin_34254823的博客 1018

UEFI应用与编程--SMM(一)

章节13 系统管理 这一章主要描述IA32体系结构的两个方面,一个是被用来做管理系统资源的系统管理模式(SMM),另一个是热量监视设施。 SMM提供了一个交替的操作环境可以用来监视和管理多种系统资源,被用于有效能的使用,管理硬件,或运行专有代码。关于硬件支持SMM的更多细节描述,可以参看每种IA32处理器的开发手册。 热量监视设施开启了监视和控制IA32处理器核心温度的功能。 13.1系统管理模式...

qyqcs的博客 4976
上一篇: Bochs源码分析 - 26:8259中断控制器介绍
下一篇: Bochs源码分析 - 28:bochs开启x2apic与SMP编译说明
WriteAnything_
博客等级 码龄5年 66粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值