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 文件及入口地址等信息。

编译主要处理单个源文件,链接负责把它们组成一个地址关系完整的程序。