30天自制操作系统日志第5天.pdf

上传人:w*** 文档编号:73524314 上传时间:2023-02-19 格式:PDF 页数:12 大小:650.03KB
返回 下载 相关 举报
30天自制操作系统日志第5天.pdf_第1页
第1页 / 共12页
30天自制操作系统日志第5天.pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《30天自制操作系统日志第5天.pdf》由会员分享,可在线阅读,更多相关《30天自制操作系统日志第5天.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、操作系统实验日志学号实验日期520姓名实验项目甘昆禄专业年级班级智能 1601第 5 天:结构体、文字显示与 GDT/IDT 初始化一、实验主要内容一、实验主要内容1、接收启动信息和结构体在上一章中,xsize 和 ysize 的值都是直接赋值为 320*200,但实际上我们需要从先前保存下来的值中去。即:不然的话,当画面模式改变时系统就不能正确运行。所以试着用指针取得图像模式:void HariMain(void)char*vram;int xsize,ysize;short*binfo_scrnx,*binfo_scrny;int*binfo_vram;init_palette();/*设

2、定调色板*/binfo_scrnx=(short*)0 x0ff4;binfo_scrny=(short*)0 x0ff6;binfo_vram=(int*)0 x0ff8;xsize=*binfo_scrnx;ysize=*binfo_scrny;vram=(char*)*binfo_vram;for(;)io_hlt();/*執行 naskfunc 里的_io_hlt*/诶这样是不是说就可以改变画面模式了于是天真的我:保存运行一下,以为画面会显示坐标在左上角的 320*200,结果发现画面显示错误,forgetabout it。诶然后发现结构体里这个在汇编里没有定义,可能作者以后讲哦先说结

3、构体可以看做结构体是将一堆变量集中声明,然后作为新的变量用于其他场合。结构体的运用:(1)先声明结构体:如上图(2)后定义结构体变量:struct BOOTINFO abc;或者定义结构体指针变量:structBOOTINFO*binfo;这里 binfo 表示指针变量后应该首先给指针赋值,可写成:Binfo=(struct BOOTINFP*)0 x0ff0;加上(struct BOOTINFP*)是对数字进行强制类型转换,告诉编译器这个数字是一个 BOOTINFO 类型的指针变量。info 指针指向地址 0 x0ff0 是结构体的起始地址,结构体内的地址则依次按其类型增加。所以可以不用直接

4、使用内存地址,而是使用*binfo来表示这个内存地址上 12 个字节的结构体。在表示结构体内变量的时候,使用“.”表示:xsize=(*binfo).scrnx;因为 binfo 是指向结构体地址的指针变量,它表示其内部变量的形式很多,可以用箭头表示:Xsieze=binfo-scrnx,或者用 binfo-scrnx 直接代替 xsize2、显示字符终于到写字了,诶果然有定义好的哪个字母让具体哪个像素指定颜色,比如A的显示如下:用 8x16 的长方形像素点阵来表示,8 位是一个字节,1 个字符是 16 个字节,然后将字体主句写入主程序:static char font_A16=0 x00,0

5、 x18,0 x18,0 x18,0 x18,0 x24,0 x24,0 x24,0 x24,0 x7e,0 x42,0 x42,0 x42,0 xe7,0 x00,0 x00;程序里就会有 A 的信息了,当然放在程序里总是不好的,后面就有改了。显示字符的函数是这样:void putfont8(char*vram,int xsize,int x,int y,char c,char*font)int i;char*p,d;/*data*/for(i=0;i vram,binfo-scrnx,30,30,COL8_FFFFFF,HariboteOS.);for(;)io_hlt();/*執行 na

6、skfunc 里的_io_hlt*/这里调用了三次,后面两次先显示的黑色,再在不同但临近坐标显示一次白色,达到立体效果。效果如下:然后这里作者说,要自制操作系统,现在就能自由显示变量很重要。因为这里没用debug 可以用,如果出现错误就会很麻烦,就迫切需要知道变量有没有弄错。这里用到一个 sprintf 函数。sprintf 函数和 printf 函数的区别在于它不是按指定格式输出,只是将输出内容作为字符串卸载内存中。sprintf 函数的使用办法是:sprintf(地址,格式,值,值,值,)这里的地址指定所生成字符串的存放地址。格式基本上只是单纯的字符串,如果有%的这类标记,就置换成后面的值

7、的内容。除了%d(将数值作为十进制数转化为字符串)还有%s,%x(将数值作为十六进制转化为字符串)等符号。这里看来,sprintf 函数的效果不过是将相应格式的内容存到相应地址罢了,要显示输出还是靠putfont8。3、显示鼠标指针显示指针跟显示字符思路一样,也是先准备16*16=256 字节的内存,然后往里面写入指针的数据。将这个程序写在函数里面:,*OOOOOOOOOOO*.,*OOOOOOOOOO*.,*OOOOOOOOO*.,*OOOOOOOO*.,*OOOOOOO*.,*OOOOOOO*.,*OOOOOOOO*.,*OOOO*OOO*.,*OOO*.*OOO*.,*OO*.*OOO*

8、.,*O*.*OOO*.,*.*OOO*.,*.*OOO*,.*OO*,.*;int x,y;for(y=0;y 16;y+)for(x=0;x 16;x+)if(cursoryx=*)mousey*16+x=COL8_000000;if(cursoryx=O)mousey*16+x=COL8_FFFFFF;if(cursoryx=.)mousey*16+x=bc;return;课本说什么要将上面背景色显示出来,还要做下面这个函数,搞得我差点误解,看了半天,这个不就是将整个鼠标显示出来吗。这里分开的合理之处我猜应该是方便以后鼠标所到之处颜色的改变。void putblock8_8(char*v

9、ram,int vxsize,int pxsize,int pysize,int px0,int py0,char*buf,int bxsize)int x,y;for(y=0;y pysize;y+)for(x=0;x vram,binfo-scrnx,binfo-scrny);mx=(binfo-scrnx-16)/2;的大小是多少2.段的起始地址在哪里3.段的管理属性(禁止写入,禁止执行,系统专用等)CPU 用 8 个字节的数据来表示这些信息。但是,用于指定段的寄存器只有 16 位。魔方图像调色板的做法:现有一个段号,存放在段寄存器里,然后预先设定好段号与段的对应关系。段寄存器低三位不能

10、用,能够处理的就只有位于 08191 的区域。因为能够使用08191 的范围,即可以定义8191 个段,设定这么多段就需要8192x8=65536 字节(64KB)。这 64KB 的数据就称为 GDT,“global(segment)descriptiontable”的缩写,意思是全局短号记录表。将这些数据整齐地排列在内存的某个地方,然后将内存的起始地址和有效设定个数房子啊 CPU 内被称作 GDTR 的特殊寄存器中。IDT 是“interrupt description tabel”的缩写,表示“中断记录表”,用来执行CPU的中断功能。各个设备有变化是就产生中断,中断发生后,CPU 暂时停止

11、正在处理的任务,保存现场,转而执行中断程序,执行完毕之后恢复现场。总结来就是要使用鼠标就需要中断机制,所以必须设定 IDT。IDT 记录了 0255 的中断号码与调用函数的对应关系,其设定方法与 GDT 很相似。二、遇到的问题及解决方法二、遇到的问题及解决方法1、尝试更改画面模式失败。刚用结构体的时候说如果直接代入 320*200 的值,改模式会错,然后我看用了结构体,直接引用存在汇编里的再改,失败了,目前没有找到原因:本来修改为 640*480*4 模式的,但画面显示的乱码三、程序设计创新点三、程序设计创新点1、事实上,我对作者这个字符的输出还是不满意,他要方便输出一个字符串的话,只能输出字

12、体里对应的 ASCII 码,也就是说只能输出 ASCII 码里的,那么字体给的那么多字符都不能方便的输出了我的确是在字体里看见这个的,输出却是乱码:要显示真没办法,只能逐个输出,这个字符对应 0 x0c 即十进制 12.四、实验心得体会四、实验心得体会这次实验又回顾了一下前面的内容,更加了解了各个文件是如何生成和对应的编译器程序的,因为这次又要用 Makefile 处理这个字体的 txt 文件,所以又有不少文件要生成和链接。用了结构体也终于用到了一直在汇编里写的那几个地址,以前总放着没用。不知道以后有没有教怎样更好的输出字体,以及移动鼠标后,如何判断鼠标当前位置的背景颜色,如何显示和恢复,感觉自己实现的话好难弄,完全没有思路,所以很期待作者的做法。

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

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁