30天自制OS笔记(一)前10天内容中遇到的问题

来源:互联网 发布:php动态网页设计 编辑:程序博客网 时间:2024/05/18 02:32

书还不错,下载下来看了下,能看个一知半解,索性决定读完一次试试,原书的代码注释是日文版的,有个群252617052,群主已经将日文翻译过来了,配合着书看看,也挺好的。


涉及到汇编的很多东西,看了又忘了,用笔记记一下吧。

第4天。


CLI(clear interrupt flag)将中断标志置0

STI(set interrupt flag)将中断标志置1

当cpu遇到中断请求时,立即处理中断请求(中断标记为1),还是忽略中断(标记为0)

ELFAGS寄存器,存储的是进位标志和中断标志


在画矩形的时候,自作聪明的重写了fillbox函数,结果不小心把x,y弄反了,导致画出来的图形总是颠倒的,弄了半天才发现问题。


第5天,涉及到中断操作


GDT和IDT

GDT是global segmentdescriptor table全局段号记录表。将这些数据整齐的排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在cpu内被称为GDTR的特殊寄存器中就可以了。

IDT是中断记录表。



第六天


init_gdtidt();/* 初始化GDT, IDT */
init_pic(); /* 初始化PIC */
io_sti(); /* 打开所有可屏蔽中断 */

这三句代码写反了,结果。。。

这三句没有注意,哎,调试了一个晚上,不停地对照,各种问题


第七天

在输出键盘相应信息时,应该这样调用:

boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
putfonts8_asc(binfo->vram,binfo->scrnx,0,16,COL8_FFFFFF,s);

结果自作聪明的省去了boxfill8这个函数,直接输出了putfonts_anc,因为没有重新绘制背景,所以所有的字符全部重叠在一起,笨死了。


同样在最后的代码中,添加鼠标响应之后,

if((fifo8_status(&keyinfo)+ fifo8_status(&mouseinfo))==0)

有这么一句,本意是当鼠标和键盘的缓冲区中都没有数据时,此时无事可做,只能先开中断,在hlt。但是我又傻傻的根据做acm的经验,把+写成了||,然后很悲剧的没有得到鼠标的信息。

在主函数中,因为复制的关系,多写了一次

init_keyboard();
enable_mouse();

结果发现第一字节的数据跑到第二字节上了。。。郁闷了半天.


第十天

前几天的内容基本上每次手动修改都会多多少少出现些问题,不过有了之前几次很蛋碎的经验之后,也就比较速度的解决了。

第一次看提高叠加处理速度(2)中关于sheet_refreshsub这个函数的最终版本有点郁闷,没怎么倒腾清楚,但是感觉即使是最初的版本,跟最终的版本都是效果没什么差别。

或许机子性能差点的话可能就明显了。

说一下这个函数中那几个if语句的理解:

bx0 = vx0 - sht->vx0;by0 = vy0 - sht->vy0;bx1 = vx1 - sht->vx0;by1 = vy1 - sht->vy0;if (bx0 < 0) { bx0 = 0; }/* 左上角坐标调整 */if (by0 < 0) { by0 = 0; }if (bx1 > sht->bxsize) { bx1 = sht->bxsize; }/* 右下角坐标调整 */if (by1 > sht->bysize) { by1 = sht->bysize; }//用?:代替if语句bx0=bx0<0?0:bx0;  by0=by0<0?0:by0; bx1=bx1>sht->bxsize?sht->bxsize:bx1;by1=by1>sht->bysize?sht->bysize:by1;
那四个if是原作者的,不过我喜欢用?:这样看起来简洁一些。

解释:

最初的版本是对于所有的vx 和vy判断是否处于 (vx0,vx1)~(vx1,vy1)【这四个是由参数传进来的】之间,处于之间的像素才进行重绘,

其中 vx=sht->vx0+bx(bx的范围是 0 ~ sht->bxsize) 

 vy=sht->vy0+by(by的范围是 0 ~ sht->bysize) 
sht->vx0是当前图层所在屏幕的坐标,【同理sht->vy0】

那么我们仅仅需要重绘的范围应该是(vx0,vx1)~(vx1,vy1)中的,也就是有这样的不等式:
vx0<= sht->vx0+bx< vx1     vy0<= sht->vy0+by< vy1 

按照作者的说法,为了在for语句中不进行判断,就必须将bx和by的大小分别限定在vx0-sht->vx0~vx1-sht->vx0   和vy0-sht->vy0~vy1-sht->vy0之间,这样确保在for语句中都是赋值语句,也就是上边代码前4行的赋值语句的含义,后边的4个if是为了判断不至于产生负数,说的直白一些就是处理一下边界情况(重绘区域在左上角和右下角的情况)

其实试验之后发现改不改效果没啥区别。。。。

  

原创粉丝点击