大家一起来揭开bios和地址空间这个谜

w908065729 2011-09-04 11:39:05
关于bios和内存地址空间的问题困扰了我好长时间,在网上搜了半天人们的说法都是含含糊糊,有的说的很准却细节没有。所以我想请大家一起帮忙来揭开这个谜,也让以后的人有个参考,我主要是不怎么明白下面几个问题
1、一种机型是由这种机型的CPU和主板类型决定,还是有CPU决定了大方向然后主板去实现它的标准,也就是一种机型是怎么定下来的,是谁定下来的,不同的机型有何不同能否兼容
2、一种机型定下来之后他的地址空间就确定了,什么占那部分位置已经确定,早期的8086bios占了1M以下的空间,而后来的机子把1M以下与4G以下的位置都给了bios
3、bios启动时从4G以下的高位置启动,然后跳转到1M哪里的低位置,因为全都映射给了bios所以他是可以运行的。当bios启动完之后,如果你开启了shadow的话bios将自己的位置还给了RAM,然后再将自己考到这里。
4、如果3是正确的话那么RAM的地址空间是不是还有一个空洞。也就是说640K-1M的空间里除了各种bios外还有显卡视频卡RAM的空间,这部分位置是不是也会还给主内存,如果不还给主内存的话那就永远有这个空洞了(当然我是说在bios启动完,而操作系统没动得时候,如果操作系统动了那是他自己的事了)。
5、最后我想问现在显卡内存都那么大了,1M以下那点内存肯定放不下,是不是显卡在不同模式下的内存分配不一样呢。刚开机在VGA时bios已经为其分配了内存空间,按里说是应该在4G靠下的位置,可是1M以下的地方那段显卡内存空间怎么也给了他,难道这又如bios刚开机一样虽然地址不一样但是访问的显卡的位置是一样的
请高手们指点一下
...全文
1210 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
saishow 2011-09-11
  • 打赏
  • 举报
回复
最近也在弄BIOS 收下了,
w908065729 2011-09-06
  • 打赏
  • 举报
回复
delphiguy你说的太好了,你的这些个英文是从哪里搞的能不能也给我一份啊
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 w908065729 的回复:]

DelPhiguy你说的倒是不错只是,刚开始不是有个跳转吗,这时候保护模式的位还未开启,那肯定就会刷新了隐藏寄存器的默认的值了,然后就是实模式,不知我说的有没有道理
[/Quote]

处理器而言,far跳转或者far调用确实导致了重装cs对应的描述符,所以Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1里明确写着:
9.1.4 First Instruction Executed
To insure that the base address in the CS register remains unchanged until the EPROM based softwareinitialization code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would cause the CS selector value to be changed).

不过PC上的ROM BIOS的boot loader确实开始于一条far跳转指令,这是出于兼容原始的IBM PC BIOS的原因,这条far跳转指令(比如jmp f000:e05b)把cs的描述符重装了,执行的物理地址从FFFFFFF0转换成了000FFFF0,能继续执行高于1MB地址空间中的代码是通过内存控制器的特殊设计来保证的。内存控制器对于1MB地址的高256KB(C0000~FFFFF)是特殊处理的,intel称之为PAM(Programmable Attribute Map) Memory Spaces,对于1MB地址的高64KB,intel在芯片组文档中说:
The system BIOS region is a single, 64-KB segment. This segment can be assigned read and write
attributes. It is by default (after reset) read/write disabled and cycles are forwarded to the hub interface. By manipulating the read/write attributes, the MCH can “shadow” BIOS into system memory.
意思就是说,系统复位之后,F000段的shadow状态是disabled,对这个64KB地址范围的访问,内存控制器(MCH)做了重定向处理,通过DMI(Direct Media Interface)转向到了ICH(南桥),最终通过南桥的LPC Bus定位到了装BIOS的Flash ROM。注意这是intel芯片组的处理方式,不能保证AMD、NVIDIA等也是这么做的,不过最终结果应该一样。

这种处理方式确实很复杂,不过是IBM PC兼容机的标准方式,但是对于其他使用x86处理器的计算机,比如MAC、SGI图形工作站,没有兼容原始PC的需要,所以很可能不必这么弯弯绕,ROM的引导部分不用far跳转、far调用就是了,可以很安全地运行在4GB的高64KB。
  • 打赏
  • 举报
回复
32位x86处理器复位之后,cs:eip=F000:0000FFF0,F000对应的描述符基地址FFFF0000,段限制FFFF,所以虽然是实模式,却可以运行在4GB-64K这一块地址,这地方被内存控制器映射到ROM BIOS的boot loader部分。
「已注销」 2011-09-05
  • 打赏
  • 举报
回复
记得在Linux系统原理及源码剖析里面看过,说什么先把BIOS复制到低地址,因为这时候是在实模式下运行的,不能使用全部的4G内存,然后加载Linux初始化什么程序,xxx地址,忘记了,然后jmp到那个地址执行,然后那个地址又加载另一个东西到内存,再把自己还是内核复制到首地址开始,跳过去运行系统。。。
说不清,我也记不清了……
zoologist 2011-09-05
  • 打赏
  • 举报
回复
1、基本上是cpu决定chipset,然后chipset决定后面很多事情
2、chipset中的northbridge决定地址分配
3、关于映射这部分,一般的做法是开机之后从4G内存处开始跑,这时候实际上没有内存,都是在rom中跑。跑着跑着就把自己拷贝到1MB一下,然后设置shadow,这样看起来1MB的那个地方和rom没什么差别了,但是实际上是在内存中。然后跳到这个地方开始内存中运行,主要是ram执行起来远比rom快。
5、刚开机是在1MB一下的legacy的位置,等操作系统起来之后,通常用一个映射,来在vga卡的地址上运行。具体我也不清楚,大概如此
w908065729 2011-09-05
  • 打赏
  • 举报
回复
DelPhiguy你说的倒是不错只是,刚开始不是有个跳转吗,这时候保护模式的位还未开启,那肯定就会刷新了隐藏寄存器的默认的值了,然后就是实模式,不知我说的有没有道理
w908065729 2011-09-04
  • 打赏
  • 举报
回复
楼上能不能再推荐几本啊
大熊猫侯佩 2011-09-04
  • 打赏
  • 举报
回复
看一下《深入dos编程》和bios编程的晋级书籍即可。
canmeng 2011-09-04
  • 打赏
  • 举报
回复
bios这部分比较复杂……
masmaster 2011-09-04
  • 打赏
  • 举报
回复
向楼主推荐按:《PC技术内幕》
w908065729 2011-09-04
  • 打赏
  • 举报
回复
谢谢大家的指导啊,看来我还是先看看bios的书,然后再去问问老师吧,只是有那些bios的书各位再给推荐一下吧
MSOKD 2011-09-04
  • 打赏
  • 举报
回复

加不了人哦
[Quote=引用 6 楼 cxdzxc 的回复:]

bios群67286087
[/Quote]
cxdzxc 2011-09-04
  • 打赏
  • 举报
回复
bios群67286087
canmeng 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 w908065729 的回复:]
太伤心了,没有人回答,分少也不要这样嘛
[/Quote]楼主不要伤心。因为研究bios的本来就不多。除了一些大牛,别人都不懂的。2楼可是群主,他说的那些你先看看呗。
w908065729 2011-09-04
  • 打赏
  • 举报
回复
太伤心了,没有人回答,分少也不要这样嘛

21,497

社区成员

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

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