自制作業系統Antz day12——承上啟下
阿新 • • 發佈:2018-11-11
我已經規範了系統程式碼風格,類似於按照linux分包,把各部分功能區分開了
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