30天自制操作系统之第17天 命令行窗口

我们把命令行窗口单独做成一个新的任务。
要实现字符输入,只要在键盘被按下的时候向console_task(命令行窗口任务)的FIFO发送数据即可。但要发送数据必须要知道struct FIFO的内存地址才行。
把 struct FIFO 放到 struct TASK里面。基本上没有什么任务是完全用不到FIFO的,因此我们把它们绑定起来。

struct TASK {
    int sel, flags; // sel is used to save the index of GDT
    int priority;
    struct FIFO32 fifo;
    struct TSS32 tss;
};

当前切换到命令行窗口时,系统会向命令行窗口任务发送键盘数据,支持一般的字符输入和退格键。由于在命令行窗口中也使用了定时器等,为了不与键盘数据冲突,我们在写入FIFO的时候将键盘数据的值加上256。


实现符号“!”和 “%”的输入。
我们要处理Shift键,Shift的按键编码为

Shift按下抬起
0x2a0xaa
0x360xb6

我们准备一个 key_shift 变量, 当左Shift按下时置为1,右Shift按下时置为2,两个都不按时置为0,两个都按下时置为3。

int key_shift = 0; // does not press any Shift

/* Shift key */
if (i == 256 + 0x2a) { // left Shift ON
    key_shift |= 1;
}
if (i == 256 + 0x36) { // right Shift ON
    key_shift |= 2;
}
if (i == 256 + 0xaa) { // left Shift OFF
    key_shift &= ~1;
}
if (i == 256 + 0xb6) { // right Shift OFF
    key_shift &= ~2;
}
if (key_shift == 0) {
    s[0] = keytable[i - 256];
} else {
    s[0] = keytable1[i - 256];
}

按下Shift键进行符号输入时,我们启用另一套键盘符号表。


再一个要实现小写字母的输入。

CapsLock 为 OFF & Shift 键为 OFF —— 写英文字母
CapsLock 为 OFF & Shift 键为 ON —— 写英文字母
CapsLock 为 ON & Shift 键为 OFF —— 写英文字母
CapsLock 为 OFF & Shift 键为 ON —— 写英文字母

所以需要我们知道CapsLock键的状态,我们已经在asmhead.nas中从BIOS获取到了键盘状态保存到了binfo->leds:

binfo->leds的第4位 —— ScrollLock状态
binfo->leds的第5位 —— NumLock状态

struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
int key_leds = (binfo->leds >> 4) & 7; 
if ('A' <= s[0] && s[0] <= 'Z') { /* when the inputed char is English character */
    if (((key_leds & 4) == 0 && key_shift == 0) ||
            ((key_leds & 4) != 0 && key_shift != 0)) {
        s[0] += 0x20; //change uppercase to lowercase
    }
}

这里写图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建一个完整操作系统是一个复杂而庞大的项目,通常涉及到操作系统内核、驱动程序、系统架构等多个层面,对于30天的时间来说,这是不现实的。然而,如果你对操作系统编程有兴趣,你可以尝试学习和理解操作系统的基本原理,并用一些轻量级的框架或工具如QEMU、Minix等来进行实践。 以下是一个简化的步骤概述: 1. **理论学习**:阅读操作系统相关的书籍,如《深入理解计算机系统》(The Art of Computer Programming, Volume 3),了解进程管理、内存管理、文件系统等基础概念。 2. **选择平台**:决定从用户空间(比如Linux内核的clone() API)还是内核模式(比如使用QEMU模拟)开始,因为内核开发涉及更多底层硬件知识。 3. **编写基本结构**:创建进程控制块(PCB)、内存管理模块,开始实现基本的系统调用接口。 4. **进程管理**:实现进程的创建、调度、同步和通信机制。 5. **内存管理**:设计虚拟内存映射、内存分配和回收算法。 6. **I/O管理**:处理设备驱动程序,实现简单的输入输出操作。 7. **文件系统**:如果要做全功能操作系统,你需要实现一个基本的文件系统,用于存储和读取数据。 8. **构建测试环境**:编写单元测试和系统测试,确保每个部分都能正常工作。 9. **持续学习和改进**:在整个过程中,不断查阅文档、源代码和参考资料,以解决遇到的问题。 记住,这是一个高度概括的过程,实际操作中每一步都需要大量的研究和编码。如果你是初学者,可能需要投入更多时间来学习相关基础知识。关于30天的具体代码示例,由于这个项目的规模和复杂性,这里无法提供详细的代码片段,但你可以通过在线教程和开源项目如MINIX的学习来找到起点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值