Entorno MacOS-sistema operativo de escritura a mano-35-consola Shell

consola

1. Introducción

Una aplicación importante del sistema operativo es la consola de comandos.

Al igual que la colección de consola de comandos del sistema Linux, es la herramienta principal para usar el sistema.

En esta sección desarrollaremos una consola de comandos para el sistema.

En el futuro desarrollaremos aplicaciones para el sistema y muchos programas se ejecutarán a través de la consola.

2.Código

Nuestro programa de consola se basará en el mecanismo de proceso completado anteriormente.

Después de que el proceso principal dibuja la ventana de la consola, inicia un proceso dedicado y envía la ventana al proceso.

Deje que el nuevo proceso sea responsable de actualizar la información de la ventana y responder a la entrada del usuario.

Veamos el código para dibujar la ventana de la consola.

En 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 primero solicita memoria y obtiene el objeto de capa HOJA

Luego dibuje la ventana de la consola a través de las funciones de dibujo de ventana relacionadas make_window8 y make_textbox8

Luego obtenga un objeto de proceso, que es la información relacionada con la configuración de la estructura de datos de TAREA.

Y configure el objeto de la capa de la consola en la pila del nuevo proceso para que el proceso pueda actualizar la ventana de la consola.

Llame a task_run para ejecutar el proceso de la consola

Al mismo tiempo, mueva la ventana de la consola a la posición adecuada mediante Sheet_slide y Sheet_updown.

Veamos la implementación de la función de proceso.

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 es la función principal ejecutada por el nuevo proceso. Inicia un temporizador.

El propósito de este temporizador es dibujar el cursor en la consola.

En el bucle principal, el código de la parte else se ejecutará cada vez que se agote el tiempo de espera.

El código seleccionará diferentes colores para dibujar el cursor según los diferentes valores en la cola durante el tiempo de espera.

Cada vez que se agota el tiempo, el código cambia el color del cursor a blanco o negro, creando un efecto especial de cursor parpadeante.

3. Compile y ejecute

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/w776341482/article/details/128646177
Recomendado
Clasificación