请高手指点Windows低层问题:

skywind 2001-04-29 02:27:00
是这样的,以前的Win 16编程分配内存用GlobalAlloc,返回一个handle等到用
它的时候就GlobalLock()锁定后返回一个指针来读写,之后又要GlobalUnlock()
Windows开发手册上说这是:为了让不用的内存块漂移,让它一会而漂到硬盘上一
会而又票到主存里提高系统效率。
由此可以段定Win16的模式中内存的分页机制没有起作用,只是分段机制在忙
应为如果分页起了作用的话就不必让内存块漂了,直接把它的linear address直接
映射到空白页面,同时将以前的数据备分到硬盘。等到访问到时,或发生了缺页中断
系统又把它映射到有效页面接着恢复数据,更本不必要Lock/Unlock。也就是说。
在Win32 2G的线形可用空间里面GlobalAlloc等一系列函数都是过时的了,分配
内存直接用new就可以了,而且自始至终不必管它会不会漂移,它的linear addr.
都是一样的,上面是我的推理,不知是否正确?应为如果正确的话下面一段说法也
即将成立:
既然Win32采用了段/页试管理机制,那么现在我在主存里面新建一个表面
并锁定它,得到指针point1。这意味着什么?在以后我Unlock以后我同样可以
利用point1来作图,而不必每次都去Lock/Unlock(lock每次都要复制sizeof
(ddsd)个字节的东西,如果频繁使用实在有些不忍。而当某个傻瓜用户按下
ALT_TAB时Windows会抢占显存从而使创建于显存的表面丢失,这意味着创建于
系统内存的表面不会丢失。既然不会丢失,那么对于主存里面的表面我只要一次
取得其地址以后就可以不必再lock/unlock(前提是不让写此表面的blt,bltfast
于后台运行)是吗,如果这样的话Dx的编程将大大简化了!
上面的说法我个人试过无数次,且屡试不爽。但我总想这样的做法是否安全?
请教各位高手这种做法是安全的?还有一个问题,我编写中断服务程序的话为什么
一定要锁定服务程序呢?既然采用了分页机制发生中断时找到空白页就发生缺页中断
恢复数据后接着执行刚才的中断,为什么一定要求锁定呢?
感谢您耐心地看完了这么愚蠢冗长的问题,还望您指教一二 :-)

还有一点:
如果上述成立的话,对于主存里面的表面我不必当心什么,我可以生
成一张表WORD *Lines[height];来储存每行开始象素的地址,在写
点时就可以避免乘法或者位移运算了,这样的话效率又大大提高了!!
(仿照Allegro)
...全文
73 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
repus 2001-04-29
  • 打赏
  • 举报
回复
只是为了把最常用的页面锁定在物理内存提高效率罢了。
中断服务程序就不一样了,他的中断优先级可能高于缺页,发生缺页时缺页中断可能被屏蔽。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧