企业资质证书查询官方网站,外贸建站系统源码,湖南有实力seo优化哪家好,襄阳网站建设八零后前言#xff1a; 相信每个自学操作系统的同学#xff0c;大致学习路线都离不开 HIT-OS、MIT-6.S081、MIT-6.824、MIT-6.828等经典的公开课。但学习完这些经典公开课并完成相应的Lab#xff0c;很多同学脑海中对于操作系统的知识其实都是零散的#xff0c;让你从头开始编写一…前言 相信每个自学操作系统的同学大致学习路线都离不开 HIT-OS、MIT-6.S081、MIT-6.824、MIT-6.828等经典的公开课。但学习完这些经典公开课并完成相应的Lab很多同学脑海中对于操作系统的知识其实都是零散的让你从头开始编写一个操作系统我相信大部分人还是无从下手。因为Lab只是修改相应的核心模块对于整体系统的组织、模块间的处理等细节往往没有人去关注也就是说我们还需要进一步把这些概念串起来、巩固起来。那么我相信大部分人都有过一个想法“我能不能自己写一个操作系统”这可能是大部分操作系统开发人员的梦想吧。 因此本项目将展示如何从零开始使用 ANSI C 编写出一个基于 64 位 RISC-V 架构的操作系统——Jokerix该系统支持在内核上运行用户态User/Application mode的终端并输入命令执行其他程序。 源码公开Joker001014/Jokerix (github.com) 目录 0 前置知识 【Create my OS】0 前置知识 | JokerDebug (joker001014.github.io) 0.1 RISC-V硬件机制0.2 RISC-V 汇编0.3 SBI 规范0.4 GDB 调试0.5 Jokerix 体系结构0.6 实验环境1 最小内核 【Create my OS】1 最小内核 | JokerDebug (joker001014.github.io) 1.1 内核入口点1.2 生成内核镜像1.3 使用 QEMU 运行1.4 封装 SBI接口2 开启中断 【Create my OS】2 开启中断 | JokerDebug (joker001014.github.io) 2.1 RISC-V 中断机制2.2 触发断点2.3 中断上下文2.4 开启时钟中断3 内存管理 【Create my OS】3 内存管理 | JokerDebug (joker001014.github.io) 3.1 Buddy System3.2 动态内存分配3.3 内存按页分配框架3.4 基于线段树的页帧分配4 虚拟内存 【Create my OS】4 虚拟内存 | JokerDebug (joker001014.github.io) 4.1 Sv39内核映射4.2 实现页表4.3 内核重映射5 内核线程 【Create my OS】5 内核线程 | JokerDebug (joker001014.github.io) 5.1 线程切换5.2 构造线程结构5.3 从启动线程到新线程6 线程调度 【Create my OS】6 线程调度 | JokerDebug (joker001014.github.io) 6.1 线程管理6.2 调度线程6.3 Round-Robin 调度算法6.4 调度测试7 用户线程 【Create my OS】7 用户线程 | JokerDebug (joker001014.github.io) 7.1 创建用户程序7.2 实现系统调用7.3 进程内存空间7.4 创建用户进程8 文件系统 【Create my OS】8 文件系统 | JokerDebug (joker001014.github.io) 8.1 SimpleFS8.2 打包镜像8.3 内核文件驱动8.4 文件系统测试9 实现终端 【Create my OS】9 实现终端 | JokerDebug (joker001014.github.io) 9.1 键盘中断9.2 条件变量与输入缓冲9.3 echo 程序9.4 实现终端编写代码文件时间线
步骤功能文件斜体表示二次修改1CPU自检跳转到Bootloader/2将内核代码从磁盘加载到内存Bootloader由OpenSBI提供把 CPU 从 M-Mode 切换到 S-Mode并跳转到一个固定的地址 0x80200000 处/3编写内核入口点设置OS启动栈跳转到main.c执行kernel/entry.Skernel/main.c4将entry.S和main.c 编译和链接生成ELF文件需存放在0x80200000进一步生成二进制镜像文件Makefilekernel/kernel.ld5QEMU加载镜像文件至此成功运行操作系统。/6封装SBI接口ecall调用SBI接口实现 printf 功能kernel/sbi.hkernel/printf.c7封装CSR读写初始化中断处理程序入口设置断点中断处理程序kernel/riscv.hkernel/interrupt.c8保存和恢复中断上下文信息kernel/context.hkernel/interrupt.S9初始化开启时钟中断设置时钟中断处理程序kernel/timer.ckernel/interrupt.c10基于二叉树的动态内存分配采用Buddy System Allocation算法kernel/heap.ckernel/consts.h11基于线段树的页帧分配kernel/memory.c12设置页表将内核运行在虚拟地址空间kernel/kernel.ldkernel/entry.S13实现三级页表将内核各个段映射到页表上kernel/mapping.c14借助中断恢复机制创建内核线程及线程上下文切换kernel/thread.ckernel/switch.Skernel/context.h15线程管理框架创建调度线程kernel/processor.ckernel/thread.c16实现Round-Robin线程调度算法kernele/rrscheduler.c17实现系统调用user/syscall.h18实现用户态printf、动态内存分配、用户程序入口点、用户测试函数user/io.cuser/malloc.cuser/entry.cuser/ulib.huser/hello.c19编译用户程序并链接将用户程序合并到内核user/Makefileuser/linkUser.asm20处理用户态系统调用kernel/interrupt.ckernel/syscall.c21编译的用户程序为ELF文件实现ELF文件加载和内存映射kernel/elf.ckernel/mapping.c22创建用户线程结构创建用户栈、创建内核栈、创建上下文kernel/thread.ckernel/mapping.c23打包生成文件系统镜像fs.img将文件系统内容合并到内核mkfs/mksfs.cmkfs/simplefs.hkernel/linkFS.asmMakefile24从文件系统中找到 Inode加载 ELF 文件数据到字节数组中kernel/fs.ckernel/main.ckernel/thread.c25处理键盘中断实现条件变量维护等待线程队列kernel/queue.ckernel/condition.ckernel/interrupt.ckernel/mapping.ckerne/processor.c26标准输入缓冲区维护缓存内容和条件变量kernel/stdin.c