晕死,考试不一次性搞定,非要等3天,害的人在寝室宅的都快发霉了。。。某属于{yt}不找事儿做就会死星人。。昨天{yt}无语了。。。。 于是今天找了本书来看。。。汇编吧。看到了DOS在内存里的布局,又查了些资料,于是这篇半研究、半总结的文章就出来了。。 DOS是个好物呀,程序在那下面想怎么跑就怎么跑,你想管我?没门儿!没有保护模式强大的特权级保护等功能支持,DOS就像一位管不住手下的将军,xx不能和Win相比。要是在win下你敢干啥不正当的事,得,马上你的程序就被杀掉。。。 嘛,以上纯属吐槽。。。 首先对其布局做一个小结,上图:
首先是中断向量表,它的范围是00000H~003FFH,占据了1024Byte的空间。它储存了系统处理中断的函数的地址。 接下来是BIOS数据区。BIOS在系统启动时会检测各部件,其结果是产生一些检测结果和临时数据,这些数据当然不能放在ROM或是CMOS里,所以就搁在这里了。BIOS范围是00400H~004FFH,占据了256Byte。 在下就是系统及程序使用的内存了,它是从00500H~9FFFFH。 以上是DOS能使用的低端的640K的内存。 接下来从A0000H到FFFFFH的384KB的地址空间是分配给硬件的。其中包括视频缓冲区以及各个BIOS代码区等等。。 值得一提的是,地址FFFF0H处。在系统启动时,CPU的寄存器IP、和CS分别置为:CS=F000H,IP=FFF0H,所以CPU执行的{dy}个指令是在F000H * 10H + FFF0H = FFFF0处。该处的数据为EA5BE000F0,对应的汇编指令为:JMP F000:E05B即立即跳转到BIOS初始化指令处,开始系统启动过程。 实模式下寻址能力{zd0}为1M,而扣除硬件占据的地址空间后,DOS实际能使用的仅有640K。这在当时是绰绰有余了,不过随着内存容量的增加,这样的机制显然不合适了,于是出现了几种突破DOS的640K限制的技术手段。 HMA(xx内存区)技术 该技术及适用于80286及以上CPU,原因是其使用了CPU内部的A20总线。试想内存地址FFFF:FFFF = 10FFEFH,然而事实上这个地址的高于20bit的位数被忽略掉了,10FFEFH等价于地址FFEFH,这既是所谓的“内存环绕”。而使用了A20地址线后,便能{zg}寻址到FFFF:0000~FFFF:FFFF的空间。事实上FFFF:0000到FFFF:000F属于系统BIOS的空间,所以使用HMA技术事实上仅拓展了从100000H到10FFEFH共65520Byte大小的内存的区域(约为64K) UMB、EMS技术 该技术仅能在80386及以上的CPU实现。他们为了访问高于1M的内存区,将在系统BIOS内开辟一块16K大小的空间,并将高于1M的内存地址映射到这块空间上。于是对这块地址空间的访问事实上就是对高于1M的某个内存空间的访问。不同的是UBM是映射关系建立后就不可更改,而EMS则是对高于1M的各个16K空间编号,程序可通过设置这个号码要求将某块xx内存映射到这个区域来。。。吐槽一句:这个EMS实在使我想起了天朝某局,速度慢、服务态度又不好。。。 XMS 能在80286及以上实现。原理是在程序内存去开辟一块缓冲区,可以将xx内存数据送入缓冲区,也可将缓冲区数据送入xx内存。。。 以上
|