7.6 KiB
7.6 KiB
Aios Shell Implementation Guide
Overview
Aiosのインタラクティブシェル実装についての詳細ガイド。
Implementation History
Phase 1: Initial Attempt (Failed)
実装内容:
// keyboard.rs - 複雑な実装
use core::convert::TryFrom;
static SCANCODE_TO_ASCII: [u8; 128] = [
// 複雑なマッピングテーブル
];
unsafe fn inb(port: u16) -> u8 {
// 危険なポートアクセス
}
問題:
- Page table panic (
page_table*.rs:105:25
) - ポートI/O競合
- 配列サイズ不一致
Phase 2: Safe Approach (Partially Working)
実装内容:
// keyboard_safe.rs
unsafe fn try_inb(port: u16) -> Option<u8> {
// 遅延付きアクセス
for _ in 0..1000 {
core::arch::asm!("nop");
}
// ... 安全なアクセス
}
結果:
- パニックは解決
- キーボード入力が機能しない
Phase 3: Basic Implementation (Success)
実装内容:
// keyboard_basic.rs - シンプルなアプローチ
pub fn has_key() -> bool {
unsafe {
let status: u8;
core::arch::asm!(
"in al, 0x64",
out("al") status,
options(nomem, nostack, preserves_flags)
);
(status & 1) != 0
}
}
結果:
- パニック解決
- キーボード入力動作
- スキャンコード正常取得
Architecture
Keyboard Driver (keyboard_basic.rs
)
/// PS/2キーボードの状態確認
pub fn has_key() -> bool
/// 生スキャンコードの読み取り
pub fn read_scancode() -> u8
/// スキャンコードからASCII文字への変換
pub fn scancode_to_char(scancode: u8) -> Option<char>
キーマッピング:
match scancode {
0x1E => Some('a'), // A key
0x30 => Some('b'), // B key
0x2E => Some('c'), // C key
// ...
0x39 => Some(' '), // Space
0x1C => Some('\n'), // Enter
_ => None,
}
Shell Core (main.rs
)
State Management:
static mut INPUT_BUFFER: [u8; 64] = [0; 64];
static mut INPUT_POS: usize = 0;
static mut CURSOR_ROW: usize = 12;
static mut CURSOR_COL: usize = 6;
Input Processing:
fn process_char(ch: char) {
match ch {
'\n' => execute_command(),
'\u{8}' => handle_backspace(),
' '..='~' => add_char_to_buffer(ch),
_ => { /* ignore */ }
}
}
Command Execution:
fn execute_command() {
let cmd = core::str::from_utf8(&INPUT_BUFFER[..INPUT_POS])?;
match cmd {
"help" => show_help(),
"version" => show_version(),
"echo" => echo_test(),
"clear" => clear_screen(),
_ => show_unknown_command(cmd),
}
}
Key Features
1. Real-time Input
- キー押下の即座の反映
- バックスペース対応
- 文字制限(64文字)
2. Command Processing
- Enter キーでコマンド実行
- コマンド履歴(将来実装予定)
- エラーハンドリング
3. Available Commands
help
Aios Commands:
help - Show this help
version - Show version
echo - Echo test
clear - Clear screen
version
Aios 2.0 - AI Operating System
Interactive Shell with Keyboard Support
echo
Hello from Aios Interactive Shell!
clear
- 画面全体をクリア
- カーソル位置をリセット
4. Input Handling
Scancode Processing:
loop {
if keyboard_basic::has_key() {
let scancode = keyboard_basic::read_scancode();
// キーリリースを除外
if scancode != last_scancode && (scancode & 0x80) == 0 {
last_scancode = scancode;
if let Some(ch) = keyboard_basic::scancode_to_char(scancode) {
process_char(ch);
}
}
}
// CPU負荷軽減
for _ in 0..1000 {
unsafe { core::arch::asm!("nop"); }
}
}
VGA Text Mode Interface
Screen Layout
Row 0: "Aios - AI Operating System" (Center)
Row 1: "Interactive Shell Ready" (Center)
Row 2: "Type 'help' for commands" (Center)
Row 3: [Empty]
Row 4: [Empty]
Row 5: aios> [user input] (Prompt)
Row 6+: [Command output]
Character Display
pub fn print_char(c: u8, x: usize, y: usize) {
if x >= 80 || y >= 25 { return; }
unsafe {
let vga = &mut *VGA_BUFFER;
vga.chars[y][x] = (0x0f << 8) | (c as u16);
// ^^^^ ^^^^^^^^^^
// Color Character
// (White/Black) (ASCII)
}
}
Color Scheme:
0x0f
= White text on black background- Format:
(color << 8) | character
Testing Procedures
1. Scancode Debug Test
// 目的: キーボード入力の確認
// 表示: "Scancode: 0x1E -> 'a'"
2. Interactive Shell Test
# テストシーケンス
1. help <Enter> # ヘルプ表示確認
2. version <Enter> # バージョン情報確認
3. echo <Enter> # エコーテスト確認
4. clear <Enter> # 画面クリア確認
5. invalid <Enter> # エラーハンドリング確認
3. Input Edge Cases
# テストケース
- 空のコマンド (Enter のみ)
- 長いコマンド (64文字以上)
- バックスペースの動作
- 連続入力
Performance Considerations
CPU Usage
// 軽量な遅延ループ
for _ in 0..1000 {
unsafe { core::arch::asm!("nop"); }
}
Memory Usage
- Input buffer: 64 bytes
- VGA buffer: Direct access (no buffering)
- Static variables: Minimal usage
Polling Frequency
- 高頻度ポーリング(遅延1000サイクル)
- CPU halt命令は使用しない(応答性重視)
Known Limitations
1. Character Set
- ASCII printable characters only (
' '
to'~'
) - 日本語等のマルチバイト文字は未対応
- 特殊キー(F1-F12, Arrow keys)は未対応
2. Input Features
- コマンド履歴なし
- Tab補完なし
- 行編集機能なし(カーソル移動等)
3. Display
- 80x25 text mode固定
- スクロール機能なし
- 色変更機能なし
Future Enhancements
1. Advanced Input
// 計画中の機能
- Command history (↑/↓ keys)
- Tab completion
- Line editing (←/→ keys)
- Multi-line input
2. Extended Commands
// 追加予定のコマンド
- ls // File listing
- cat // File content
- mkdir // Directory creation
- cd // Change directory
- ps // Process list
- claude // AI integration
3. Display Improvements
// 計画中の機能
- Scrolling support
- Color themes
- Multiple windows
- Status bar
Debugging Tips
1. Scancode Debugging
// スキャンコード確認用
print_str("Raw: 0x", x, y);
print_hex(scancode);
2. Buffer State Debugging
// バッファ状態確認
print_str("Pos: ", x, y);
print_number(INPUT_POS);
3. QEMU Console Output
# QEMUでの詳細ログ
qemu-system-x86_64 -kernel kernel.bin -d int,cpu
Build Configuration
Cargo.toml
[package]
name = "aios-kernel"
version = "0.2.0"
edition = "2021"
[dependencies]
bootloader = "0.9.23"
Build Command
# 開発用
cargo bootimage --release
# テスト用
./scpt/bootimage-test.sh
Success Metrics
実装成功の判定基準:
- キーボード入力: 文字入力が画面に表示される
- コマンド実行:
help
コマンドが正常動作 - バックスペース: 文字削除が正常動作
- エラーハンドリング: 不明コマンドでエラー表示
- 画面管理:
clear
コマンドで画面クリア
全ての機能が正常動作することを確認済み。