Files
aios/docs/MINIMAL_OS_DESIGN.md
2025-07-05 17:21:10 +09:00

7.1 KiB
Raw Permalink Blame History

最小限OS構成設計Redox OSベース

Redox OS分析結果

1. 最小構成の特定

コアコンポーネント196MiB以下

# config/minimal.toml から抽出
[packages]
base = {}          # 基本システム(~20MB
base-initfs = {}   # 初期ファイルシステム(~5MB
bootloader = {}    # ブートローダー(~2MB
drivers = {}       # 最小ドライバー(~15MB
kernel = {}        # マイクロカーネル(~5MB
relibc = {}        # C標準ライブラリ~10MB
coreutils = {}     # 基本コマンド(~8MB
ion = {}           # シェル(~3MB

初期化プロセス

# 00_base: 基本システム初期化
rm -r /tmp                  # 一時ディレクトリクリア
mkdir -m a=rwxt /tmp        # 一時ディレクトリ作成
ipcd                        # IPCデーモン
ptyd                        # PTYデーモン
sudo --daemon               # Sudoデーモン

# 00_drivers: ドライバー初期化
pcid-spawner /etc/pcid.d/   # PCIドライバー

2. AIOS向け最小構成実装

ディレクトリ構造

aios-minimal/
├── kernel/                 # Redoxカーネルベース
│   ├── Cargo.toml
│   ├── src/
│   │   ├── main.rs        # カーネルエントリーポイント
│   │   ├── memory/        # メモリ管理
│   │   ├── syscall/       # システムコール
│   │   └── scheme/        # スキームベースFS
├── bootloader/            # ブートローダー
├── userspace/             # ユーザーランド
│   ├── init/              # 初期化プロセス
│   ├── shell/             # Rustシェル
│   └── coreutils/         # 基本コマンド
└── config/
    └── minimal.toml       # 最小構成設定

カーネル最小化kernel/Cargo.toml

[package]
name = "aios-kernel"
version = "0.1.0"
edition = "2021"

[dependencies]
# 必要最小限の依存関係のみ
bitflags = "2"
spin = "0.9.8"
linked_list_allocator = "0.9.0"
redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git", default-features = false }

[features]
default = [
  "serial_debug",    # シリアルデバッグのみ
]
# 不要機能を削除
# acpi = []          # ACPI無効化
# multi_core = []    # シングルコアのみ
# graphical_debug = [] # グラフィカルデバッグ無効

最小カーネル実装kernel/src/main.rs

//! AIOS Minimal Kernel
#![no_std]
#![no_main]
#![feature(allocator_api)]

use core::panic::PanicInfo;

mod memory;
mod syscall;
mod scheme;

/// カーネルエントリーポイント
#[no_mangle]
pub extern "C" fn kmain() -> ! {
    // 基本初期化
    memory::init();
    scheme::init();
    syscall::init();
    
    // 最初のユーザープロセス起動
    let init_pid = syscall::exec("/usr/bin/init", &[]).expect("Failed to start init");
    
    // メインループ
    loop {
        syscall::sched_yield();
    }
}

#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    loop {}
}

シンプルな初期化プロセスuserspace/init/src/main.rs

//! AIOS Init Process
use std::process::Command;

fn main() {
    println!("AIOS Init Starting...");
    
    // 基本デーモン起動
    spawn_daemon("ptyd");    // PTY管理
    spawn_daemon("sudo");    // 権限管理
    
    // シェル起動
    Command::new("/usr/bin/shell")
        .spawn()
        .expect("Failed to start shell");
        
    // プロセス管理ループ
    loop {
        // ゾンビプロセス回収
        std::thread::sleep(std::time::Duration::from_secs(1));
    }
}

fn spawn_daemon(name: &str) {
    Command::new(format!("/usr/bin/{}", name))
        .spawn()
        .unwrap_or_else(|_| panic!("Failed to start {}", name));
}

軽量シェル実装userspace/shell/src/main.rs

//! AIOS Minimal Shell
use std::io::{self, Write};
use std::process::Command;

fn main() {
    println!("AIOS Shell v0.1.0");
    
    loop {
        print!("aios> ");
        io::stdout().flush().unwrap();
        
        let mut input = String::new();
        io::stdin().read_line(&mut input).unwrap();
        let input = input.trim();
        
        match input {
            "exit" => break,
            "help" => show_help(),
            cmd if !cmd.is_empty() => execute_command(cmd),
            _ => {}
        }
    }
}

fn execute_command(cmd: &str) {
    let parts: Vec<&str> = cmd.split_whitespace().collect();
    if parts.is_empty() { return; }
    
    match Command::new(parts[0])
        .args(&parts[1..])
        .status()
    {
        Ok(status) => {
            if !status.success() {
                println!("Command failed with exit code: {:?}", status.code());
            }
        }
        Err(e) => println!("Failed to execute command: {}", e),
    }
}

fn show_help() {
    println!("Available commands:");
    println!("  ls      - List files");
    println!("  cat     - Show file contents");
    println!("  echo    - Print text");
    println!("  help    - Show this help");
    println!("  exit    - Exit shell");
}

構成ファイルconfig/minimal.toml

# AIOS Minimal Configuration
[general]
filesystem_size = 128    # 128MiBRedoxの196MiBより小さく
prompt = false

[packages]
aios-kernel = {}
aios-init = {}
aios-shell = {}
aios-coreutils = {}

# 最小ファイルシステム
[[files]]
path = "/usr/lib/init.d/00_base"
data = """
mkdir -p /tmp /var/log
aios-init
"""

[[files]]
path = "/etc/hostname"
data = "aios"

# ユーザー設定
[users.root]
password = "root"
uid = 0
gid = 0
shell = "/usr/bin/aios-shell"

3. メモリ使用量最適化

カーネル最適化

  • スタックサイズ: 4KB最小限
  • ヒープサイズ: 1MB動的拡張
  • バッファサイズ: 512B固定

ユーザーランド最適化

// メモリ制限
const MAX_PROCESSES: usize = 16;     // 最大プロセス数
const MAX_FILES: usize = 64;         // 最大ファイル数
const STACK_SIZE: usize = 8192;      // プロセススタック8KB

4. ビルドシステム

Makefile

# AIOS Minimal Build System
TARGET = x86_64-unknown-none
ARCH = x86_64
CONFIG = minimal

.PHONY: all kernel userspace iso clean

all: iso

kernel:
	cd kernel && cargo build --release --target $(TARGET)

userspace:
	cd userspace && cargo build --release

iso: kernel userspace
	mkdir -p build/iso
	cp kernel/target/$(TARGET)/release/aios-kernel build/iso/
	cp userspace/target/release/* build/iso/
	grub-mkrescue -o aios-minimal.iso build/iso

clean:
	cargo clean
	rm -rf build/

5. 機能制限とトレードオフ

削除される機能

  • マルチコア対応
  • ACPI高度機能
  • グラフィカルデバッグ
  • 複雑なファイルシステム
  • ネットワーク機能

保持される機能

  • 基本的なプロセス管理
  • シンプルなファイルシステム
  • 最低限のメモリ管理
  • シリアル出力
  • 基本的なシステムコール

この設計により、128MB以下の極小OSを実現できます。