myr*_*ack 15
您可以通过I/O端口70h和71h访问BIOS设置.(有些芯片组还有72/73或类似的扩展CMOS.)
你用的是什么操作系统?如果您运行的是Windows,则无法直接从应用程序执行端口I/O,您必须编写内核模式驱动程序,或使用WinIO等第三方工具包.在Linux下,您可以使用/ dev/nvram来获取CMOS设置.(假设Linux nvram驱动程序支持您的芯片组.否则使用/ dev/port.)
一旦获得CMOS位,下一个任务就是确定CMOS中的哪个位置对应于视频存储器设置.
这是一个(可悲的是不完整的)CMOS内存位置图:http: //ivs.cs.uni-magdeburg.de/~zbrog/asm/cmos.html
CMOS位置的地图非常特定于主板,BIOS和BIOS rev.(当添加/删除新的菜单选项时,CMOS映射可以在BIOS转速之间切换.)也许您的主板供应商可以为您提供CMOS映射.他们有生成这种地图的工具(它是BIOS编译过程的一部分),但他们可能不愿意分享它.
如果没有映射,还有其他方法可以确定CMOS中的哪些位代表视频内存大小.尝试转储具有各种内存大小的CMOS设置,并找出哪些位发生变化.
其他一些细节:
除了一些"标准"CMOS位之外,其中大多数都是非常依赖平台的,我希望你不打算用它来制作一个通用的应用程序.
CMOS中的某些偏移处有校验和.更改CMOS值后,您必须修复校验和以反映更改.
更改设置后,它将不会生效到下次重新启动(当BIOS读取CMOS设置并初始化芯片组时).
这是英特尔芯片组吗?英特尔图形核心具有称为动态视频内存技术(DVMT)的神奇功能,可根据运行应用程序的图形密集程度调整视频内存使用量. http://www.intel.com/support/graphics/sb/cs-010488.htm 我不确定其他芯片组供应商是否有类似的技术.
在现代UEFI系统上抛出所有这些,这通常使用BIOS闪存芯片中的非易失性存储分区进行设置.(在UEFI系统上填充了一些CMOS位置以实现传统兼容性.)