📁 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路径解析、页表构建)想进行深入源码分析,我可以为你画图、流程、并逐行代码带你剖析 👍