30日間の自作OSノート(一)10日前の内容で発生した問題


本は悪くなくて、ダウンロードして読んで、1つの知半解を読むことができて、いっそ1回読んでみることを决めて、原書のコードの注釈は日本语版で、1つの群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は割り込み記録テーブルである.
6日目
init_gdtidt();/* GDTを初期化し、IDT*/init_pic(); /* PIC*/io_の初期化sti(); /* すべての遮断可能な割り込みを開く*/
この3つのコードは逆に書いて、結果..
この3つの文は注意していないで、おや、1晩デバッグして、ひっきりなしに対照して、各種の問題
7日目
次のように呼び出す必要があります.
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram,binfo->scrnx,0,16,COL8_FFFFFF,s);
結局自業自得でboxfill 8という関数を省いてputfonts_を直接出力しましたancは、バックグラウンドを再描画していないので、すべての文字が重なって、不器用です.
同様に最後のコードでマウスレスポンスを追加すると、
if((fifo8_status(&keyinfo)+ fifo8_status(&mouseinfo))==0)
マウスとキーボードのバッファにデータがない場合、何もすることがなく、hltで中断するしかないという意味です.しかし、私はまた愚かにacmの経験に基づいて、+を書きました|、それからとても悲劇的にマウスの情報を得ていません.
メイン関数では、コピーの関係で1回多く書きました
init_keyboard(); enable_mouse();
その結果、1バイト目のデータが2バイト目に走ったことがわかりました..長い間憂鬱だった.
10日目
先日の内容は基本的に手动で修正するたびに多少の问题が出てきましたが、これまで何度か卵が割れた経験があるので、比较的スピードで解决しました.
初めて見たオーバーラップ処理速度の向上(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;
の4つのifは原作者ですが、私は好きですか?:これで簡潔に見えます.
説明:
最初のバージョンでは、すべてのvxとvyが(vx 0,vx 1)~(vx 1,vy 1)【この4つはパラメータによって伝達される】間にあるか否かを判断し、間にある画素を再描画し、
ここでvx=sht->vx 0+bx(bxの範囲は0~sht->bxsize)
vy=sht->vy 0+by(byの範囲は0~sht->bysize)sht->vx 0は現在のレイヤーが存在する画面の座標であり、【同理sht->vy 0】
では、再描画が必要な範囲は(vx 0,vx 1)~(vx 1,vy 1)であるべきであり、vx 0<=sht->vx 0+bxvy 0+by著者らによると、for文で判断しないためには、bxとbyの大きさをそれぞれvx 0-sht->vx 0~vx 1-sht->vx 0とvy 0-sht->vy 0~vy 1-sht->vy 0の間に限定する必要があり、for文ではいずれも賦値文、すなわち上のコードの4行前の賦値文の意味であり、後の4つのifは負の数が発生しないと判断するためであり、はっきり言って、境界の状況を処理します(左上と右下の領域を再描画する場合)
実际には、试験の后、変更するかどうかの効果は何の区别もありません...