如何从零构建操作系统命令行界面:os-tutorial shell开发终极指南
【免费下载链接】os-tutorialHow to create an OS from scratch项目地址: https://gitcode.com/gh_mirrors/os/os-tutorial
os-tutorial 是一个从零开始构建操作系统的开源项目,其中 shell 开发是实现用户交互的关键环节。本文将带你了解如何在该项目中从零构建一个简单但功能完整的操作系统命令行界面,掌握 shell 开发的核心技术和实现步骤。
一、shell 开发前的准备工作
在开始 shell 开发之前,需要对项目代码进行一些整理和优化,为后续开发打下良好基础。
1.1 代码结构调整
随着项目的不断发展,代码结构需要进行相应的调整。将原有的utils.c拆分为mem.c和string.c,并分别配上相应的头文件,形成 libc 库的雏形,方便后续字符串处理等功能的实现。同时,创建irq_install()函数,使内核只需一次调用即可初始化所有的 IRQs,类似于isr_install()函数,该函数位于irq.c文件中。
1.2 文件夹结构优化
为了使代码组织更加清晰,将drivers/ports.*移动到cpu/目录下,因为这部分代码明显与 CPU 相关。虽然boot/目录下的代码也与 CPU 相关,但在实现不同机器的引导序列之前,暂时不做改动。
1.3 Makefile 配置完善
在Makefile中添加更多的CFLAGS开关,以避免编译器在我们声明错误时包含任何外部代码。同时,添加一些将警告转换为错误的标志,因为指针转换中的一个小错误可能会在后续造成严重问题。这些修改也促使我们调整代码中一些杂项指针的声明。
二、键盘输入处理
要实现 shell,首先需要能够获取用户的键盘输入。
2.1 键盘字符获取
当按键被按下时,回调函数通过keyboard.c开头定义的新数组获取 ASCII 码,然后将该字符附加到缓冲区key_buffer中,并同时显示在屏幕上。当操作系统想要读取用户输入时,它会调用libc/io.c:readline()函数。
2.2 退格键处理
keyboard.c还会解析退格键,通过删除键缓冲区的最后一个元素,并调用screen.c:kprint_backspace()函数从屏幕上删除该字符。为此,需要对print_char()函数进行修改,使其在打印退格键时不推进偏移量。
三、shell 核心功能实现
shell 的核心功能是接收用户输入并做出相应的响应。
3.1 用户输入响应
键盘回调函数会检查换行符,然后通知内核用户已输入内容。项目中的 libc 函数strcmp()用于比较两个字符串,如果相等则返回 0。当用户输入 "END" 时,系统会执行asm volatile("hlt")指令来停止 CPU。相关代码可以在 kernel.c 中查看,其中user_input函数处理用户输入并做出响应。
3.2 简单 shell 的实现
这是一个最基本的 shell,但它是从零开始实现的,具有重要的意义。你可以根据需要扩展kernel.c来解析更多命令,在未来实现文件系统后,还可以允许用户运行一些基本命令。
四、总结
通过 os-tutorial 项目,我们一步步实现了从代码整理到键盘输入处理,再到 shell 核心功能的开发。虽然这个 shell 非常简单,但它展示了操作系统命令行界面的基本工作原理。通过这个项目,你可以深入了解操作系统的底层开发,为进一步学习和探索打下坚实的基础。如果你想深入学习,可以参考项目中的各个模块,如 cpu/、drivers/ 和 libc/ 等,继续扩展和完善 shell 的功能。
要开始这个项目,你可以通过以下命令克隆仓库:git clone https://gitcode.com/gh_mirrors/os/os-tutorial,然后按照项目中的文档逐步进行学习和实践。
【免费下载链接】os-tutorialHow to create an OS from scratch项目地址: https://gitcode.com/gh_mirrors/os/os-tutorial
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考