|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
问几个X86上的问题 |
作者:游啊游 栏目:嵌入式系统 |
问题1: 在单片机中根本不存在加载到内存什么地方的问题,因为所有代码都是使用烧录设备烧到FLASH中(总是从0000H单元开始按部就班地烧录) 如: ORG 0000H LJMP MAIN ;跳转到MAIN,LJMP占3字节 ;代码段0003H~000AH为"FFH" ORG 000BH LJMP INT_TIMER0 ORG 0010H MAIN: MOV SP,#60H MOV SCON,#0 ......... ORG表示后续代码从"ORG 常量表达式"中常量表达式所指地址开始,在ORG前面如果有空闲单元的话,通常都是填写"FFH" 但在X86体系中,ORG的作用和在单片机中应该是一样的,那么PC是如何知道要将代码加载到什么地方呢?这里不存在总是从内存第一单元开始的问题(原因有二,1.如果在4G寻址空间的最后1M有代码,不可能像单片机那样将不使用的单元都写"FFH".2.如果从内存第一单元开始写,那么向量表怎么办?) 问题2: INTEL手册上说,上电后PC=0000H;CS=FFFFH,会自动读取FFFF0H单元的指令,而这里通常是一条跳转指令,用来转向BIOS程序!那么这条跳转指令是哪里来的呢????这条指令也是BIOS的指令之一?就算是的话,按理说X86是独立寻址的,没理由在内存地址中找到BIOS程序(这里假定BIOS是I/O的一部分).BIOS程序只有BIOS的地址在内存地址寻址范围内才可能找到(这里假定BIOS地址范围在内存地址范围内).或者有其它可能,比如上电后,电脑自动将BIOS程序复制到内存中.如果是这样,那CPU是FFFF0H单元读到什么命令才执行BIOS复制的呢??而且这条指令又是怎么会出现在那里的呢??? |
2楼: | >>参与讨论 |
作者: computer00 于 2006/3/3 23:07:00 发布:
re: 1.根据我的理解,X86是有MMU的,程序运行的是虚拟地址。而通过MMU将虚拟地址转换成物理地址。 所以你可以选择任何一个可用的地方,把它当作地址0(虚拟地址是0,而物理地址则不是0),然后把程序装进去,运行之。 2.FFFF0H单元应该就是指向BIOS程序的,BIOS通常被放在EEPROM或者FLASH中,启动时从里面读取程序。 当BIOS引导完成后,可将BIOS自己复制到RAM中运行,以提高运行速度。BIOS在完成POST之后,检查 系统引导盘,看是否有可用的操作系统,如果有,则将控制权移交给操作系统。 |
3楼: | >>参与讨论 |
作者: 211iris 于 2006/3/6 9:59:00 发布:
交流经验 说的不错,我在学习中! |
4楼: | >>参与讨论 |
作者: yongzong 于 2006/3/7 10:26:00 发布:
RE: 然后由操作系统加载应用程序,应用程序加载时操作系统会重定位 所以操作系统会改变ORG的地址 |
5楼: | >>参与讨论 |
作者: 游啊游 于 2006/3/9 18:31:00 发布:
难道BIOS地址(FFFF0H)和内存地址重叠? 难道BIOS地址(FFFF0H)和内存地址重叠?如果不重叠的话是访问不到BIOS程序地... |
6楼: | >>参与讨论 |
作者: computer00 于 2006/3/9 19:20:00 发布:
BIOS地址本来就属于内存地址的一段。 只是那里装的不是RAM,而是ROM而已。 |
7楼: | >>参与讨论 |
作者: 游啊游 于 2006/3/9 22:07:00 发布:
哇~~~大汗一下 第一次听说~长见识了 |
8楼: | >>参与讨论 |
作者: lczsx2000 于 2006/3/10 13:18:00 发布:
游啊游,好样的! 能提出这几个问题,说明你还是仔细思考过了的,至少能说明你的自学能力很不错的!下面是我的解答 问题一: 程序并不一定从地址0开始执行,你最好先把绝对地址和相对地址给搞清楚了,如果一段程序里面没有到绝对地址的转移(只有相对地址),那么,你可以把这段程序加载到任何地址,然后跳转过去执行之,有绝对地址的话就绝对不行了。但现在需要解决一个问题:两个软件公司开发的软件都要在一个PC上面运行?两个程序使用的地址相重叠怎么办(你可能说他们互相有约定,那世界上那么多软件公司,怎么约定CPU的地址都是会用完的哦),这时候真正的多用户操作系统被人们设计出来了(UNIX,LINUX,和WINDOWS),注意RTOS可不是多用户的,最多是属于多任务。单我们用鼠标双击一个应用程序的图标的时候,操作系统会创建一个进程(进程里有一个虚拟的地址空间,这个空间完全属于你,在linux中是0x0~0xBFFFFFFF),然后根据可执行程序的文件存储格式的指示,把可执行的代码搬到指定的地址,直接运行就可以了,这也得益于MMU的大力帮忙。 问题二: 0xFFFF0地址挂载的是ROM BIOS程序,后面的原理你应该知道了吧,X86的程序空间和数据空间是统一编址的,看你熟悉51的汇编,应该把它给搞混淆了吧。 更具体的可参看操作系统的内核的书籍! |
9楼: | >>参与讨论 |
作者: hewei_2000 于 2006/3/19 1:46:00 发布:
0xFFFF0地址 0xFFFF0地址挂载的是ROM BIOS----在CPU的HOST BUS地址则是直接映射0xFFFFFFF0 |
10楼: | >>参与讨论 |
作者: gdtyy 于 2006/3/20 21:08:00 发布:
www.armecos.com有i386的编程手册 在X86体系中,ORG的作用是指定段内偏移地址,当程序被加载执行时,需要地址重定位,加上段地址才能形成最终的绝对物理地址,所以不会和中断向量表冲突。 X86上电后进入实模式,不存在MMU虚拟内存,逻辑地址就是物理地址。上电后CPU的控制状态机首先初始化PC=0000H;CS=FFFFH,这个动作不需要读取任何指令,是事先在CPU控制状态机硬件电路上做好的,CPU运行到这个状态会自动设置这个常数到指定寄存器。然后从这个物理地址取指,再译码执行,以后的CS和PC值才开始依据具体指令设置。FFFF0H地址处是BIOS程序的入口,BIOS是映射到内存地址空间的。BIOS就在FLASH中执行。 |
11楼: | >>参与讨论 |
作者: sdaniu 于 2006/3/21 12:54:00 发布:
来学习的 初来乍到,虽然看不太懂,但会努力的。 |
12楼: | >>参与讨论 |
作者: steelen 于 2006/3/24 16:57:00 发布:
X86 CPU上电工作在实模式 X86 CPU上电工作在实模式 其地址空间只有1M BYTE CPU 复位后从 0XFFFF0地址开始执行 这个地址一般放一个跨段跳转指令,跳到一个地址执行程序。 如果是32位操作系统引导后会变为虚模式,这样可以给每个程序提供一个4GB的空间,用户程序是0~2G,系统是2~4g 64位系统咱没有研究过 |
13楼: | >>参与讨论 |
作者: AIRWILL 于 2006/3/25 18:44:00 发布:
对 在汇编写的程序里,设定的 ORG 是指在段里的相对地址,而段地址是有操作系统来分配的,x86的程序不能自己确定段地址,最多只能查到,二自己修改段地址也要符合操作系统的分配规范. 以前做过解密或对病毒了解的人都知道,在dos 的exe文件中,前面有段称为程序重定位块的东西,就是记录一些本程序所有的段的信息,告诉操作系统如何来加载本程序,如何初始化各个段寄存器. 这个块一般最少有512个字节,所以细心的朋友会发现,编的程序,再简单,起码会有这么多字节的大小. |
14楼: | >>参与讨论 |
作者: astrokid 于 2006/3/26 21:48:00 发布:
哦,看书去哦。 |
15楼: | >>参与讨论 |
作者: high 于 2006/7/13 19:43:00 发布:
顶的起吗?我要继续 |
|
|
Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号 |