cpu复位后怎么运行?

来源:互联网 发布:手机浏览器看源码 编辑:程序博客网 时间:2024/06/09 18:13
网上很多资料都说cpu加电,从ffff0h地址处找寻第一句代码,可是我找了一周,愣没找到,这个地址,是内存地址,还是总线上其它节点的地址?比如bios芯片地址?
cpu只和前端总线连接,也就是直接连接到北桥,那么cpu加电后,第一个做的就是将这个地址放到地址总线上,等待代码的来临,这个地址会被北桥感觉到,是不是北桥会预先就知道,这个地址是系统bios芯片的地址,所以不会放到内存总线,而是重定向到了bios芯片上,然后bios的代码送到cpu来执行,是么? 可是很多人也说,cpu是从内存拿指令来执行的,开机之后,bios的代码,会立即copy到内存中,可是又矛盾了,如果系统不插内存,那么bios一样初始化,因为bios可以检测内存,而检测内存这个动作,也应该是靠cpu执行一系列的代码才实现的吧?
到底加电之后,cpu做了些什么,怎么做的,麻烦各位有时间回复一下,在线等!!谢谢!
 
 
当你访问一个地址的时候,该地址决定着CPU地址引脚的电平状态
然后译码器电路工作,激活对应的芯片,让该芯片占据总线进行处理
也就是说
如果这个地址位于基本内存区,译码器电路会激活内存条
如果这个地址位于BIOS,译码器会激活BIOS芯片

物理内存空间只是一种地址定位的概念而已
它一部分用于映射内存条
一部分用于映射主板BIOS及各种外设的BIOS
还可映射显存等等
这种映射现在可以编程控制了,比如CMOS中的影子内存
PCI设备全部是动态分配的
 
 
还有一个疑惑,ram中留给system bios的地址空间是64K,可是现在主板bios动辄2M,甚至4M,那么整个real mode内存才1M,请问他怎么来寻址?如果bios让cpu跳转到bios芯片超过64K的地址处,但是此时那384K的UMA中已经没有地址对这个超过64K的地址做映射,那就更别提以后的rom shadow了。想不通!
难道现代计算机已经没有所谓UMA了吧?
 
 
从386开始,提供了32位保护模式,有4G的物理内存空间
所以一些基本设备,如BIOS启动代码,既映射到FFFF0(为了实模式寻址),又映射到FFFFFFF0(为了32位寻址)
而且由于现在提倡Pnp,许多设备的基址映射能够可编程控制的

建议你自己看一下:
开始->程序->附件->系统工具->系统信息
硬件资源: 内存、IO、DMA、IRQ(Win2k以上支持APIC,能够管理24个硬件中断)

比如我的(内存):
0xFFFF0000-0xFFFFFFFFSystem boardOK
0x0000-0x9FFFFSystem boardOK
0xFEC00000-0xFEC00FFFSystem boardOK
0xFEE00000-0xFEE00FFFSystem boardOK
0xFFF80000-0xFFFEFFFFSystem boardOK
0xE8000000-0xE80FFFFFVIA CPU to AGP2.0/AGP3.0 ControllerOK
0xD8000000-0xE7FFFFFFVIA CPU to AGP2.0/AGP3.0 ControllerOK
0xD8000000-0xE7FFFFFFRADEON 9550OK
0xD0000000-0xD7FFFFFFVIA CPU to AGP2.0/AGP3.0 ControllerOK
0xE8020000-0xE802FFFFRADEON 9550OK
0xE0000000-0xE7FFFFFFRADEON 9550 SecondaryOK
0xE80F0000-0xE80FFFFFRADEON 9550 SecondaryOK
0xE8100000-0xE810FFFFSoftV90 Data Fax ModemOK
0xE8110000-0xE81100FFVIA USB Enhanced Host ControllerOK
0xE8111000-0xE81110FFVIA PCI 10/100Mb Fast Ethernet AdapterOK
0xA0000-0xBFFFFPCI busOK
 
 
 
 
 
 
1 加电后应该是这样的“8254(北桥)产生RESET信号(数字级)给CPU的RESET脚,这时CPU复位......“
2 请问这时如果芯片组不做准备,那么CPU是如何做的,按你意思:(绝对不是INTEL,应该是IBM或IEEE标准吧)只需要CPU自检(你说的测试,那可能更错),是不是这个自检是务个芯片自己的初始化呢?如8259、8237等,再如果8237的0通道不刷新(自动硬件完成),那么你的那个 FFFFFFF0H指向那里?呵呵!我不是说你说法没有复制正确,而是楼主的意思,我理解如此--加电后,而后才是CPU做了些什么(不是复位)
=============================================================
1. 自检就是自测试,self test的意思你还懂吧。
2. FFFFFFF0H指向那里?指向ROM。所以可以在其他硬件没有初始化之前执行BIOS的引导模块。
3. 加电后,处理器就进入了“复位”或者“复位+自测试”的状态(取决于RESET引脚上1电平维持的时间),必须完成之后才能执行第一条指令。楼主说的明显是执行第一条指令时的状态,我看不出来你的理解是什么。
你可以了解一下加电执行顺序,在处理器开始执行第一条指令的时候,8259、8237这些设备就是没有初始化。
给你一个链接:http://www.bioscentral.com/postcodes/awardbios.htm
 
3 我看了你说的那些文档,并没有你说的那些?呵呵!只是说FFFFFFF0H地址是由硬件形成的!只是地系统管理模式进入后,才有你说的那些!知道系统模式吗?
=============================================================
1. 你所谓的“硬件”是什么?Bus Interface Unit?那不是废话吗?这就是处理器的一部分,否则怎么取指/执行啊。但是地址不是无缘无故产生的,如果CS:EIP不指向FFFFFFF0,能生成FFFFFFF0就怪了。
2. 处理器复位之后的寄存器初始值,来自于Intel的正式文档,我说过多次了,难道我还能拿这么容易验证的东西忽悠你?看来不让你白纸黑字看到是不行的。:)
486那个我实在找不到了,原来我有三本白皮黑字的i486手册(Intel原版的),但是早扔到地下室不知道什么地方了。不过找到一本
《80486/80386系统设计及应用》,电子科大出版社的,在第40页。
或者你在网上查找《Pentium Pro Family Developer’s Manual Volume 3: Operating System Writer’s Guide》(Intel文档242692)。
在第八章:
8.1. INITIALIZATION OVERVIEW
Following power-up or an assertion of the RESET# pin, the processor performs a hardware
initialization of the processor (known as a hardware reset) and an optional built-in self test(BIST). A hardware reset sets the processor’s registers to a known state and places the processor in real-address mode. It also invalidates the internal caches, translation lookaside buffers (TLBs)and the branch target buffer (BTB). The processor will then execute the multiple processorinitialization protocol across the APIC bus (see “Multiple Processor (MP) InitializationProtocol” on page 7-40 for more details). From this point, the processor that becomes the bootstrapprocessor (BSP) immediately starts executing software-initialization code the current code segment beginning at the offset in the EIP register.
寄存器初始值在其后的Table 8-1中。
8.1.4. First Instruction Executed
The first instruction that is fetched and executed following a hardware reset is located at physical address FFFFFFF0H. This address is 16 bytes below the uppermost physical address of the Pentium Pro processor. The EPROM containing the software-initialization code must be located at this address.
The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in
real-address mode. The processor is initialized to this starting address as follows. The CS register has two parts: the visible segment selector part and the hidden base address part. 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).
看到了吗?:)
 
下面是参考:INTEL微处理器全系列:结构编程与接口,第五版本,P840
该信号使PII初始化,使其开始执行位于存储单元FFFFFFFOH或000FFFFF0H的程序。在复位时(**注竭尽这里),A35-A32置为0。PII被复位为实模式,最左边12位线保持逻辑1(FFFH),直到执行到远跳转或远调用......
=============================================================
这不和我说的一样吗?
你应该搞清楚“在复位时(**注竭尽这里),A35-A32置为0。”和后面的不是一句话。
“PII被复位为实模式,最左边12位线保持逻辑1(FFFH),直到执行到远跳转或远调用”这明显是在复位之后。“PII复位为实模式”表达的是复位完成之后(如果看英文就非常明白了),不是“在复位时”,在复位没完成之前是谈不上什么“实模式”、“保护模式”的。
 
呵呵!又少说了,不是寄存器哟!是硬件完成的,也不是“百万时钟周期”,才完成,而是与CPU几乎同步完成!(就差8或12个周期)
如果到了能执行“百万时钟周期”那么,CPU就是CPU了,因为环境已经正常了!
=============================================================
1. 你要搞清楚这“硬件”,CS:EIP和描述符寄存器没有相应的内容,总线接口部件就不会产生那个地址。
2. “百万时钟周期以上”是处理器自测试需要的时间(不同型号的处理器需要的时间不一样,386/486至少要100万以上,而P6+处理器在500万以上),不是执行外部指令的时间。建议你再多找几本书,理解一下“处理器复位”和“处理器复位+自测试”的概念。
3. 至于到底是FFFFFFF0还是xxxxFFFF0,已经不需要再讨论了吧。
 
楼主的问题“网上很多资料都说cpu加电,从ffff0h地址处找寻第一句代码,可是我找了一周,愣没找到,这个地址,是内存地址,还是总线上其它节点的地址?比如bios芯片地址?”,
可以这么说,地址当然是内存地址(不在内存地址范围之内,怎么能访问?),但是这个地址被内存控制器映射到BIOS的Flash ROM,而不是RAM。