MacOS 環境 - 手書きオペレーティング システム - 35 - シェル コンソール

コンソール

1 はじめに

オペレーティング システムの重要なアプリケーションはコマンド コンソールです。

Linux システムコマンドコンソールコレクションと同様に、システムを使用するための主要なツールです

このセクションでは、システム用のコマンド コンソールを開発します。

将来的には、このシステム用のアプリケーションを開発し、多くのプログラムをコンソール経由で実行する予定です。

2.コード

私たちのコンソール プログラムは、以前に完了したプロセス メカニズムに依存します。

メイン プロセスはコンソール ウィンドウを描画した後、専用のプロセスを開始し、ウィンドウをプロセスに送信します。

新しいプロセスにウィンドウ情報の更新とユーザー入力への応答を担当させます

コンソールウィンドウを描画するコードを見てみましょう

write_vga_desktop.c 内

void  launch_console() {
    struct SHEET *sht_cons = sheet_alloc(shtctl);
    unsigned char *buf_cons = (unsigned char *)memman_alloc_4k(memman, 256*165);
    sheet_setbuf(sht_cons, buf_cons, 256, 165, COLOR_INVISIBLE);
    make_window8(shtctl, sht_cons, "console");
    make_textbox8(sht_cons, 8, 28, 240, 128, COL8_000000);

    struct TASK *task_console = task_alloc();
    int addr_code32 = get_code32_addr();
    task_console->tss.ldtr = 0;
    task_console->tss.iomap = 0x40000000;
    task_console->tss.eip =  (int)(console_task - addr_code32);

    task_console->tss.es = 0;
    task_console->tss.cs = 1*8;//6 * 8;
    task_console->tss.ss = 4*8;
    task_console->tss.ds = 3*8;
    task_console->tss.fs = 0;
    task_console->tss.gs = 2*8;
    task_console->tss.esp -= 8;
    *((int*)(task_console->tss.esp + 4)) = (int)sht_cons;
    task_run(task_console, 1, 5);

    sheet_slide(shtctl,sht_cons, 32, 4);
    sheet_updown(shtctl, sht_cons, 1);
}

launch_console は最初にメモリを適用し、SHEET レイヤー オブジェクトを取得します。

次に、関連するウィンドウ描画関数 make_window8 および make_textbox8 を使用してコンソール ウィンドウを描画します。

次に、TASKデータ構造の設定関連情報であるプロセスオブジェクトを取得します。

そして、プロセスがコンソール ウィンドウを更新できるように、コンソール層オブジェクトを新しいプロセスのスタックに設定します。

task_run を呼び出してコンソール プロセスを実行します。

同時に、sheet_slide およびsheet_updown を使用して、コンソール ウィンドウを適切な位置に移動します。

process関数の実装を見てみましょう

void console_task(struct SHEET *sheet) {

    struct FIFO8 fifo;
    struct TIMER *timer;
    struct TASK *task = task_now();

    int i, fifobuf[128], cursor_x = 8, cursor_c = COL8_000000;
    fifo8_init(&fifo, 128, fifobuf, task);
    timer = timer_alloc();
    timer_init(timer, &fifo, 1);
    timer_settime(timer, 50);

    for(;;) {

        io_cli();
        if (fifo8_status(&fifo) == 0) {
   //         task_sleep(task);
            io_sti();
        } else {
            i = fifo8_get(&fifo);
            io_sti();
            if (i <= 1) {
                if (i != 0) {
                    timer_init(timer, &fifo, 0);
                    cursor_c = COL8_FFFFFF;
                } else {
                    timer_init(timer, &fifo, 1);
                    cursor_c = COL8_000000;
                }

                timer_settime(timer, 50);
                boxfill8(sheet->buf, sheet->bxsize, cursor_c, cursor_x,
                28, cursor_x + 7, 43);
                sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);
            }
        }
    }
}

console_task は、新しいプロセスによって実行されるメイン関数であり、タイマーを開始します。

このタイマーの目的は、コンソール上にカーソルを描画することです。

メインループでは、タイマーがタイムアウトするたびにelse部分のコードが実行されます。

コードは、タイムアウト中にキュー内のさまざまな値に基づいてカーソルを描画するためのさまざまな色を選択します。

タイムアウトになるたびに、コードはカーソルの色を白または黒に戻し、カーソルが点滅する特別な効果を作成します。

3. コンパイルして実行する

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/w776341482/article/details/128646177