用c语言实现一个简单的操作系统(只有几个简单的模块)

本文介绍了如何使用C语言实现一个简单的操作系统,包括内存管理(使用memory数组模拟内存分配和释放)、文件操作(通过createFile和diskDriver函数)以及进程管理。重点展示了allocateMemory和diskDriver函数的使用。
摘要由CSDN通过智能技术生成

使用 memory 数组来模拟系统内存,MEMORY_SIZE 宏定义了内存的大小。allocateMemory 函数用于分配内存块,freeMemory 函数用于释放内存块(但在这个简单的示例中,freeMemory 函数没有实际功能)。nextAvailableIndex 变量跟踪下一个可用内存块的索引。

并且添加了 diskDriver 函数,模拟了简单的磁盘设备驱动程序。这个函数接受文件名、操作类型和缓冲区作为参数,然后执行相应的操作。在主函数中,我们使用 diskDriver 函数来读取文件内容并显示,以及写入文件内容。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
#include <windows.h> // 包含Windows API函数
#endif

// 进程结构体
typedef struct {
    int pid;
    char name[50];
    int priority;
} Process;

// 文件结构体
typedef struct {
    char name[50];
    int size;
    char content[1000];
} File;

// 文件系统
File files[50];
int fileCount = 0;

// 进程数组
Process processes[50];
int processCount = 0;

// 内存大小
#define MEMORY_SIZE 1024
char memory[MEMORY_SIZE];

// 下一个可用内存块的索引
int nextAvailableIndex = 0;

// 创建文件
void createFile(char name[], char content[]) {
    File newFile;
    strcpy(newFile.name, name);
    strcpy(newFile.content, content);
    newFile.size = strlen(content);
    files[fileCount++] = newFile;
}

// 创建进程
void createProcess(char name[], int priority) {
    Process newProcess;
    newProcess.pid = processCount;
    strcpy(newProcess.name, name);
    newProcess.priority = priority;
    processes[processCount++] = newProcess;
}

// 分配内存
void *allocateMemory(int size) {
    if (nextAvailableIndex + size > MEMORY_SIZE) {
        printf("Error: Out of memory\n");
        return NULL;
    }

    void *ptr = &memory[nextAvailableIndex];
    nextAvailableIndex += size;
    return ptr;
}

// 释放内存
void freeMemory(void *ptr) {
    // 内存释放暂不实现
}

// 设备驱动程序:简单磁盘驱动程序
void diskDriver(char *filename, int operation, char *buffer) {
    if (operation == 0) { // 读取文件
        FILE *file = fopen(filename, "r");
        if (file == NULL) {
            printf("Error: Unable to open file '%s'\n", filename);
            return;
        }
        fread(buffer, sizeof(char), MEMORY_SIZE, file);
        fclose(file);
    } else if (operation == 1) { // 写入文件
        FILE *file = fopen(filename, "w");
        if (file == NULL) {
            printf("Error: Unable to open file '%s'\n", filename);
            return;
        }
        fwrite(buffer, sizeof(char), strlen(buffer), file);
        fclose(file);
    } else {
        printf("Error: Invalid operation\n");
    }
}

// 设置文本颜色
void setTextColor(int color) {
#ifdef _WIN32
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
#endif
}

int main() {
    setTextColor(11); // 设置文本颜色为青色

    printf("Welcome to Simple OS!\n");

    // 创建文件
    createFile("file1.txt", "This is file 1 content.");
    createFile("file2.txt", "This is file 2 content.");
    
    // 创建进程
    createProcess("Process 1", 1);
    createProcess("Process 2", 2);
    
    // 显示文件列表
    setTextColor(14); // 设置文本颜色为黄色
    printf("\nFiles:\n");
    for (int i = 0; i < fileCount; ++i) {
        printf("%s\n", files[i].name);
    }
    
    // 显示进程列表
    setTextColor(14); // 设置文本颜色为黄色
    printf("\nProcesses:\n");
    for (int i = 0; i < processCount; ++i) {
        printf("PID: %d, Name: %s, Priority: %d\n", processes[i].pid, processes[i].name, processes[i].priority);
    }

    // 分配内存并测试
    char *ptr1 = allocateMemory(100);
    strcpy(ptr1, "This is memory block 1.");
    setTextColor(10); // 设置文本颜色为绿色
    printf("\nMemory block 1: %s\n", ptr1);

    char *ptr2 = allocateMemory(200);
    strcpy(ptr2, "This is memory block 2.");
    printf("Memory block 2: %s\n", ptr2);

    // 测试设备驱动程序
    char readBuffer[MEMORY_SIZE];
    diskDriver("file1.txt", 0, readBuffer); // 读取文件
    setTextColor(14); // 设置文本颜色为黄色
    printf("\nContent of file1.txt: %s\n", readBuffer);

    diskDriver("file3.txt", 1, "This is file 3 content."); // 写入文件

    return 0;
}

问题结果:如果编译不通过,则改成c99模式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值