请教,cpu加电执行的第一句代码,究竟是从bios中执行,还是从内存中执行?

myprotein 2006-12-15 10:23:36
网上很多资料都说cpu加电,从ffff0h地址处找寻第一句代码,可是我找了一周,愣没找到,这个地址,是内存地址,还是总线上其它节点的地址?比如bios芯片地址?

cpu只和前端总线连接,也就是直接连接到北桥,那么cpu加电后,第一个做的就是将这个地址放到地址总线上,等待代码的来临,这个地址会被北桥感觉到,是不是北桥会预先就知道,这个地址是系统bios芯片的地址,所以不会放到内存总线,而是重定向到了bios芯片上,然后bios的代码送到cpu来执行,是么? 可是很多人也说,cpu是从内存拿指令来执行的,开机之后,bios的代码,会立即copy到内存中,可是又矛盾了,如果系统不插内存,那么bios一样初始化,因为bios可以检测内存,而检测内存这个动作,也应该是靠cpu执行一系列的代码才实现的吧?

到底加电之后,cpu做了些什么,怎么做的,麻烦各位有时间回复一下,在线等!!谢谢!
...全文
4502 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leomaxking 2007-03-28
  • 打赏
  • 举报
回复
sorry, catch-〉cache
Leomaxking 2007-03-28
  • 打赏
  • 举报
回复
而且,毫无疑问的,cpu上电第一次reset就是在实模式下面,然后通过执行bios中的代码将段基址0000的段限长改为4GB,这样cpu就进入了所谓的big real mode也就是flat mode,然后通过这个0000段才能访问4GB的内存空间。接着是对南桥的初始化,包括pcie控制器等,下面才是北桥,才是内存控制器。等内存扫完没有问题以后,就是把bios复制到内存中去,bios的代码才真正从内存中运行。在这之前为了加快速度还会有把cpu的catch设置成内存,把bios部分程序复制到catch中运行的。这里就各有各的做法了。
Leomaxking 2007-03-28
  • 打赏
  • 举报
回复 1
首先,机器上电以后最先开始工作的芯片是南桥。因为电源上的DC ON信号是直接进南桥的,然后南桥收到DC ON信号,便一路发RESET信号给北桥到CPU,还有RESET信号到LPC、PCI总线,然后通过LPC总线或者是PCI总线去抓BIOS,地址总线的FFFFFFF0这个位置指向BIOS的第一条指令,同时CPU也RESET完毕,cs:eip硬件缺省复位成FFFFFFF0这个位置,那cpu获得的指令数据自然就会是bios中的第一条指令(jmp xxx)
xuelong_zl 2007-03-25
  • 打赏
  • 举报
回复
进来学习一下
littlegang 2007-03-23
  • 打赏
  • 举报
回复
现在比较肯定的一点是:(我应该没有说错吧,高手请指正)
CPU开始执行外部指令时的CS被赋值,其16位可见部分=F000H,32位内部部分=FFFF0000H
EIP=0000FFF0H

而比较迷糊的一点是,FFFFFFF0的地址映射到ROM的引导部分是哪个器件、怎么来完成呢?
我猜想是不是CPU自举过程中,会有一个针脚(或多个)来指明这个”自举“状态,以此信号内存控制器或者北桥或者其它什么负责内存映射的部件才能知道需要映射到ROM呢?

抑或不是这样而是其它方式?
skypu 2007-03-09
  • 打赏
  • 举报
回复
mark
tiancai1 2007-03-09
  • 打赏
  • 举报
回复
好贴!!鉴定完毕!!
linguangcan 2007-03-08
  • 打赏
  • 举报
回复
mark
xjg121 2007-03-03
  • 打赏
  • 举报
回复
硬件上应该是bois开始
5w 2007-03-01
  • 打赏
  • 举报
回复
jh
tiger0607 2007-02-26
  • 打赏
  • 举报
回复
应该是虚拟内存的映射机制了

=========================================

一上电还没涉及到虚拟内存映射机制的概念。

========================================
这个是操作系统初始化后才完成的.上电时不可能完成这种映射.在WINDOWS上跑的DOS程序也可调用BIOS中断,但这些BIOS中断服务的地址都是WINDOWS重新映射了的,不是真实的BIOS地址.所以,WINDOWS初始化后便替换了原来的BIOS服务
quan0930 2007-02-26
  • 打赏
  • 举报
回复
应该是虚拟内存的映射机制了

=========================================

一上电还没涉及到虚拟内存映射机制的概念。
W32API 2007-02-25
  • 打赏
  • 举报
回复
x86 架构,Intel 规定 CPU 在完成自举之后,从一个存储器地址启动,这个固定地址由 CS:EIP 的默认值决定。
至于这个存储器地址具体被定义到哪里,就要看芯片组自举后的默认值了。

不管怎样,CPU 自举后首先从一个固定的存储器地址启动,至于这个地址是 ROM 或者 RAM 与 CPU 无关。
tiger0607 2007-02-24
  • 打赏
  • 举报
回复
某地址被映射到BIOS ROM里 这个映射谁做的?怎么做到的?

=========================================
应该是虚拟内存的映射机制了
hswxf 2007-02-24
  • 打赏
  • 举报
回复
好久没上了,前几天上了一下也是应答一个问题,没来这里了!
好了,再争论已经没有什么意思了。其实从什么层次开始讨论就没有设定好,如果大家真的认为这里的结论有参考价值就好,但正确性的前题是有条件的:看看相关的计算机体系结构(不仅仅是386以上,本质上的IBM没有抛弃基本的8086体系的基本结构)
再是一个:地址是如何形成的?如果这个问题清楚上,上述的解释就是正确的了
好了,祝各位年过的好,工作找的更好!
俺的工作比较受伤!
呵呵
quan0930 2007-02-16
  • 打赏
  • 举报
回复
BIOS ROM我从软件理解是通过设定Chipset去决定的,可以去查下ICH7 datasheet,LPC Interface Bridge Registers(D31:F0)的FWH_SEL,FWH_DEC_EN等寄存器,Intel用的是FWH ROM;VIA、Nvidia等用LPC ROM的Chipset也类似,比如VIA VT8237中的BIOS ROM Decode control、LPC Firmware Memory Control等寄存器。
硬件方面(只是猜测),Chipset通过判断A31~A?(20?)决定给BIOS ROM的CE#、OE#、WE# Pin发一个信号,表示选中这个ROM(可能会有两个BIOS ROM,如技嘉有些板子好像出过Dual-BIOS),然后通过AMS(MS=15 512K,MS=16 1M,......)~A0寻址BIOS ROM。
不知那位能指点一下,我也想确定一下。

至于PCI Expansion ROM就是由各PCI Configuration Space中的Expansion ROM Base Address决定的了。
  • 打赏
  • 举报
回复
某地址被映射到BIOS ROM里 这个映射谁做的?怎么做到的?
quan0930 2007-02-15
  • 打赏
  • 举报
回复 1
呵呵
后悔以前没上过论坛,原来那么好玩,也来说几句

CPU一上电代码执行的地址是0FFFFFFF0h,指向的是BIOS Flash。这可在《IA-32 Intel Architecture Software Developer's Manual》的Volume 3A Part1中“FFFFFFF0”中搜索到,前面DelphiGuy()已经贴出来了。然后先对SuperIO、Chipset做一些必要的初始化,之后对低端内存进行检测,如果有错就会Beep,不出错的话就会把BIOS Rom中的内容复制到内存中去,注意只是一部分内容而不是全部。之后就是跳转到内存中去执行了。

记不住是从什么时候开始了(其实是人懒,没去查),X86 CPU一开始的上电地址是通过下面的方式形成的:In realaddress mode, the base address is normally formed by shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that is, FFFF0000 + FFF0H = FFFFFFF0H).
DelphiGuy()好像还有一段没贴出来,就是CS在第一次被重新赋值后,实地址下指令执行地址的形成方式就变为CS左偏4bit加IP了。我理解为是在将BIOS Rom中的内容复制到内存中去时第一次被重新赋值的,因为这时需要改变CS的值进big flat mode。

前面还有人说:
还有一个疑惑,ram中留给system bios的地址空间是64K,可是现在主板bios动辄2M,甚至4M,那么整个real mode内存才1M,请问他怎么来寻址?如果bios让cpu跳转到bios芯片超过64K的地址处,但是此时那384K的UMA中已经没有地址对这个超过64K的地址做映射,那就更别提以后的rom shadow了。想不通!

首先,“主板bios动辄2M,甚至4M”这是指bit,也就是4M bit是512K byte,而且BIOS Flash中还有很多空间是留给Logo、CPU microcode以及ESCD之类的,所以1M足够了。

写得好乱,希望以后多来论坛逛逛能把表达能力提高点,呵呵
beijingbeerman 2007-02-15
  • 打赏
  • 举报
回复
mark
loki2k 2007-02-11
  • 打赏
  • 举报
回复
一点不懂,只有帮你顶了
加载更多回复(64)

21,460

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧