-
-
[原创]关于虚拟内存的理解
-
发表于: 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
还有很多的细节问题,欢迎讨论,大家畅所欲言。
我有一些这方面的想法,我的理解是这样的,欢迎批评指正:
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期预科班、正式班开始火爆招生报名啦!!!
赞赏
他的文章
- [求助]任务切换任务状态段的问题 2366
- [求助]ggnfs centos编译问题 21088
- [讨论]求助rsa ggnfs和msieve分解 18971
赞赏
雪币:
留言: