MacOS环境-手写操作系统-35-Shell控制台

简介: MacOS环境-手写操作系统-35-Shell控制台

控制台

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将控制台窗口移动到合适位置


我们看看进程函数的实现

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.编译和运行

相关文章
|
5月前
|
Linux Shell 开发工具
10分钟让你的Linux Shell终端变得更优雅,更高效——【Linux服务器下OhMyZsh+P10k安装实践】
10分钟让你的Linux Shell终端变得更优雅,更高效——【Linux服务器下OhMyZsh+P10k安装实践】
195 1
|
11小时前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
8 1
|
10小时前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
7 0
|
11小时前
|
存储 算法 调度
MacOS环境-手写操作系统-29-进程切换
MacOS环境-手写操作系统-29-进程切换
5 0
|
11小时前
|
算法 调度 iOS开发
MacOS环境-手写操作系统-31-进程自动切换
MacOS环境-手写操作系统-31-进程自动切换
6 0
|
12小时前
|
Java API iOS开发
MacOS环境-手写操作系统-21-实现MessageBox
MacOS环境-手写操作系统-21-实现MessageBox
6 0
|
1月前
|
人工智能 Linux iOS开发
操作系统的演变:从命令行到图形界面
在这篇文章中,我们将探索操作系统的发展历史,从最初的命令行界面到现代的图形用户界面。我们将了解操作系统的基本功能和重要性,以及它们如何随着时间的推移而演变。我们还将讨论一些著名的操作系统,如Windows、macOS和Linux,并了解它们的特点和优势。最后,我们将展望未来的操作系统发展趋势,包括人工智能和虚拟现实等新技术的影响。
|
2月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
2月前
|
数据可视化 Linux UED
探索操作系统:从命令行到图形界面的演变
【8月更文挑战第31天】 本文将带您穿越时空,探索操作系统的发展历程。我们将从最初的命令行界面(CLI)开始,逐步走向现代的图形用户界面(GUI)。通过深入浅出的语言和实际代码示例,我们将揭示操作系统如何影响我们的日常生活和工作。准备好跟随我们的脚步,一起揭开操作系统的神秘面纱吧!
|
2月前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!