cpu第一条指令

2024-03-02 10:08
文章标签 指令 cpu 第一条

本文主要是介绍cpu第一条指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/lightseed/article/details/4735101


1、准备知识

如果您还对Flat mode的原理还不太了解的话,那么我想你可以再回头参考一下关于Flat mode的原理。见

http://blog.csdn.net/lightseed/archive/2009/07/01/4312834.aspx

在保护模式下,我们的段寄存器其实都是由两部分组成的:一步分是可见的段选择子(segment selector),另外一部分是隐藏的基地址(base address)。那么第一条指令就和这个密切相关。

2、CPU到哪里去取第一条指令

开门见山,当HW reset后,CPU会到(物理地址为)0FFFF FFF0H处去取指令并执行之。这个地址很明显是CPU的最高物理地址往下数16个bytes的地址处。BIOS的第一条指令必须要被放到这里,否则的话。。。后果可想而知。

3、为什么是这里

我想只要是刚入门的freshman都会感到比较疑惑,这个地址(FFFF FFF0H)明明是大于1-Mbyte的地址了,而此时的CPU却是在实模式下的,那么CPU是怎么到这里去取指令的呢?

3.1 原理

不过看完上面这段话的描述,我们是不是感觉有点亲切呢?再回忆一下,其实在我们之前的讨论中关于Flat mode的时候,就接触到个概念了。在Flat mode中的时候,虽然我们是处于实模式,但是由于我们的段寄存器(segment register)是由两个部分组成的,一部分是可见的段选择子,另外一部分是隐藏部分(段基地址)。如果我们在protect mode中修改好了段寄存器的段基地址部分,然后返回实模式,那么只要不显示地修改段寄存器,CPU在寻址的时候仍然会照protect mode下的寻址方式来计算地址,即:segment selector:offset。

3.2 BIST后CPU的状态

经过正确的power sequence后,CPU吃到CPURST#正常BIST(Built-In Self-Test)后,CPU其实就正是处于Flat mode中。(比较特殊的实模式)那么让我们来看看正常的BIST后,CPU的(部分)寄存器的状态吧。见图1。

 

图1 BIST后部分寄存器的值

 

图2 CPU关于CR0的bit定义

看清楚了图2中定义的CR0的bit0了么?PE,是指protect mode enable。那么我们再结合图1两个方框处关于CR0和CS的初始值,可以很清楚地看到这个时候CPU是处于实模式的,然而CS的Base却是等于FFFF0000H的,而且段界限是FFFFH,并且CS的选择子是等于F000H的。

3.3 详细计算

那这样以来,如果我们用CS:IP是用F000H:FFF0H的方式来操作的时候,CPU其实是会把地址这样算的。F000H是CS的段选择子,从这里取出CS的基地址(就是FFFF0000H)再加上IP的值(FFF0H)就等于实际要访问的内存地址(正好是FFFF FFF0H)[FFFF0000+FFF0H=FFFFFFF0H]。所以在32bit的CPU上,这个第一条指令的计算是这样来的。

不过一般情况下HW reset后,BIOS都会在第一条指令这里安排一个far jump来显示地修改CS的值,目的就是能够让CS真正进入real mode。就是让CS能够遵从正常的real mode的寻址翻译规则。(CS base address = CS segment selector * 16)。那至于后面的BIOS code的run的环境,我想大家就都应该了解了。

关于第一条指令的讲述Bini前辈也曾详细说明过,这里是连接供大家参考。

http://www.ufoit.com/bbs/thread-106-1-1.html




这篇关于cpu第一条指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765756

相关文章

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二