做一个支持图形界面的操作系统(上).doc

上传人:博****1 文档编号:544604129 上传时间:2023-01-07 格式:DOC 页数:20 大小:98.01KB
返回 下载 相关 举报
做一个支持图形界面的操作系统(上).doc_第1页
第1页 / 共20页
做一个支持图形界面的操作系统(上).doc_第2页
第2页 / 共20页
做一个支持图形界面的操作系统(上).doc_第3页
第3页 / 共20页
做一个支持图形界面的操作系统(上).doc_第4页
第4页 / 共20页
做一个支持图形界面的操作系统(上).doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《做一个支持图形界面的操作系统(上).doc》由会员分享,可在线阅读,更多相关《做一个支持图形界面的操作系统(上).doc(20页珍藏版)》请在金锄头文库上搜索。

1、做一个支持图形界面的操作系统(上)副标题:作者:谢煜波 文章来源:本站原创 点击数: 713 更新时间:2004-9-18(转载及引用请注明明原作者及出处)(pdf: http:/ 0.01(对应pyos版本号:2004_09_18_14_00)哈尔滨工业大学 谢煜波(email: 网址:http:/)(QQ:13916830 哈工大紫丁香BBSID:iamxiaohan)前言 图形界面(GUI)几乎被现在所有的主流操作系统及应用程序使用,这是因为它提供了极好的人机交互接口,微软大名鼎鼎的Windows就是一个非常成功而明显的例子,据说微软的理念有一条就是“让电脑变得越来越傻瓜,任何人都可以操

2、作它”,很显然,要实现这个梦想,GUI界面是必须的。 如果有操作系统的支持,编写具有图形界面的程序是一件相对来说比较容易的事情,因为操作系统为你管理显卡,为你提供了各种各样诸如画点、画线、画矩形、填充等各种图形函数,你只需要将你所希望显示的东西,通过直接调用这样一些函数生成就行了,操作系统会为你完成余下的一切。 然而,如果你打算自己从头编写一个操作系统,而没办法使用已有的操作系统所提供的便利功能的时候,又应当怎样完成这样一个图形界面呢? 本文打算继续以pyos系统为例,简单描述一下怎样让你自己的操作系统支持图形界面。如果你想更好的理解本篇的内容,你需要对操作系统的引导过程有些许了解,这可以参考

3、一下本文的参考文献1,另外,你还需要对汇编语言有所了解,这可以参考一下本文的参考文献2。本文的实验代码由汇编及C语言完成,如果你对C语言不太了解,可以参考一下本文的参考文献3。 标准的GUI界面应当包括图形化界面的显示及对用户输入的支持,而现在在GUI界面下用的最广泛的用户输入设备就是鼠标了。因此本文打算以两部份分别进行描述。上篇描述图形界面的显示,下篇描述对鼠标的支持。 由于知识及水平所限,对于其中不当及错误之处或者您有任何建议,非常欢迎您与我联系。我会在哈工大纯C论坛上(http:/)上对本文进行跟踪反馈,本文所描述的资料及源代码也可以在上面找到。一、显卡接口标准VESA简介 所谓标准,其

4、实就是一种协议,比如显卡接口标准,就是显卡与主机之间进行通信的协议,通过这个协议,主机就能操作及控制显卡。比如主机要让显卡在(x,y)画一个点,需要对显卡进行什么操作,这在协议上都有明确的说明与规定,因此,如果我们要操作一个显卡,只需要按照协议上的说明与规定进行就行了,这里的协议就如同一个说明书一样。 随着显卡的发展,先后出现了很多种协议,比如EGA协议,CGA协议,VGA协议等,而现在用得最广泛的是由国际视频电子标准协会(Video Electronics Standards Association)制定的称为VESA的协议,现在最新的协议版本是3.0,不过由于目前并不是所有的显卡均支持此项

5、协议,特别是众多的虚拟机都不支持,因此本文将以2.0版本作为描述的基础,由于各版本是向下兼容的,因此基于2.0的程序完全可以不经修改的应用在3.0版本上。 VESA标准包括了很多的子标准,其中对于操作系统编写最有用的就是VBE标准(Vesa Bios Extension),在实际的系统编写中,我们按照此标准,通过调用BIOS的0x10号中断,而对显卡进行操作,在调用此号中断的时候,ax寄存器中存放的就是你想使用的显卡的功能。比如VESA 2.0标准规定:0x4F00号功能可以返回显卡所支持的VESA标准的信息,0x4F01号功能可以返回所指定的显示模式的信息,诸如行列像素是多少,每像素的字节数

6、是多少之类。调用这些功能是非常方便的,比如,通过阅读VESA标准,我们知道0x4F02号功能可以用来设置显示模式,调用此功能时,bx中存放的是欲设置的显示模式的编号,因此,如果我们想将显卡的显示模式设为0x111模式,那么我们应当编写如下的代码: mov ax , 0x4F02 ;设置中断功能号,表示使用0x4F02号功能 mov bx , 0x111 ;设置显示模式号,表示使用0x111显示模式 int 0x10 ;调用BIOS的0x10号中断,设置显卡功能 执行了上面的代码之后,显卡就被设置成了0x111号显示模式,那么这个模式有些什么显示特性呢?请看下面的表格:(表1 VESA标准定义的

7、显示模式(部份)模式号分辨率色彩0x100640*4002560x101640*4802560x102800*600160x103800*6002560x1041024*768160x1051024*7682560x1061280*1024160x1071280*10242560x10D300*2001:5:5:50x10E320*2005:6:50x10F320*2008:8:80x110640*4801:5:5:50x111640*4805:6:50x112640*4808:8:80x113800*6001:5:5:50x114800*6005:6:50x115800*6008:8:80x

8、1161024*7681:5:5:50x1171024*7685:6:50x1181024*7688:8:80x1191280*10241:5:5:50x11A1280*10245:6:50x11B1280*10248:8:8 上面的表格列出了VESA标准所定义的部份显示模式,其中色彩有两种表示形式。一种是所谓的“调色板”模式,一种是所谓的“真彩”模式,“调色板”模式主要是为了兼容以前的老式显卡,那种显卡上的显存数量一般说来都非常的少,因此,显卡上一次最多只能存储256种(8位)或更少的16种色彩(4位),比如本表前面部份所示。显卡上把这些色彩组织成为一个表,这个表就称之为一个调色板,然后每点

9、的色彩信息其实就是一个下标,用于从调色板中检索出真正的色彩。比如一个点的色彩是2,则表示使用调色板中的第三个色彩(因为从0开始编号,所以2则对应调色板中第三项)。很显然,不是所有的色彩都能被记录在小小的调色板中,因此一般说来,对于一种给定色彩,我们需要用调色板中与它最相近的色彩进行显示。 现在的显卡一般都有很大的显存,因此它可以完整的存放一个点的色彩信息。我们知道,任何一种色彩都可用不同强度(亮度)的红(R)、绿(G)、兰(B)三种色彩合成,因此,我们要记录或给出一个点的色彩信息,只需要给出红、绿、兰这三种色彩各自的强度(亮度)就行了,因此,就出现了多种不同的编码方法,比如“5:6:5”模式,

10、就表示用最高的5位表示红色的强度,用中间的6位,表示绿色的强度,用最后的5位表示兰色的强度,这样表示一个色彩,总共需要16位,即2B,而“8:8:8”则表示,最高的8位表示红色的强度,随后的8位,表示绿色的强度,最后的8位表示兰色的强度,一个色彩用24位,即3字节进行表示。依次类推。由于这些色彩都被真实的记录下来了,因此这种模式又被称为“真彩”模式,如表1的后面部份所示。 由上面描述可知,我们可以根据我们的需要,选择适当的显示模式,然后调用VBE标准中所定义的中断设置显示卡。 VBE标准描述了大量的功能,这里不打算将它全部描述,只介绍下面行文所需要的功能,如果你想了解整个VBE标准所描述的功能

11、,请参考本文的参考文献4。 下面我们再描述一个下面需要用到的0x4F01功能。这个功能可以把显卡所支持的显示模式的对应信息返回到用户所指定的地址中。它可以如下调用: mov ax , 0x4F01 ;表示使用 0x4F01 功能,以获得显示模式信息 mov cx , 0x111 ;表示欲获得0x111显示模式的信息 mov es , 0x9000 mov di , 0x0001 ;上面两句表示把信息放在es:di;(此处为0x9000:0x0001)处,这是一块内存的;起始地址,而此块内存至少256B大小返回的信息是一个256字节的,很庞大的结构,这里我们只介绍我们下面行文感兴趣的部份。在返回

12、的结构体中偏移量为40的地方,即es:di+40处,用4字节存放了一个线性地址,这就是这个显卡在此模式下显存的线性地址,因此,如果我们直接向这个地址写入数据,那么这数据就会被直接写到显存上,这样就可以显示出我们所需要显示的信息了。这就是所谓的“直接写屏”。 返回的结构体中还包括了该显卡在此模式下每行行像素,列像素等其它众多信息,如果你需要详细了解,请参看本文的参考文献4。二、用Pyos进行实验2.1 引导代码分析 令人非常高兴的是,这次实验我们不需要了解太多的基础知识,而就可以很快的进入实验了,下面我们就来看看我们这次的实验。 在实验前,我们需要先设定一个我们需要实验的显示模式,这里我们暂且定

13、为640*480,采用的色彩模式为5:6:5模式,即0x111模式。 我们先来看看我们这次实验的最终结果:现在,让我们先来看看我们的引导代码:main: ;主程序 ;下面设置段寄存器 mov ax , BOOT_SEG mov ds , ax mov ax , TEMP_DATA_SEG mov ss , ax mov sp , 0xffff mov BOOT_DRIVER , dl ;得到启动的驱动器号 call open_a_20 ;打开 a20 地址线 call save_boot_driver ;保存驱动器号 call show_message ;显示启动信息 call read_setup ;读入 setup 程序 jmp dword SETUP_SEG:SETUP_OFFSET ;跳转到 setup 处执行 这是pyos引导程序(boot.asm)的主函数代码,它现在

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号