请高手指点Windows低层问题:
是这样的,以前的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)