紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 1607|回复: 1

关于内存延迟分配问题

[复制链接]

1

主题

17

帖子

0

精华

初来乍到

Rank: 1

积分
21
发表于 2021-1-2 13:06:04 | 显示全部楼层 |阅读模式

#include <windows.h>
#include <stdio.h>

//申请一个页面边界的内存(添加一个新的段)
#pragma section("data_seg",read,write)
__declspec(allocate("data_seg"))DWORD  var = 1;

DWORD out = 0;

void __declspec(naked) IdtEntry()
{
        //__asm
        //{
        //        push 0x30;
        //        pop fs;
        //}
        __asm
        {
               
                mov eax, var;
                mov DWORD ptr ds : [out], eax;
                iretd;
        }
        //__asm
        //{
        //        push 0x3b;
        //        pop fs;
        //        iretd;
        //}
}


//eq 8003f600 0040ee00`00081014                                                                       
void go()
{
        __asm
        {
                int 0x40;
        }

}
int main(int argc, char* argv[])
{
        printf("IdtEntry:%x\r\n", (DWORD)IdtEntry);
        if ((DWORD)IdtEntry != 0x00401000)
        {
                printf("funaddr  faild\r\n");
                return -1;
        }
        printf("var:%x\r\n", &var);
        getchar();
        go();
        printf("out:%x\r\n", out);

        return 0;
}


代码就是在一个页边界申请了一个变量,然后去访问这个变量,其实这个变量是没有挂 PTE的,也就是说执行 mov eax, var; 的时候会触发0E中断,按道理是会修复,不会修复的话,按道理会报错,但是也没有? 就比较好奇

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2021-2-4 08:00:55 | 显示全部楼层
添加的新段在内存里本来就是有效的。访问它根本不会产生异常,否则是编译器在瞎搞。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-3-29 09:13 , Processed in 0.022333 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表