📁 xv6 项目目录结构说明(基于 xv6-riscv)


省流

.
├── kernel
│   ├── bio.c             // 块缓存(buffer cache)实现
│   ├── buf.h             // buffer cache 相关结构体定义
│   ├── console.c         // 控制台输入输出处理
│   ├── defs.h            // 各种函数声明汇总
│   ├── elf.h             // ELF 格式定义(用于程序加载)
│   ├── entry.S           // 内核入口汇编代码
│   ├── exec.c            // 程序加载执行(exec 系统调用)
│   ├── fcntl.h           // 文件控制选项定义,如 O_RDWR 等
│   ├── file.c            // 文件描述符管理
│   ├── file.h            // 文件结构体定义
│   ├── fs.c              // 文件系统核心逻辑(inode 读写等)
│   ├── fs.h              // 文件系统相关结构体定义
│   ├── kalloc.c          // 物理页分配器(内存分配)
│   ├── kernel.ld         // 内核链接脚本,定义段和地址
│   ├── kernelvec.S       // 内核中断向量入口
│   ├── log.c             // 文件系统日志(write-ahead log)
│   ├── main.c            // 内核主函数(启动初始化)
│   ├── memlayout.h       // 内存布局定义(用户段/内核段等)
│   ├── param.h           // 各种内核参数,如进程数、文件数
│   ├── pipe.c            // 管道实现(用于进程通信)
│   ├── plic.c            // RISC-V 中断控制器驱动
│   ├── printf.c          // 内核 printf 实现
│   ├── proc.c            // 进程管理核心代码
│   ├── proc.h            // 进程结构体定义
│   ├── riscv.h           // RISC-V 寄存器等低层定义
│   ├── sleeplock.c       // 睡眠锁实现(文件系统用)
│   ├── sleeplock.h       // 睡眠锁结构体定义
│   ├── spinlock.c        // 自旋锁实现(中断上下文锁)
│   ├── spinlock.h        // 自旋锁结构体定义
│   ├── start.c           // C 层入口函数(从 entry.S 跳来)
│   ├── stat.h            // 文件状态结构(stat 系统调用用)
│   ├── string.c          // 常用字符串函数实现
│   ├── swtch.S           // 上下文切换汇编代码
│   ├── syscall.c         // 系统调用分发逻辑()
│   ├── syscall.h         // 系统调用编号定义
│   ├── sysfile.c         // 文件类系统调用实现
│   ├── sysproc.c         // 进程类系统调用实现
│   ├── trampoline.S      // 用户/内核切换 trampoline 代码
│   ├── trap.c            // 中断、异常和系统调用的处理
│   ├── types.h           // 基础类型定义(如 uint)
│   ├── uart.c            // 串口驱动(用于控制台输出)
│   ├── virtio_disk.c     // 虚拟磁盘驱动(VirtIO 接口)
│   ├── virtio.h          // VirtIO 设备定义
│   └── vm.c              // 虚拟内存管理(页表映射等)
├── LICENSE               // 授权协议
├── Makefile              // 构建 xv6 的主 Makefile
├── mkfs
│   └── mkfs.c            // 创建 xv6 文件系统映像工具
├── README                // 简要项目说明
└── user
    ├── cat.c             // 实现 cat 命令
    ├── echo.c            // 实现 echo 命令
    ├── forktest.c        // 测试 fork 的正确性
    ├── grep.c            // 实现 grep 命令
    ├── grind.c           // 随机测试文件系统的稳定性
    ├── init.c            // 第一个用户程序(PID 1)
    ├── initcode.S        // init 进程的最初机器码(嵌入内核)
    ├── kill.c            // 实现 kill 命令
    ├── ln.c              // 实现 ln 命令(硬链接)
    ├── ls.c              // 实现 ls 命令
    ├── mkdir.c           // 实现 mkdir 命令
    ├── printf.c          // 用户态 printf 实现
    ├── rm.c              // 实现 rm 命令
    ├── sh.c              // shell 实现(解释用户输入)
    ├── stressfs.c        // 压力测试文件系统
    ├── ulib.c            // 用户空间基础函数(如 malloc)
    ├── umalloc.c         // 用户态 malloc 分配器实现
    ├── user.h            // 用户程序头文件(声明 syscall 等)
    ├── user.ld           // 用户程序链接脚本
    ├── usertests.c       // 测试用例集合
    ├── usys.pl           // Perl 脚本生成 syscall stub
    ├── wc.c              // 实现 wc 命令(单词计数)
    └── zombie.c          // 僵尸进程测试程序


🔧 顶层目录(根目录)

文件/目录 作用与定位
Makefile 构建整个 xv6 系统,包括内核、用户程序和文件系统镜像(fs.img)
README 项目简要说明,实验提示(MIT 教学版本)
.gdbinit GDB 配置文件,方便调试内核
mkfs/mkfs.c 构建 xv6 文件系统映像,预写入基本文件如 init

📁 kernel/(内核源码)🧠

这是 xv6 的内核实现核心目录。

🧬 系统初始化与入口

文件 作用
main.c 内核启动函数 main(),初始化子系统,创建第一个进程 init
start.c 内核汇编入口点,设置栈,跳转到 main()
entry.S 机器启动点(裸机启动用),设置页表、内核栈、打开中断等

⚙️ 进程管理与调度

文件 作用
proc.c 实现进程表、调度器、上下文切换、创建(fork)、终止等
sched.h 定义 context、调度器状态

🧵 系统调用与陷入处理

文件 作用
syscall.c 系统调用号和内核函数映射表,执行调度器(系统调用分发器)
sysproc.c 实现通用系统调用(exit, fork, wait, sleep, getpid, sbrk 等)
trap.c 用户态 -> 内核态的异常/中断/系统调用处理
trap.h 定义 trapframe 等中断/陷入结构

🧠 虚拟内存与物理内存

文件 作用
vm.c 虚拟内存管理,包括页表建立、切换、拷贝(uvmcreate, uvmcopy 等)
kalloc.c 管理空闲物理内存页,简单的页分配器(freelist 结构)
memlayout.h 定义虚拟内存空间布局,如 user stack/kernel stack/trapframe 等
riscv.h RISC-V 寄存器 / 页表 / trap CSR 操作宏等定义

📦 文件系统与 I/O

文件 作用
fs.c 文件系统实现:inode 分配、读写、路径解析、文件创建等
file.c 文件描述符层:打开/关闭文件、read/write 映射到 inode 操作
bio.c 块设备缓存管理(buffer cache)
log.c 日志型文件系统,确保崩溃一致性(journaling)
stat.h 定义文件元信息结构(mode, dev, inum 等)

📠 设备驱动与控制台

文件 作用
uart.c UART 串口驱动,字符输入输出
console.c 控制台交互,字符缓冲、命令行交互
plic.c 外部中断控制器(RISC-V 平台)
virtio_disk.c 虚拟磁盘设备驱动(QEMU 提供)
sysfile.c 文件相关系统调用封装(read, write, open, close 等)
pipe.c 管道(pipe)机制,进程间通信
sleeplock.c 睡眠锁,用于保护文件系统等慢速操作
spinlock.c 自旋锁,保护内核关键区

📁 user/(用户态程序)👤

用户空间的可执行程序和系统调用接口。

文件 作用
init.c 第一个用户态程序,启动 shell
sh.c xv6 的用户 shell,解释用户命令
usys.S 将用户调用转为系统调用陷入(ecall
user.h 所有系统调用声明(用户态用)
*.c 各种用户程序,如 cat, echo, ls, kill, sleep, forktest

📁 include/(头文件)📚

部分公共头文件可能单独存在该目录(有些版本不分目录)

文件 作用
param.h 系统全局配置:最大进程数、文件数、块大小等
types.h 常用数据类型定义
fcntl.h 文件控制选项,如 O_RDONLY, O_CREATE
stat.h 文件状态结构
defs.h 各种函数原型声明(内核使用)

📌 总结结构图(逻辑视图)

        +---------------------+
        |      用户态程序     |
        |  (user/*.c, usys.S) |
        +----------+----------+
                   |
            系统调用陷入 syscall
                   ↓
        +----------+----------+
        |   内核系统调用接口  |
        |  (syscall.c, sysproc.c, sysfile.c)  |
        +----------+----------+
                   |
        +----------+----------+
        | 内核子系统(调度、VM、FS、驱动) |
        +----------+----------+
                   |
            访问硬件资源(QEMU)

如果你对哪一部分模块(比如:trap流程、调度器、fs路径解析、页表构建)想进行深入源码分析,我可以为你画图、流程、并逐行代码带你剖析 👍