30天自制OS筆記(一)前10天內容中遇到的問題

書還不錯,下載下來看了下,能看個一知半解,索性決定讀完一次試試,原書的代碼註釋是日文版的,有個羣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是爲了判斷不至於產生負數,說的直白一些就是處理一下邊界情況(重繪區域在左上角和右下角的情況)

其實試驗之後發現改不改效果沒啥區別。。。。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章