自己动手写操作系统时遇到的关于VGA显示的疑问

来源:互联网 发布:php时间戳精确到毫秒 编辑:程序博客网 时间:2024/06/16 03:09
在自己动手写操作系统时,遇到了关于显示几个问题,经几方搜寻和思索,将理解作大致记录。
最初的疑问是,在Bochs上直接运行程序时为什么会有光标,而且还会闪烁?
了解之后才知道VGA显示有字符模式和图形模式之分,我原以为VGA就是简单地读写每一个像素。
于是通过BIOS中断切换到了图形模式,此时对写入显存的数据与最终显示结果的关系有了疑问。
另外对显存的地址也有了疑问,主要是大显存。之前对内存管理有一定的理解。
然后想不用BIOS,直接操作VGA控制器。
显示器是一个设备,显卡是一个设备,显卡控制显示器进行显示。
cpu是一个设备,cpu可以对显卡进行读写和配置。
cpu对显卡的配置与显示器无关。
x86汇编能调用中断进行显示是因为bios里有中断处理程序,如果这个程序只是按vga接口编的,那这台电脑就不能使用其它显示接口(如果自己写,能够被执行吗?)。
cpu可以通过端口与显卡通信,从而与显卡协调工作。
可以设置VGA工作在字符模式还是图形模式,这是cpu对显卡的设置。VGA编程讲了如何进行设置。
有一段固定物理地址分配给了显存,显卡(任何设备)设计需要符合一定的规范,才能与其它设备协同工作。
旧的程序在较新的设备上能够运行,这是兼容。
各种接口设备保证物理地址能够访问到不同的设备,如内存,显存,等等。
层次抽象利于运用却不利于理解。
BIOS就是一套程序。
对显存的直接操作讲了显卡的端口。
12h模式,02写模式下,一次会写8个像素,可以通过位屏蔽寄存器来屏蔽不想写的像素,每个像素都写入一样的值,写入的字节只有低4位会生效,分别写到4个颜色位平面上。
如果不用bios设置vga到12h模式,可以手动设置vga控制器中寄存器的值,只是需要设置的寄存器相当多,访问各类寄存器的方法也不相同。
如需要设置为12h模式:
unsigned char g_640x480x16[] ={/* MISC */0xE3,/* SEQ */0x03, 0x01, 0x08, 0x00, 0x06,/* CRTC */0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E,0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,0xFF,/* GC */0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x0F,0xFF,/* AC */0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,0x01, 0x00, 0x0F, 0x00, 0x00};
没有试过。
暂时还是只会用到字符模式,图形模式只是作为了解。
参考资料:

手动设置寄存器需要的寄存器预设值
http://files.osdev.org/mirrors/geezer/osd/graphics/modes.c

vga中的寄存器信息以及存取方式
http://www.osdever.net/FreeVGA/vga/vga.htm
原创粉丝点击