世俱杯 2025

登录 免费注册 世俱杯 2025 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

问几个X86上的问题

作者:游啊游 栏目:嵌入式系统
问几个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
re:
1.根据我的理解,X86是有MMU的,程序运行的是虚拟地址。而通过MMU将虚拟地址转换成物理地址。
  所以你可以选择任何一个可用的地方,把它当作地址0(虚拟地址是0,而物理地址则不是0),然后把程序装进去,运行之。

2.FFFF0H单元应该就是指向BIOS程序的,BIOS通常被放在EEPROM或者FLASH中,启动时从里面读取程序。
  当BIOS引导完成后,可将BIOS自己复制到RAM中运行,以提高运行速度。BIOS在完成POST之后,检查
  系统引导盘,看是否有可用的操作系统,如果有,则将控制权移交给操作系统。

3楼: >>参与讨论
211iris
交流经验
说的不错,我在学习中!

4楼: >>参与讨论
yongzong
RE:
然后由操作系统加载应用程序,应用程序加载时操作系统会重定位
所以操作系统会改变ORG的地址

5楼: >>参与讨论
游啊游
难道BIOS地址(FFFF0H)和内存地址重叠?
难道BIOS地址(FFFF0H)和内存地址重叠?如果不重叠的话是访问不到BIOS程序地...

6楼: >>参与讨论
computer00
BIOS地址本来就属于内存地址的一段。
只是那里装的不是RAM,而是ROM而已。

7楼: >>参与讨论
游啊游
哇~~~大汗一下
第一次听说~长见识了

8楼: >>参与讨论
lczsx2000
游啊游,好样的!
能提出这几个问题,说明你还是仔细思考过了的,至少能说明你的自学能力很不错的!下面是我的解答
问题一:
程序并不一定从地址0开始执行,你最好先把绝对地址和相对地址给搞清楚了,如果一段程序里面没有到绝对地址的转移(只有相对地址),那么,你可以把这段程序加载到任何地址,然后跳转过去执行之,有绝对地址的话就绝对不行了。但现在需要解决一个问题:两个软件公司开发的软件都要在一个PC上面运行?两个程序使用的地址相重叠怎么办(你可能说他们互相有约定,那世界上那么多软件公司,怎么约定CPU的地址都是会用完的哦),这时候真正的多用户操作系统被人们设计出来了(UNIX,LINUX,和WINDOWS),注意RTOS可不是多用户的,最多是属于多任务。单我们用鼠标双击一个应用程序的图标的时候,操作系统会创建一个进程(进程里有一个虚拟的地址空间,这个空间完全属于你,在linux中是0x0~0xBFFFFFFF),然后根据可执行程序的文件存储格式的指示,把可执行的代码搬到指定的地址,直接运行就可以了,这也得益于MMU的大力帮忙。

问题二:
0xFFFF0地址挂载的是ROM BIOS程序,后面的原理你应该知道了吧,X86的程序空间和数据空间是统一编址的,看你熟悉51的汇编,应该把它给搞混淆了吧。

更具体的可参看操作系统的内核的书籍!

9楼: >>参与讨论
hewei_2000
0xFFFF0地址
0xFFFF0地址挂载的是ROM BIOS----在CPU的HOST BUS地址则是直接映射0xFFFFFFF0

10楼: >>参与讨论
gdtyy
www.armecos.com有i386的编程手册
    在X86体系中,ORG的作用是指定段内偏移地址,当程序被加载执行时,需要地址重定位,加上段地址才能形成最终的绝对物理地址,所以不会和中断向量表冲突。
    X86上电后进入实模式,不存在MMU虚拟内存,逻辑地址就是物理地址。上电后CPU的控制状态机首先初始化PC=0000H;CS=FFFFH,这个动作不需要读取任何指令,是事先在CPU控制状态机硬件电路上做好的,CPU运行到这个状态会自动设置这个常数到指定寄存器。然后从这个物理地址取指,再译码执行,以后的CS和PC值才开始依据具体指令设置。FFFF0H地址处是BIOS程序的入口,BIOS是映射到内存地址空间的。BIOS就在FLASH中执行。

11楼: >>参与讨论
sdaniu
来学习的
初来乍到,虽然看不太懂,但会努力的。

12楼: >>参与讨论
steelen
X86 CPU上电工作在实模式
X86 CPU上电工作在实模式
其地址空间只有1M BYTE CPU 复位后从 0XFFFF0地址开始执行
这个地址一般放一个跨段跳转指令,跳到一个地址执行程序。
如果是32位操作系统引导后会变为虚模式,这样可以给每个程序提供一个4GB的空间,用户程序是0~2G,系统是2~4g
64位系统咱没有研究过


13楼: >>参与讨论
AIRWILL

    在汇编写的程序里,设定的 ORG 是指在段里的相对地址,而段地址是有操作系统来分配的,x86的程序不能自己确定段地址,最多只能查到,二自己修改段地址也要符合操作系统的分配规范.
    以前做过解密或对病毒了解的人都知道,在dos 的exe文件中,前面有段称为程序重定位块的东西,就是记录一些本程序所有的段的信息,告诉操作系统如何来加载本程序,如何初始化各个段寄存器.
    这个块一般最少有512个字节,所以细心的朋友会发现,编的程序,再简单,起码会有这么多字节的大小.

14楼: >>参与讨论
astrokid
哦,看书去哦。
 
15楼: >>参与讨论
high
顶的起吗?我要继续
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
我也发个usb学习总结
USB开发群
USB协议基本知识(上)
GR47模块调试问题请教
各位μC/OS-2在什么地方能下载


Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号