- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows下直接访问物理内存
Windows 95/98下直接访问物理内存 在很多情况下,我们都有直接访问物理内存的要求,如在实时高速数据采集系统中,对I/O板上配置的存储器的访问。但是,为了保证系统的安全性和稳定性,操作系统并不提倡应用程序直接访问硬件资源,因此,随着操作系统的进步,导致了目前存在的这样一个不幸的事实:以前在DOS下很容易实现的特定物理内存的读写操作,在Windows下却变得相当困难。 本文主要讨论如何在Windows 95/98下实现物理内存的直接读写操作。为了论述清楚这个问题,有必要叙述保护模式的寻址方式以及Windows 95/98的内存管理方式。 Windows 95/98内存管理方式 Windows 95/98工作在32位保护模式下,保护模式与实模式的根本区别在于CPU寻址方式上的不同:尽管两者对应的内存地址均为段地址:偏移量形式,但在保护模式下,段地址代表的值已不再是实模式中段的起始基准地址了;对于CS、DS、ES、SS寄存器,在实模式下,这些寄存器的值左移4位,再加上偏移量,即得到物理地址,而在保护模式下,这些寄存器的值为段选择符,它实际上是一个查全局描述符表(GDT)或局部描述符表(LDT)的索引,据此在GDT或LDT找到对应的段描述符,从而获得段的基址及类型等信息,再根据偏移量,才能得到线性地址。如果操作系统没有采用分页机制,那么得到的线性地址即为物理地址,否则,线性地址需要进一步经过分页机制才能得到物理地址。这就是保护模式下的段页式寻址机制。 Windows 95/98使用4GB的虚拟内存地址空间,应用程序访问内存使用虚拟地址,从虚拟地址到物理地址的转换过程如图1所示:图1 虚拟地址到物理地址的转化过程 对于图1中的分页机制,Windows 95/98采用两级页表结构,如图2所示。图2 采用的分页机制的两级页表结构 从图2可知,线性地址被分割成页目录条目(PDE)、页表条目(PTE)、页偏移地址(Off set)三个部分。当建立一个新的WIN 32进程时,Windows 95/98会为它分配一块内存,并建立它自己的页目录、页表,页目录的地址也同时放入进程的现场信息中。当计算一个地址时,系统首先从控制寄存器CR3中读出页目录所在的地址(该地址为物理地址,并且是页对齐的),然后根据PDE得到页表所在的地址,再根据PTE得到包含了实际Code或Data的页帧, 最后根据Offset访问页帧中的特定单元。 常用内存段的段选择符 从上述所介绍的Windows 95/98采用的分段、分页机制可看出,要想在Windows 95/9 8下直接访问物理内存,关键是得到欲访问物理内存所在的内存区域对应的段选择符。 一般说来,要求直接访问的物理内存都与实模式下能够寻址的内存有关(即DOS能直接访问的1M物理内存)。在Windows 3.X中,Microsoft给出了DOS常用段的段选择符,如_000 0H(未公开),_B800H,_F000H(已公开),等等,均可以在KERNEL中找到,应用程序可以直接使用这些段选择符,实现物理内存的直接访问。而在Windows 95/98中,Microsoft却不在任何文档中提供这些段的预定义,在KERNEL中也不提供相应的段选择符。但是,Windows 95 /98确实给DOS下的这些常用内存段定义了相应的段描述符。通过SoftIce 3.02 for Win dows 95/98,我们得到了关于LDT的如下信息: ...... :ldt LDTbaseLimit=3FFF …… 1007 Data16 00000C90 0000FFFF 3 P RW 100F Data160000FFFF 3 P RW 1017 Data160000FFFF 3 P RW 101F Data16 000F0000 0000FFFF 3 P RW 1027 Data16 000A0000 0000FFFF 3 P RW 102F Data16 000B0000 0000FFFF 3 P RW 1037 Data16 000B8000 0000FFFF 3 P RW 103F Data16 000C0000 0000FFFF 3 P RW 1047 Data16 000D0000 0000FFFF 3 P RW 104F Data16 000E0000 0000FFFF 3 P RW …… 其中,每一行对应一个段描述符,第一栏为其段选择符,第二栏为段描述符的类型,第三栏为段的基地址(线性地址),第四栏为段的限长,第五栏为段描述符的特权级,第六栏标志对应段是否存在于内存中,第七栏表示段的访问权限。 可以看出,这些段的基地址与DOS下的常用内存段完全吻合,并且均为
原创力文档


文档评论(0)