毕设(13):shell 命令
本文详细介绍 xOS Shell 中各个命令的实现方式。Shell 是操作系统与用户交互的核心组件,通过命令表驱动的方式实现了多种实用命令。
Shell 架构概述
命令表设计
xOS 使用静态命令表来管理所有可用命令:
1 | |
命令解析
命令行输入通过 parse_command 函数解析为 argc/argv 格式:
1 | |
前台与后台命令
命令分为两类执行方式:
- 前台命令:直接在 Shell 上下文中执行,如
help、echo、clear等 - 后台命令:创建独立任务执行,如
countdown、mario、tetris等
1 | |
基础命令
help - 显示帮助信息
遍历命令表,打印所有可用命令及其描述:
1 | |
echo - 回显参数
将命令行参数原样输出,参数之间用空格分隔:
1 | |
clear - 清屏
使用 ANSI 转义序列清除屏幕并将光标移到左上角:
1 | |
\033[2J:清除整个屏幕\033[H:将光标移动到 (0,0) 位置
需要注意的是,改命令目前仅仅对于 minicom 有效,因为后面需要实现它的 hdmi 显示逻辑,比如清屏。
info - 系统信息
显示 xOS 的硬件和软件配置信息:
1 | |
进程管理命令
ps - 进程状态
遍历任务表 tasks[],显示所有活动进程的信息:
1 | |
任务状态定义在 sched.h 中:
1 | |
fg - 移至前台
将指定任务设置为前台任务,其输出将直接显示到 UART:
1 | |
task_set_foreground 的实现会清除之前前台任务的标志:
1 | |
bg - 移至后台
将任务移至后台运行,其输出将被缓存而非直接显示:
1 | |
kill - 终止任务
强制终止指定任务,释放其资源:
1 | |
task_kill 在调度器中的实现:
1 | |
logs - 查看任务输出
显示指定任务的历史输出,使用环形缓冲区存储:
1 | |
每个任务都有一个 1MB 的环形输出缓冲区:
1 | |
内存管理命令
heap - 堆内存统计
显示堆内存的使用情况:
1 | |
xOS 使用 First-Fit 算法的堆管理器,内存块结构如下:
1 | |
malloc 实现采用首次适配策略,找到足够大的空闲块后进行分割:
1 | |
free 释放内存后会合并相邻的空闲块:
1 | |
显示相关命令
hdmigc - HDMI 缓冲区垃圾回收
这是一个后台任务,负责清理 HDMI 终端滚动后留下的旧行:
1 | |
task_yield 通过触发软中断让出 CPU:
1 | |
change - 切换帧缓冲区
xOS 支持三个帧缓冲区,用于双缓冲和 Shell 显示:
1 | |
非内置命令
countdown - 倒计时
一个简单的后台任务示例,演示任务调度:
1 | |
输入处理
PS2 键盘扫描码处理
Shell 通过中断驱动方式接收 PS2 键盘输入:
1 | |
字符输入处理
1 | |
总结
xOS Shell 实现了一个功能完整的命令行界面:
| 命令 | 类型 | 功能 |
|---|---|---|
| help | 前台 | 显示帮助信息 |
| echo | 前台 | 回显参数 |
| clear | 前台 | 清屏 |
| info | 前台 | 系统信息 |
| ps | 前台 | 进程状态 |
| fg/bg | 前台 | 前后台切换 |
| kill | 前台 | 终止任务 |
| logs | 前台 | 查看任务输出 |
| heap | 前台 | 内存统计 |
| change | 前台 | 切换帧缓冲区 |
| countdown | 后台 | 倒计时演示 |
| hdmigc | 后台 | HDMI 垃圾回收 |
关键设计要点:
- 命令表驱动:易于扩展新命令
- 前后台分离:长时间运行的任务不阻塞 Shell
- 环形输出缓冲:后台任务输出可追溯
- 中断驱动输入:响应及时,不占用 CPU