自制作業系統Antz day12——承上啟下
我已經規範了系統程式碼風格,類似於按照linux分包,把各部分功能區分開了
ofollow,noindex" target="_blank">Antz系統更新地址
Linux核心原始碼分析地址
Github專案地址
在之前的工作中,AntzOS已經從單調的介面,變得逐漸擁有自己的功能了。
真機執行情況 :
這個系統在我最初的目的中就是實現一個半圖形半終端的輕巧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都可以幫助你更加的深入瞭解計算機作業系統底層的實現。