按照什么规则组合成逻辑地址? 是由主板来统一这个逻辑地址呢? 还是OS安装的时候,由OS来识别并生成当前机器上逻辑地址的分布?
我猜是主板做的,因为内存有变化的时候(加了一根),机器自检会提示机器信息变换,需要更新系统信息,然后重启。
问题是操作系统如何得知机器的逻辑地址已经发生变化了,然后做出相应的寻址改变呢?
是谁将所有的存储器统一编址到一个"逻辑地址"? 换句话说,谁构建了连续的逻辑地址空间? 是硬件还是OS?
这些问题几乎都是由BIOS来实现的。
内存的地址分配是写死在BIOS当中的。
当新添加了一块内存条的时候BIOS当中有程序能检测到是否有新的内存条,如果有,则激活为这个内存条预留的地址,CPU通过int 15h得到的内存地址空间为激活的地址空间。
如对于一台典型的PC104可能会如此分配空间
地址范围(Hex) 大小 描 述
E0000-FFFFF 128K System Bios
D0000-DFFFF 64K Reserved
C0000-CFFFF 64K VGA Bios
A0000-BFFFF 128K Video RAM area
0-9FFFF 640K System Memory
正因为如此,操作系统启动的时候总是能找到启动代码,因为BIOS的地址是固定的
地址并不是你想想中的后移,地址是固定的。
比如你的主板支持1G的显存,但是你机器上只装了一个显存为512M的显卡,那么你只使用了前面一部分,后面没有使用,在BIOS当中应该有关于设置显存大小的选项,可以通过这种设置将其它的512M地址空间映射到其它硬件上
也就是说,主板支持某种设置,然后bios保存此设置?
问题是,如果我设置主板支持1G显存,然后我的显卡只有512M,那么程序会不会可能写显存越界呢? 这个显存范围是谁管理的,是bios,还是驱动程序,还是os本身的某个地方管理的?
显存地址是由BIOS管理的,驱动程序只负责对该地址空间读写数据,假若你在驱动程序写越界了,那么它的行为一般是未定义的(如,在驱动程序当中向一块reserve的内存写数据很可能无任何反应,内核也不报错)。
我对底层硬件如何实现并不是很了解,上面的回答也可能有误,只可当作参考,具体可找BIOS代码做为依据。