首页
社区
课程
招聘
[原创]关于虚拟内存的理解
发表于: 2013-10-25 10:12 2095

[原创]关于虚拟内存的理解

2013-10-25 10:12
2095
众所周知,WINDOWS 32位内存寻址是4G,但如果我现在物理内存是1G,如果我要寻址1G以上内存地址,在不分页的情况下,既不会出错也不会实现寻址,在分页情况下,如果线性地址与内存地址物理地址一一对应(即线性地址与物理地址相同),同样是这样,这些以前我都试验过了。那要怎样才能实现4G的内存寻址?
我有一些这方面的想法,我的理解是这样的,欢迎批评指正:
1.先在实模式用INT 15H取得物理内存,其中一般第二项是从100000h到实际内存的值。
2.扫描FAT,(假设为FAT32分区),得到空闲的硬盘扇区,总数为4G /512个,即为4G大小的连续硬盘扇区空间,得到第一个扇区的扇区号计为XXXXXXXXX
3.设置所有页表项的P位为0,清A位和D位,留下一段内存,比如0到256M作为备用,规定任何程序都不能访问,就像windows的80000000H-FFFFFFFFH的内核地址一样,从物理地址256M开始设置页目录表和页表等杂项,将线性地址对应于从256M开始的物理内存,将页目录装CR3。
4.完成退出。
接下来便是关键的INT 0EH页异常处理。
当前面的工作做完并返回,接下来运行的任何有关内存的操作程序都会发生INT 0EH异常(除了0到256M的内核地址)。异常处理的大体思路是:
1.取CR2并保存
2。扫描页表项,检查A位为0的页表,若找到后,如果位D为0直接用第1个页表的内容替换第2个页表项的值(即CR2对应的页表)。如果没有A位为0的页表,则找到任意一个页表,如果这个页表D位为1,将页表项对应的内存写入页表项值加上扇区号XXXXXXXX对应的硬盘扇区,同时用第1个页表的值替换这个页表的值。否则如果D位为0,还是直接替换。
这样就实现了虚拟内存,若是采用汇编编写,整个程序不超过5KB

还有很多的细节问题,欢迎讨论,大家畅所欲言。

[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回