xv6项目结构
项目总结
这个项目是 32 位 x86 版 xv6 操作系统。理解它的编译和链接,先记住:同一个目录里的代码,最终会在不同环境、不同启动阶段执行。
例如,mkfs.c 编译后在你的 Linux 上运行;bootmain.c 在机器启动时运行;main.c 在 xv6 内核中运行;sh.c 则在 xv6 用户进程中运行。它们不能全部按一种方式链接。
下面结合当前项目说明。
先看整个构建关系。
flowchart TD
A["bootasm.S + bootmain.c"] --> B["bootblock.o:带符号的 ELF"]
B --> C["bootblock:512 字节启动扇区"]
D["内核 C / 汇编文件"] --> E["kernel:内核 ELF"]
F["initcode / entryother 裸二进制"] --> E
C --> G["xv6.img:启动盘"]
E --> G
H["用户程序 + 用户库"] --> I["_init / _sh / _ls 等"]
J["mkfs.c"] --> K["mkfs:Linux 上运行的工具"]
I --> L["fs.img:xv6 文件系统盘"]
K --> L
G --> M["QEMU 启动 xv6"]
L --> M
链接器负责:
- 找到函数和变量的定义,解决文件之间的引用。
- 合并各文件的代码、只读数据、可写数据等内容。
- 按链接规则分配地址,并修正指令中的地址引用。
- 写出最终 ELF 文件及入口地址等信息。
编译主要处理单个源文件,链接负责把它们组成一个地址关系完整的程序。