1. 程式人生 > >自制作業系統Antz day12——承上啟下

自制作業系統Antz day12——承上啟下

我已經規範了系統程式碼風格,類似於按照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都可以幫助你更加的深入瞭解計算機作業系統底層的實現。