bookstack

终端

目标:清理代码并且解析用户输入

这节课,我们将做两件事。第一件,我们将清理代码,所以这是为了将来课程做准备。在之前的课程中,我们尝试在最可预见的地方输出字符串,但是当代码基准在增长的时候,了解和适应当前和以后的需求是一个好的练习。

代码清理(Code cleaning)

首先我们需要更多处理字符串等的功能函数,在常规操作系统中,他们叫C语言库,又称libc

现在我们把util.c分成mem.cstring.c

第二部,我们将创建一个新的函数irq_install(),以便于内核仅仅需要表现一个调用来初始化所有的IRQs。这个函数类似于isr_install(),放在irq.c文件内。然而现在,我们将让timer_callback()kprint()失效,来避免填充屏幕,现在我们知道它可以工作了。

cpu/drivers/有明显的不同。试想一下,我正则创建这个教程,然而其他人正在关注它,他们每个人都有一个不一样的文件结构。唯一的变化是,我们现在要把drivers/ports.*移动到cpu/,因为它明显是cpu依赖的代码。boot/也是cpu依赖的代码,但是在为另一个不同的机器实现启动顺序之前,我们是不会弄乱它的。

Makefile文件中,有更多的CFLAGS切换,因此我们将开始为C语言库创建更高级函数,如果我们在声明的时候犯了个错误,我们不想编译器包含任何其他的代码。我们也增加了一些标志把告警转换成错误,因为一个明显的错误转换成指针后,系统可能会崩溃。这也让我们关注在我们代码中修改一些坏指针声明。

最后,我们在libc/function.h中添加一个宏,用来避免未使用参数的告警错误

键盘字符(Keyboard characters)

怎么获取输入的字符呢?

  • 当一个键被按下的时候,回调函数会从keyboard.c开头定义的数组中获取ASCII码
  • 然后回调函数会把那个字符添加到一个buffer, key_buffer
  • 在屏幕上打印
  • 当操作系统像读取用户输入的时候,它调用libc/io.c:readline()

keyboard.c通过删除键缓冲区的最后一个元素来解析退格,然后调用screen.c:kprint_backspace()把它从屏幕上删除。对于这一点我们需要修改一点print_char(),以便于在输入退格时,不移动偏移量。

用户输入响应(Responding to user input)

键盘回调检查换行,然后调用内核,告诉它,用户已经输入了一些东西。我们最后libc的函数是strcmp(),这个函数的功能是比较两个字符串,如果相等就返回0。如果用户输入”END”,我们就终止CPU

这确实是最简单的shell,但是你应该感到骄傲,因为我们是一步一步实现的。你有没有意识到这很酷?

如果你愿意的话,你可以扩展kernel.c来解析更多的情况。在将来,当我们有一个文件系统的时候,我们将允许用户运行一些基本的命令。