终端
目标:清理代码并且解析用户输入
这节课,我们将做两件事。第一件,我们将清理代码,所以这是为了将来课程做准备。在之前的课程中,我们尝试在最可预见的地方输出字符串,但是当代码基准在增长的时候,了解和适应当前和以后的需求是一个好的练习。
代码清理(Code cleaning)
首先我们需要更多处理字符串等的功能函数,在常规操作系统中,他们叫C语言库,又称libc
现在我们把util.c
分成mem.c
和string.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
来解析更多的情况。在将来,当我们有一个文件系统的时候,我们将允许用户运行一些基本的命令。