Files
CMLeonOS/Kernel.cs
2026-01-31 14:01:50 +08:00

179 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Sys = Cosmos.System;
namespace CMLeonOS
{
public class Kernel : Sys.Kernel
{
// 创建全局CosmosVFS实例
Sys.FileSystem.CosmosVFS fs = new Sys.FileSystem.CosmosVFS();
private Shell shell;
private UserSystem userSystem;
// 修复模式变量(硬编码,用于控制是否启用修复模式)
public static bool FixMode = false;
protected override void BeforeRun()
{
Console.Clear();
Console.WriteLine(@" ____ __ __ _ ___ ____ ");
Console.WriteLine(@" / ___| \/ | | ___ ___ _ __ / _ \/ ___| ");
Console.WriteLine(@" | | | |\/| | | / _ \/ _ \| '_ \| | | \___ \ ");
Console.WriteLine(@" | |___| | | | |__| __/ (_) | | | | |_| |___) |");
Console.WriteLine(@" \____|_| |_|_____\___|\___/|_| |_|____/|____/ ");
Console.WriteLine();
Console.WriteLine("CMLeonOS Test Project");
Console.WriteLine("By LeonOS 2 Developement Team");
// 注册VFS
try
{
Sys.FileSystem.VFS.VFSManager.RegisterVFS(fs);
Console.WriteLine("VFS initialized successfully");
// 显示可用空间(动态单位)
var available_space = fs.GetAvailableFreeSpace(@"0:\");
string spaceWithUnit = FormatBytes(available_space);
Console.WriteLine("Available Free Space: " + spaceWithUnit);
// 显示文件系统类型
var fs_type = fs.GetFileSystemType(@"0:\");
Console.WriteLine("File System Type: " + fs_type);
// 删除默认示例文件和文件夹
try
{
// 删除示例文件
if (System.IO.File.Exists(@"0:\example.txt"))
{
System.IO.File.Delete(@"0:\example.txt");
Console.WriteLine("Deleted example.txt");
}
// 删除示例文件夹
if (System.IO.Directory.Exists(@"0:\example"))
{
System.IO.Directory.Delete(@"0:\example", true);
Console.WriteLine("Deleted example directory");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error deleting example files: {ex.Message}");
}
// 初始化用户系统
userSystem = new UserSystem();
// 第一次启动,设置管理员密码
if (!userSystem.IsPasswordSet)
{
userSystem.SetAdminPassword();
}
// 后续启动,需要登录
else
{
// 循环直到登录成功
while (!userSystem.Login())
{
// 登录失败,继续尝试
}
}
// 登录成功后初始化Shell
shell = new Shell();
// 检查并执行启动脚本
ExecuteStartupScript();
// 系统启动完成,蜂鸣器响一声
Console.Beep();
}
catch (Exception ex)
{
Console.WriteLine($"Error initializing system: {ex.Message}");
}
}
private void ExecuteStartupScript()
{
string startupFilePath = @"0:\sys\startup.cm";
try
{
// 检查启动脚本文件是否存在
if (System.IO.File.Exists(startupFilePath))
{
// 读取启动脚本内容
string[] lines = System.IO.File.ReadAllLines(startupFilePath);
// 检查文件是否为空
if (lines.Length == 0 || (lines.Length == 1 && string.IsNullOrWhiteSpace(lines[0])))
{
Console.WriteLine("Startup script is empty, skipping...");
return;
}
Console.WriteLine("Executing startup script...");
Console.WriteLine("--------------------------------");
// 逐行执行命令
foreach (string line in lines)
{
// 跳过空行和注释行
if (string.IsNullOrWhiteSpace(line) || line.Trim().StartsWith("#"))
{
continue;
}
// 执行命令
Console.WriteLine($"Executing: {line}");
shell.ExecuteCommand(line);
}
Console.WriteLine("--------------------------------");
Console.WriteLine("Startup script execution completed.");
}
else
{
// 启动脚本不存在,创建空文件
Console.WriteLine("Startup script not found, creating empty file...");
System.IO.File.WriteAllText(startupFilePath, "");
Console.WriteLine("Created empty startup script at: " + startupFilePath);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error executing startup script: {ex.Message}");
}
}
private string FormatBytes(long bytes)
{
string[] units = { "B", "KB", "MB", "GB", "TB" };
int unitIndex = 0;
double size = bytes;
while (size >= 1024 && unitIndex < units.Length - 1)
{
size /= 1024;
unitIndex++;
}
return $"{size:F2} {units[unitIndex]}";
}
protected override void Run()
{
if (shell != null)
{
shell.Run();
}
}
}
}