FreeBSDでkernelが/をマウントするところ

ざっくりメモ

mbr(boot0) -> boot1(pbr) -> boot2 -> loader -> kernel -> /etc/rcで,kernelが/をマウントするところを調べた.

  • cpu_set_fork_handler() → start_init() → vfs_mountroot() -> vfs_mountroot_try() -> kernel_mount() -> vfs_donmount() -> vfs_domount() -> 色々
  • start_init()
    • /usr/src/sys/kern/init_main.c
    • /をマウントして init を起動する
  • vfs_mountroot()
    • /usr/src/sys/kern/vfs_mount.c
    • boothowtoとかからブート方法を分岐
    • vfs.root.mountfromとかvfs.root.mountfrom.optionsとかを取得.
    • マウントポイントをvfs_mountroot_try()へ渡す
  • vfs_mountroot()
    • /usr/src/sys/kern/vfs_mount.c
    • vfs_mountroot_try() でマウント
      • vfs.root.mountfromをルートマウントとして選択
      • vfsnameとかを抽出してkernel_mount()に渡す
    • まずったら vfs_mountroot_ask()
  • kernel_mount()
    • vfs_donmount() -> vfs_domount()
  • vfs_donmount()
    • オプション解析
  • vfs_domount()
    • 実際にマウント
    • vfs_byname()
      • ffsじゃなかったらufs.nullを返すことも.此処の詳細な条件は不明
    • vfs_byname_kld()
      • vfs_bynameでnullだったらkern_kldload()する
    • kern_kldload()
      • kldlname.ko / kldname.ver.koをロード
      • linker_load_module() (/usr/src/sys/kern/kern_linker.c)
    • linker_load_module()
      • linker_search_module()でlinker_path("/boot/kernel;/boot/modules")から探す
  • /usr/src/sys/i386/i386/vm_machdep.c
    • set_cpu_fork_handler()はこちら
    • 良く解らん

参考: