开机第一条指令是如何取到和执行的?

Cline 2011-08-07 11:43:58
加精
今天看<linux内核解释.pdf>, 看到
"当 PC 的电源打开后,80x86 结构的 CPU 将自动进入实模式,并从地址 0xFFFF0 开始自动执行程序代码,这个地址通常是 ROM-BIOS 中的 地址。"

就不懂了!

1.刚上电内存是空的,如何执行?
2.如何有内容,是谁是什么时候Copy到内存上的?


在网上找到一些资料:
1.映射/编址说: 0xF0000~0xFFFFF被映射到Bios ROM
2.南北桥说:取指时由CPU->北桥->南桥->Bios ROM
3.Bios自解压加载到RAM
...全文
7704 171 打赏 收藏 举报
写回复
171 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Cline 2011-08-15
谢谢feidaosh的补充.


  • 打赏
  • 举报
回复
lijie_ai 2011-08-15
二楼说得差不多吧
  • 打赏
  • 举报
回复
ilyhwh 2011-08-14
来学习一下哈
  • 打赏
  • 举报
回复
zhangxinre 2011-08-14
好复杂 呵呵 我是来拿分的
  • 打赏
  • 举报
回复
loveifa 2011-08-13
第一个指令明显是手按开关嘛
  • 打赏
  • 举报
回复
JackRui2008 2011-08-13
天啊,一点也看不明白。。%>_<%
  • 打赏
  • 举报
回复
清钟沁桐 2011-08-12
操作系统还是需要引导的!
  • 打赏
  • 举报
回复
shine487 2011-08-12
学习了
  • 打赏
  • 举报
回复
lyglary 2011-08-12
这个要mark下
  • 打赏
  • 举报
回复
feidaosh 2011-08-12
那天下班要回家,回得急了点,没想到楼主给了110分。。。于心不忍,多说一些吧。
[Quote=引用 100 楼 feidaosh 的回复:]
做过一点点板子,从硬件跳线到FPGA到E2ROM,所谓的CPU第一条指令有些说的不明确。
如果仅针对你说的那段LINUX的话来回答你的问题:
1.刚上电内存是空的,如何执行?
0xFFFF0这个地址是硬件编程确定的,在桥片中烧好的,你当然可以把这个地址段初始化到内存中,那么刚上
电时内存是空的,就什么也执行不了,你做的这个板子也就没人买了。所以在桥片中必须把这个地址段映射到一个XXROM中去。

2.如何有内容,是谁是什么时候Copy到内存上的?
0xFFFF0这个地方通常都是一个跳转指令,跳转到的地方通常也是在ROM里(因为这时其它地方什么也没有),跳转过去的地方是一段初始化程序,这段程序在初始化最基本的(最最基本的)硬件后,就把ROM里的一段程序拷贝(可能有解压过程)到RAM里,然后跳到RAM里去执行刚拷过去的程序(因为ROM比RAM慢得多小得多)。BIOS的代码是在ROM里的,但BIOS的执行是在RAM里的,其实就是它自己把自己从ROM里拷到了RAM里。

[/Quote]
CPU刚上电(复位和上电有轻微区别)时,是有一些动作的,但这些动作并不能准确的说是“指令”,因为这些动作很多是由CPU管脚设置,外部信号引起的。
这些动作决定了CPU的最初工作方式,比如所谓的0xFFFF0这个地址(其实是FFFF:0),就是由管脚信号确定,也能把这个地址设到别处,最多的是0xFFFF0或0x00000(头和尾好啊,放中间不是给自己用内存时找麻烦么,一不小心冲了怎么办)。
有些CPU甚至能不选这两个地址之一,而是自己用管脚编程去设成各种各样的(没事找事类型)。之所以在大多数地方都看到是0xFFFF0(几个F得看是几位的CPU,由CPU的寻址范围决定),只是因为大家习惯而已,设成其它的地址会让别人看你的板子觉得费脑费心。
那么FFFF0这个地址是哪里呢?如果没有桥片,那么这个地址就直接由硬件连线和内存控制器决定,所以要在板子上把ROM安装到0XFFFF0这个线段上(大概这个意思吧,就是纯连线决定);
如果有桥片,那么这个地址其实是由桥片解释的(不用担心CPU寻址的速度问题,都是“并发”执行的,不会耽误时间)。桥片里本身是有管脚定义和初始化程序的,一上电自己就会执行,FPGA里会有些东西(实现了内存寻址分配,不叫内存地址映射是因为CPU后面也有一个内存地址映射过程)。这时可以用编程的方式把0xFFFF0设到ROM去。
上面也有人提到过,内存地址不光是RAM,ROM,还可以是很多东东,比如IO口等。
至于0XFFFF0为啥是个跳转指令,因为从0XFFFF0到0XFFFFF只有16个寻址空间(或8个更少,看几位寻址),放啥都放不下,直接跳了算了。
当然,你还能把CPU指令执行的寻址顺序设成反的,就是0XFFFF0的下一条指令是0XFFFEE:),但估计用你板子的工程师会一边用一边想你的脑袋是不是抽筋了。。。
等到CPU初始化完,内存初始化完,中断初始化完,ROM里的东西拷到RAM里以后,你现在想执行什么都可以了,:)

希望能让楼主看得更清楚一些,千万不要越看越糊涂。。。。嘿嘿。

[Quote=引用 146 楼 delacroix_xu 的回复:]
you need to learn the embeded system.
you need to create a SOPC project with QuartusII
And you will know the secret of the computer system.
you will know the Reset Vector . where it point to... e……
[/Quote]
146楼说得挺对的,:)
  • 打赏
  • 举报
回复
ccyy2002 2011-08-12
如果做过嵌入式,就非常容易明白了
  • 打赏
  • 举报
回复
yoga33 2011-08-11
应该是从BIOS开始的吧?
  • 打赏
  • 举报
回复
狂想者 2011-08-11
就是执行BIOS里的引导程序,BIOS ROM是在断电时也存在的。
  • 打赏
  • 举报
回复
ITCore168 2011-08-11
CPU复位后处于实模式下,其外部地址空间的0xFFFF0处于启动代码位置,该地址处通常为一跳转指令,将跳到BIOS的初始化代码空间下执行。
CPU处于实模式下,其地址空间仅有1MB,早期的DOS就工作在这样的条件下。PC机设计方案中,这1MB空间的前640kB是可用的RAM区,后384kB为保留区, BIOS的地址空间就位于这一段空间中。BIOS是存放在ROM中的,掉电不会丢失。
当BIOS启动代码得到执行后,它想做什么就可以做什么。
  • 打赏
  • 举报
回复
zztoll 2011-08-11
学习了,做纯软的在向底层靠近.
  • 打赏
  • 举报
回复
纠结中成长 2011-08-10
不懂啊 学习中
  • 打赏
  • 举报
回复
appadd2008 2011-08-10
MARK
  • 打赏
  • 举报
回复
ZYH217_808 2011-08-10
开机后,cpu PC指针指到固定位置,而在此位置上存放的是已经固化好的ROM程序
  • 打赏
  • 举报
回复
delacrxoix_xu 2011-08-10
you need to learn the embeded system.
you need to create a SOPC project with QuartusII
And you will know the secret of the computer system.
you will know the Reset Vector . where it point to... either Flash Rom(where bootloader is) or Memory(where program is).

the PC is too complicated. the embeded system is easier for you.
  • 打赏
  • 举报
回复
fyswords 2011-08-10
忘了很多年了……回忆回忆
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
硬件/系统
加入

2613

社区成员

VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
申请成为版主
帖子事件
创建了帖子
2011-08-07 11:43
社区公告
暂无公告