登录/注册

自己动手写操作系统

更多

自己动手写操作系统:详细指南

要自己动手写一个操作系统,这是一个极具挑战性但收获巨大的项目。下面我将为您提供一个清晰的开发路径和基础代码示例,帮助您开始这段旅程。

核心步骤概览

  1. 环境准备:设置开发工具链(汇编器、C编译器、虚拟机)
  2. 引导程序(Bootloader):编写能在计算机启动时运行的最基础代码
  3. 内核基础:初始化CPU模式,建立基本运行环境
  4. 核心功能:实现基础服务(屏幕输出、中断处理等)
  5. 高级功能:添加内存管理、任务调度、文件系统等

环境准备

开始动手:引导加载程序

首先创建一个简单的引导加载程序(boot.asm):

org 0x7C00       ; 引导程序加载地址
bits 16          ; 实模式

start:
    ; 设置数据段寄存器
    xor ax, ax
    mov ds, ax

    ; 设置栈指针
    mov ss, ax
    mov sp, 0x7C00

    ; 清屏
    mov ax, 0x0003
    int 0x10

    ; 打印欢迎消息
    mov si, msg
    call print_string

    ; 挂起系统
    hlt

print_string:
    lodsb             ; 从si加载字符到al
    or al, al         ; 检查是否为字符串结尾(0)
    jz .done
    mov ah, 0x0E      ; BIOS显示函数
    int 0x10          ; 调用BIOS中断
    jmp print_string
.done:
    ret

msg db "MiniOS Bootloader", 0

times 510 - ($-$$) db 0 ; 填充剩余空间
dw 0xAA55             ; 引导扇区魔数

编译并运行

# 汇编引导程序
nasm -f bin boot.asm -o boot.bin

# 创建磁盘映像
dd if=/dev/zero of=disk.img bs=1024 count=1440
dd if=boot.bin of=disk.img conv=notrunc

# 在QEMU中运行
qemu-system-i386 -fda disk.img

内核基础(C语言部分)

下一步创建一个基本的内核(kernel.c):

// 屏幕输出函数
void kprint(const char* str) {
    volatile char* video = (volatile char*)0xB8000;

    while (*str) {
        *video++ = *str++;  // 字符
        *video++ = 0x0F;    // 白字黑底
    }
}

// 内核入口
void kmain() {
    kprint("MiniOS Kernel Running!");

    // 永久挂起
    while (1);
}

链接内核

编写链接脚本(linker.ld):

ENTRY(kmain)

SECTIONS {
    . = 0x1000; /* 内核加载地址 */

    .text : AT(0x1000) {
        *(.text)
    }

    .data : {
        *(.data)
    }

    .rodata : {
        *(.rodata)
    }

    .bss : {
        *(.bss)
    }
}

进阶功能实现

1. 全局描述符表(进入保护模式)

[bits 32]

setup_gdt:
    lgdt [gdt_descriptor]

    ; 设置数据段选择子
    mov ax, DATA_SEG
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax

    ; 设置代码段选择子并跳转到保护模式入口
    jmp CODE_SEG:init_pm

; GDT定义
gdt_start:
    ; 0号描述符(空描述符)
    dd 0x0
    dd 0x0

    ; 代码段描述符 (Index=1, RPL=0)
    dw 0xFFFF     ; 段界限 (0-15位)
    dw 0x0        ; 段基址 (0-15位)
    db 0x0        ; 段基址 (16-23位)
    db 10011010b  ; 访问字节
    db 11001111b  ; 标志位+段界限(16-19位)
    db 0x0        ; 段基址 (24-31位)

    ; 数据段描述符 (Index=2, RPL=0)
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10010010b
    db 11001111b
    db 0x0
gdt_end:

; GDT描述符
gdt_descriptor:
    dw gdt_end - gdt_start - 1  ; GDT大小
    dd gdt_start                ; GDT地址

2. 基础任务调度

struct Task {
    unsigned int esp;
    unsigned int pid;
    // 更多状态信息...
};

struct Task tasks[10];
volatile unsigned int current_task = 0;

void task_switch() {
    // 保存当前任务状态
    tasks[current_task].esp = read_esp();

    // 选择下一个任务
    current_task = (current_task + 1) % TASK_COUNT;

    // 恢复新任务状态
    write_esp(tasks[current_task].esp);
}

学习资源推荐

  1. 必读书籍

    • 《操作系统真相还原》- 郑钢
    • 《x86汇编语言:从实模式到保护模式》
    • 《Orange'S:一个操作系统的实现》
  2. 在线资源

    • OSDev Wiki (osdev.org) - 最全面的操作系统开发社区
    • MIT xv6开源项目 - 教学用现代操作系统
    • Linux 0.11内核源码
  3. 开发工具链

    • Bochs:带调试功能的虚拟机
    • GRUB:作为高级引导加载程序
    • GCC交叉编译工具链

调试技巧

  1. QEMU调试模式:

    qemu-system-i386 -s -S disk.img
  2. 使用GDB连接:

    gdb
    (gdb) target remote localhost:1234
    (gdb) break *0x7C00  # 在引导程序起始处断点

操作系统开发路线图

阶段 核心目标 关键技术
启动 引导加载程序 BIOS中断、实模式汇编
核心 基本内核 C语言、保护模式、内存映射
服务 系统功能 中断处理、内存管理、任务调度
驱动 硬件交互 PCI扫描、磁盘I/O、USB支持
管理 资源协调 文件系统、网络协议栈
应用 用户程序 系统调用、图形界面、Shell

开发操作系统的过程是从硬件底层到应用层逐步构建的过程,每一步都充满挑战但也收获颇丰。从一个简单的引导程序开始,逐步添加功能,最终你将拥有一个完全由你掌控的操作系统。祝您编程愉快!

聊聊操作系统

说到操作系统,大家都不会陌生。我们天天都在接触操作系统——用台式机或笔记本电脑,使用的是windows和macOS系统;用手机、平板电脑,则是a

2023-05-12 11:13:42

简述操作系统的保护机制

操作系统其实就是一个大管家,负责给应用程序搭建舞台,好让程序们过好自己的一生,但偏偏有不听话的程序可能想抢操作系统的戏,显然这会影响所有其它正在

2023-02-15 14:48:01

UCOSII操作系统的简介

前言这是我将UCOSII操作系统移植在STM32单片机上后进行UCOSII操作系统学习的一些笔记与理解,此文最后会附上我自己在UCOSII

2022-01-12 06:00:46

教你动手写网络协议栈-MQTT报文解析6-解析

首发:Rice 嵌入式开发技术分享作者:RiceDIY教你动手写网络协议栈系列文章1《教你动手写UDP协议栈-UDP协议栈格式》2《教你动手写U

资料下载 张艳 2022-01-25 18:12:39

Linux操作系统的CP命令源代码汇总

Linux操作系统的CP命令源代码汇总

资料下载 林冠宏 2021-08-04 16:08:55

机器人操作系统EtherCAT技术研究综述

机器人操作系统EtherCAT技术研究综述

资料下载 洪荒之力ZHH 2021-08-02 10:35:46

三宝机器人软件操作系统v2.20.33.100下载

三宝机器人软件操作系统v2.20.33.100下载

资料下载 kaderer 2021-07-12 10:26:40

UCOSII操作系统的一些使用程序详细资料说明

的时候。..。. 对于当时自己还没学的时候,一直很纳闷什么是操作系统哈,,是什么原因让人们去编写操作系统程序,,到底是为了解决什么问题,而写的

资料下载 佚名 2019-05-22 18:01:00

如何自己动手写嵌入式操作系统

自己动手写嵌入式操作系统 续上个帖子,今日主题是《电子工程师资料合集,多到你下不完》,有问题或者要获取全部资料可以加群一起交流:61337705

2021-12-22 07:02:41

uCOS-II实时操作系统实时操作系统与分时操作系统的区别是什么

、多任务管理调度、外围资源管理。主要是提供内核,外围很多东西用户自己写。1uCOS-II中的任务操作系统的内核的主要工作就是对任务进行管理和调度。一个任务相当于一个死循环,相当于一个线程。这个

2021-12-14 06:42:55

如何在 RT-Thread 操作系统上运行 Mnist Demo

上期回顾:(点此跳转上一期)本期将介绍如何在 RT-Thread 操作系统上运行 Mnist Demo(手写数字识别),可支持自己

2021-12-14 06:12:27

教你动手写UDP协议栈—DNS报文解析

教你动手写UDP协议栈系列文章序号内容1《教你动手写UDP协议栈-UDP协议栈格式》2《教你动手写UDP协议栈-DHCP报文解析》3《教你

2020-12-24 16:16:34

实时操作系统和非实时操作系统的区别

本文主要阐述了实时操作系统和非实时操作系统的区别。

2020-09-02 15:58:31

基于linux的十大操作系统排名

众多的版本中找到自己需要的操作系统呢?下面小编介绍了基于linux的十大操作系统排名,大家可以从中找到

2020-07-10 16:23:27

中国人自己操作系统 鸿蒙系统正式发布

8月9日消息,华为在今日下午的华为开发者大会上正式发布自有操作系统:鸿蒙。鸿蒙操作系统是全世界第一个基于微内核的全场景分布式OS,今年首发的智慧屏将率先使用鸿蒙OS 1.0。

2019-08-09 17:52:26

7天热门专题 换一换
相关标签