自制操作系統Antz(12)——承上啟下


我已經規范了系統代碼風格,類似於按照linux分包,把各部分功能區分開了

Antz系統更新地址

Linux內核源碼分析地址

Github項目地址

在之前的工作中,AntzOS已經從單調的界面,變得逐漸擁有自己的功能了。

真機運行情況 :

os1

os2

os3

這個系統在我最初的目的中就是實現一個半圖形半終端的輕巧OS。

完成了當前的工作后,Antz接下來需要實現的則是關於任務調度相關的。

目前實現的是在Terminal中對命令的響應,還有一個簡易的vim,可以用於右邊界面的文本編輯。

對於按鍵中斷,對全鍵盤的響應改良之后不會出現之前說的bug,但是在shift按下時的按鍵模式卻是有很大問題,雖然我已經想到了解決方案,不外乎給shift的按下一個flag,彈起一個flag,但這部分感覺現在實現與否都是不怎么重要,所以就先忽略這里了。

最近同時也在讀Linux內核源碼。發現其中的注釋也是很有意思,甚至Linus自己寫的,他也不知道這部分為什么這樣寫,不斷嘗試之后發現可以實現,他就這樣用了。

仔細看看關於按鍵響應命令的實現,現在只能說很懵,又臭又長,估計隨便改改我就會不知道怎么繼續下一步了。(不過好在我每添加一個功能都會把整個項目備份一份)

void key(Binfo binfo,char s[40]){
	if((strcmp(s,"1C")==0)){  // enter
			if(x_move!=0){
				// 右邊
				write_x = 58 ;
				write_y += 19 ;
			}else {
				// 左邊
				action_command(binfo);
				write_x = 58 ;
				write_y += 19 ;
				if (x_move==0)
					printasc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>");
			}
	}else if((strcmp(s,"0F")==0)){
		// 關於tab 0F 8F
		printasc(binfo->vram, binfo->scrnx, x_move+write_x, write_y, COL8_FFFFFF, " ");
		write_x += 8 ;
		border(binfo);
		printasc(binfo->vram, binfo->scrnx, x_move+write_x, write_y, COL8_FFFFFF, " ");
		write_x += 8 ;
		border(binfo);
		printasc(binfo->vram, binfo->scrnx, x_move+write_x, write_y, COL8_FFFFFF, " ");
		write_x += 8 ;
		border(binfo);
	}else if((strcmp(s,"3B")==0)){  //關於F1的響應中斷
			sprintf(command,"%s","");
			// flag = 0	
			x_move = 0 ;
			new_pe(binfo);
			printasc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>");
	}else if(strcmp(s,"0E")==0){
			// 回退
			int len = strlen(command);
			command[len - 1] = '\0';
			write_x -= 8 ;
			flash(binfo->vram, binfo->scrnx , COL8_000000,  x_move + write_x,     write_y,     x_move+write_x+19, write_y+19);
			if(x_move!=0){
   				// 正在右邊界
					if(write_x<=60) {
						write_x = 202 ;
						write_y -= 19 ;
					}
			}else if(x_move==0){
					// 正在左邊界
					if(write_x<=4) {
						write_x = 146 ;
						write_y -= 19 ;
					}
			}

	}else {
			char *in = replace_char(s) ;
			if(strcmp(in,"")==0){

			}else {
				printasc(binfo->vram, binfo->scrnx,  x_move + write_x,  write_y, COL8_FFFFFF, in);
				add_command(in);
				write_x += 8 ;
			}
			// 添加響應區
			//清除
			//打印字符 Only use debug
	}
	border(binfo);
}
// 邊界處理
void border(struct BOOTINFO *binfo){
	if (x_move==0){
		// 左邊
		if(write_x>148){
			write_x = 4 ;
			write_y += 19 ;
		}
		if(write_y>180){
	 		new_pe(binfo);
			printasc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>");
		}
	}else if(x_move!=0){
		// vim模式
		if(write_x>310-x_move){
			write_x = 58 ;
			write_y += 19 ;
		}
		if(write_y>180){
			write_y = 15 ;
			write_x = 58 ;
			flash(binfo->vram,binfo->scrnx,COL8_000000, 160,0,320-3,260-3);
			printasc(binfo->vram,binfo->scrnx,162,2,COL8_00FF00,"Vim :");
		}
	}
}

目前的項目目錄,請忽略掉md文件,這個鏡像文件可以直接使用工具寫入u盤啟動,或者在虛擬機打開。thun.c是今天(2018年10月18日)新增的,目的是為了抽離其他c文件中的工具化函數,不然以后只是一個源碼文件都會讓人頭疼。

▒▒  antz.img
▒▒  Makefile
▒▒  README.md
▒▒
▒▒▒▒asmfunc
▒▒      naskfunc.nas
▒▒
▒▒▒▒assic
▒▒      char.set
▒▒
▒▒▒▒boot
▒▒      asmhead.asm
▒▒      mbr.asm
▒▒
▒▒▒▒include
▒▒      errno.h
▒▒      float.h
▒▒      limits.h
▒▒      math.h
▒▒      stdio.h
▒▒      string.h
▒▒      todo.h
▒▒
▒▒▒▒interrupt
▒▒      int.c
▒▒
▒▒▒▒io
▒▒      fifo.c
▒▒
▒▒▒▒lgdt
▒▒      set_lgdt.c
▒▒
▒▒▒▒log
▒▒      build.log
▒▒      delete.log
▒▒
▒▒▒▒main
▒▒      bootpack.c
▒▒      README..md
▒▒      shell_1.md
▒▒      shell_2.md
▒▒
▒▒▒▒thun
▒▒      thun.c
▒▒
▒▒▒▒windows
        graphic.c

Makefile非常關鍵,如果沒有這個,怕是我只是編譯鏈接就得花費很長時間,而且中間估計會錯誤頻出。

Antz_kernel = main/bootpack.obj asmfunc/naskfunc.obj assic/char.set windows/graphic.obj lgdt/set_lgdt.obj interrupt/int.obj io/fifo.obj thun/thun.obj

之后的添加c文件,只需要在這里預先確定路徑,然后將需要實現的函數聲明在include/todo.h中即可。顯卡雖然實現了函數可以直接操作,但是分辨率太低,導致界面極不美觀,網卡驅動暫時沒有想過要寫,如果要實現,恐怕得整個antz都可以讓用戶使用的情況下才具備條件。

AntzOs需要更多優秀的開發者來實現,無論你是正在學習操作系統課程還是其他方面,我相信AntzOs都可以幫助你更加的深入了解計算機操作系統底層的實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM