中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 请问800x600,32Bits(1.83M)下的显存的指针
« [1] [2] »
作者:
标题: 请问800x600,32Bits(1.83M)下的显存的指针 上一主题 | 下一主题
RexxaDDT
初级用户




积分 28
发帖 11
注册 2008-6-27
来自 潮州
状态 离线
『楼 主』:  请问800x600,32Bits(1.83M)下的显存的指针

800x600 或 1024x768 分辨率下的显存通常都大于1M
内存,我只知道如何设置显示模式,就是不知道如何获得
它的指针
如何在保护模式下,有大于64K的指针吗?
或者是整个屏幕的指针?

[ Last edited by RexxaDDT on 2008-6-28 at 09:00 PM ]

2008-6-28 20:57
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (119)  编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 2 楼』:  

早期的TRIDENT、S3等SVGA显卡仍然使用A0000~BFFFF这两段,通常用128K段,具有很多的位面。现在的多半使用e8000000~efffffff这段PCICFG空间,页面大小通常是AGP SIZE所指定的,可能存在多个页面,具体位置目前偶也还没完全搞清楚,也许仍然还兼容SVGA模式,不过INTEL的集成显卡可能例外-_-!!

2008-6-29 00:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 3 楼』:  

只有VBE2.0(或更高)才支持显存的32位线性地址访问,然后根据使用VBE功能1取得视频模式信息判断该模式是否支持。该功能返回ModeInfoBlock结构:
ModeAttributes是该模式的特性。D7位为1表示支持线性地址(VBE 2.0)
WinSize是窗口大小信息
WinASegment、WinBSegment分别是两个窗口的段地址
WinAAttributes、WinBAttributes是窗口属性,表示哪个能读哪个能写。一般显卡只有一个窗口,即能读又能写
WinGranularity是页面颗粒大小,即一个页面多少KB
WinFuncPtr是换页函数的地址,直接调用该函数比调用BIOS快
PhysBasePtr是显存的32位线性地址(VBE 2.0)


如果发现VBE低于2.0,或该模式不支持,就使用传统的换页模式操作显存



人类存在的目的就是试图理解人类为何存在
2008-6-29 18:58
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
RexxaDDT
初级用户




积分 28
发帖 11
注册 2008-6-27
来自 潮州
状态 离线
『第 4 楼』:  

多谢了以上二位!
已经能操作了:
我的9550,800x600,65536色(Mode=114(4114))的显存地址为
E0000000(物理)
什么PCI 空间的 基本上不懂,
还有我在保护模式下对 E0000000 操作会一闪一闪的
请问这是什么回事?

2008-6-30 12:07
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (119)  编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 5 楼』:  

CPU访问显存的时候会独占总线,导致显卡无法访问显存,自然会一闪一闪

有两种解决方案:
1.只在垂直回扫期间访问显存
2.使用双缓冲策略——先在内存中画好,再一次性传输到显存



人类存在的目的就是试图理解人类为何存在
2008-6-30 13:08
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by RexxaDDT at 2008-6-30 12:07:
多谢了以上二位!
已经能操作了:
我的9550,800x600,65536色(Mode=114(4114))的显存地址为
E0000000(物理)
什么PCI 空间的 基本上不懂,
还有我在保护模式下对 E0000000 操作会一闪一闪的
请问这是什么回事?

多谢多谢,显存原来和PCI配置空间并不重合!
闪烁问题正如ls所说的原因一样,所以你在写入数据时需要不停地读取3DAH I/O口的值(其中bit3和bit0表示回扫标志,bit3=1、bit0=1为垂直回扫,bit3=0、bit0=1为水平回扫),在回扫(水平回扫时间短,最好仅在垂直回扫)期间才往显存写入数据。
至于PCI配置空间主要用在PNP情况,比如你有两块显卡,那显卡分配到的I/O口和物理内存地址就会和正常的显卡I/O口地址不同,你需要从PCI配置空间取得I/O口基址,然后才能通过正确的I/O口来设置显卡。
至于如何访问PCI配置空间从而取得I/O口基址,你可以使用特定的hwid参照我发的那个源代码(http://cn-dos.net/forum/viewthread.php?tid=40172&fpage=2)进行搜索(PCI配置空间的数据格式你可以参照PCISIG标准)。

[ Last edited by netwinxp on 2008-7-1 at 06:42 PM ]

2008-7-1 17:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
danjiang
初级用户





积分 79
发帖 45
注册 2007-11-28
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by netwinxp at 2008-6-29 12:31 AM:
早期的TRIDENT、S3等SVGA显卡仍然使用A0000~BFFFF这两段,通常用128K段,具有很多的位面。现在的多半使用e8000000~efffffff这段PCICFG空间,页面大小通常是AGP S ...

问问:256M的显卡已经超出,用那些?

2008-7-2 15:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
danjiang
初级用户





积分 79
发帖 45
注册 2007-11-28
状态 离线
『第 8 楼』:  

学习了

2008-7-2 15:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 9 楼』:  

当显存>AGP SIZE时,就开始使用分页了,显存不在e8000000~efffffff这个位置(我原来猜测错了)。

2008-7-2 20:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
danjiang
初级用户





积分 79
发帖 45
注册 2007-11-28
状态 离线
『第 10 楼』:  

明白

2008-7-3 09:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
RexxaDDT
初级用户




积分 28
发帖 11
注册 2008-6-27
来自 潮州
状态 离线
『第 11 楼』:  

我是在WinXP下开发的,手头有Bochs, VMWave, 还有(1键Ghost供实际操作)
也就是说我有三个环境. 问题是:
还是以上操作显存的程序,在操作文本向上翻页(图形模式下), 但是有两种结果:
1。VMWare 翻页快得可以
2。Bochs,  还有本人的 P4M800 赛D2。66 实际运行慢得很
这是什么回事?

2008-7-4 19:01
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (119)  编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 12 楼』:  

VM在虚拟显卡方面做得相当出色,而且它可能是居于directx等很接近硬件的接口,所以速度快。
Bochs本身连CPU指令都是虚拟的,显卡虚拟也是居于应用层接口,本身就运行很慢,显卡速度缓慢也就很正常了。(几乎和JAVA虚拟机一个级别)
P4M800是集成显卡,使用内存做显存,带宽受到很大限制,而且还和内存访问争带宽,而我们又没有像显卡驱动程序一样得到比较好的优化,所以集成显卡慢也是可以理解的。(如果你用32位的传送方式可能能提高不少,记得源数据起始位置也要在4的倍数对齐,否则每次的32位传送会被分成两次或四次周期传送,这点在非汇编语言里面很容易被忽视。)

[ Last edited by netwinxp on 2008-7-5 at 12:29 AM ]

2008-7-5 00:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
RexxaDDT
初级用户




积分 28
发帖 11
注册 2008-6-27
来自 潮州
状态 离线
『第 13 楼』:  

那Windows 画桌面,图标,包括GDI等是怎么操作显存的呢?
是不是什么双线 或者 三线 缓冲策略, 还有或者是等待垂直回扫后高速写入

2008-7-5 18:44
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (119)  编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 14 楼』:  

那些归根到底全靠调用显卡的mini驱动文件来实现。windows的绝大部分咚咚度和硬件无关。具体来说就是NTOSKRNL是个调度中心,它把厂家的驱动程序作为服务进程装入(有执行I/O特权指令的权限),把大部分其他模块作为应用程序装入(没有执行I/O特权指令的权限),对硬件的操作归根到底是通过NTOSKRNL向驱动程序发送IOCTL申请包来完成。

[ Last edited by netwinxp on 2008-7-5 at 09:48 PM ]

2008-7-5 21:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 15 楼』:  

你对比一下装与没装显卡驱动时的窗口更新速度,会发现没装时刷新很慢,甚至鼠标光标一跳一跳的
Windows驱动程序体系本来就有高级绘图功能接口,然后厂家实现这些接口提高绘图效率
软件是不能跟硬件比的

还有一个就是剪裁问题
我们编写图形程序时,如果有多个图层,就按照遮盖顺序合并图层,再提交给显存
而Windows系统呢,根据各个窗口设置剪裁区域,丢弃位于剪裁区域外的绘图操作
剪裁算法的效率决定一个图形系统的效率
(Vista除外,直接利用GPU的3D图形处理能力,让硬件实现窗口层叠)



人类存在的目的就是试图理解人类为何存在
2008-7-7 09:39
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: