Mac OS X 启动过程中发生了什么?

Anonim

有没有想过在Mac OS X 引导和启动过程中会发生什么?对于 Mac OS X,它比以前复杂了一点,经典 Mac OS(System 9、8、7、6)的日子早已一去不复返了,在其中看着我们的 Mac 启动时带有一系列扩展和控制面板,我们总是可以单独通过它们的图标来识别,然后在 Extensions 文件夹中四处挖掘,轻松调整 Mac 启动时加载和发生的内容。今天在 Mac OS X 的 Unix 基础上,许多用户完全不知道幕后发生了什么。

那么在Mac OS X 启动过程中到底发生了什么?通过在详细模式下启动 Mac,您总是可以获得更好的外观,但这并不一定能解释您所看到的所有内容。幸运的是,通过 KernelThread 的 segment 可以获得一个很好的解释,它仔细地列出了 Mac OS X 引导事件的顺序,从开始到结束。它相当详尽,值得一读,下面为好奇的 Mac 用户重复了一遍。

ote:有读者指出,PPC使用OF(Openfirmware),i386使用EFI(Extensible Firmware Interface)

那么在Mac OS X 启动过程中会发生什么?你打开你的 Mac,会发生这样的事情:

  • 电源已打开。
  • OF或EFI代码被执行。
  • 收集硬件信息,初始化硬件。
  • Something(通常是操作系统,但也包括Apple Hardware Test 等)被选中启动。系统可能会提示用户选择要引导的内容。
  • 控制传递给/System/Library/CoreServices/BootX,引导加载程序。 BootX 加载内核并绘制操作系统标志(如果有)。
  • BootX 尝试加载以前缓存的设备驱动程序列表(由/usr/sbin/kextcache 创建/更新)。这种缓存的类型为mkext,包含多个内核扩展的信息字典和二进制文件。请注意,如果 mkext 缓存已损坏或丢失,BootX 将在 /System/Library/Extensions 中查找当前场景所需的扩展(由OSBundleRequired​​ 扩展包的Info.plist 文件中 属性的值。
  • init内核的例程被执行。确定引导系统的根设备。此时Firmware就不能访问了
  • 各种Mach/BSD数据结构由内核初始化。
  • I/O Kit初始化
  • 内核启动/sbin/mach_init,Mach服务命名(引导)守护进程。 mach_init维护服务名称和提供对这些服务的访问的Mach端口之间的映射。

从这里开始,启动变成用户级:

  • mach_init 启动/sbin/init,传统的BSD初始化进程。 init确定运行级别,并运行/etc/rc.boot,设置机器足以运行单用户。

在其执行过程中,rc。boot 和其他rc 脚本源/etc/rc.common ,一个包含实用函数的shell脚本,例如CheckForNetwork()(检查网络是否正常),GetPID (), purgedir()(仅删除目录内容,不删除结构)等

  • rc.boot 确定引导类型(多用户、安全、CD-ROM、网络等)。在网络引导的情况下(sysctl变量kern.netboot将设置为 1 在这种情况下),它运行/etc/rc.netboot start参数。

/etc/rc.netboot处理网络启动的各个方面。例如,它执行网络和(如果有的话)本地挂载。它还调用/usr/bin/nbst将影子文件与用作根设备的磁盘映像相关联。这个想法是将写入重定向到影子文件,希望它在本地存储上。

  • rc.boot 确定是否需要文件系统一致性检查。单用户和 CD-ROM 引导不运行 fsck。 SafeBoot 始终运行 fsck。 rc.boot也处理fsck的返回状态。
  • 如果rc.boot退出成功,/etc/rc ,然后运行多用户启动脚本。如果从 CD-ROM 引导,脚本将切换到/etc/rc.cdrom(安装)。
  • /etc/rc挂载本地文件系统(HFS+、HFS、UFS、/dev/ fd​​,/.vol),确保目录/private/var/tmp 存在,并运行/etc/rc.installer_cleanup,如果存在(由安装程序在重启前留下)。
  • /etc/rc.cleanup 已运行。它“清理”了一些 Unix 和 Mac 特定的目录/文件。
  • 启动缓存
  • 各种sysctl设置了变量(例如最大vnode数、System V IPC等)。如果/etc/sysctl.conf存在(加上/etc/sysctl-macosxserver.conf在 Mac OS X Server 上),它被读取并设置sysctl其中包含的变量。
  • syslogd​​已启动。
  • Mach符号文件创建
  • /etc/rc启动kextd​​,守护进程从内核或客户端进程按需加载内核扩展。
  • /usr/libexec/register_mach_bootstrap_servers 运行以加载/ 中包含的各种基于Mach 引导程序的服务etc/mach_init.d​​
  • portmapnetinfo已启动。
  • 如果/System/Library/Extensions.mkext/System/Library/Extensions旧/etc/rc删除现有的mkext并创建一个新的。如果一个不存在,它也会创建一个。
  • /etc/rc 开始/usr/sbin/update ,频繁刷新内部文件系统缓存到磁盘的守护进程。
  • /etc/rc启动虚拟内存系统。 /private/var/vm设置为交换目录。 /sbin/dynamic_pager以适当的参数开始(交换文件名路径模板、创建的交换文件的大小、指定何时创建额外交换的高低水位警报触发器文件或删除现有文件)。
  • /etc/rc开始/usr/libexec/fix_prebinding修复错误的预绑定二进制文件。
  • /etc/rc执行/etc/rc.cleanup清理和重置文件和设备。
  • /etc/rc终于启动/sbin/SystemStarter处理来自/System/Library/StartupItems/Library/StartupItems 等位置的启动项StartupItem 是一个程序,通常是一个 shell 脚本,其名称与文件夹名称相匹配。该文件夹包含一个包含键值对的属性列表文件,例如DescriptionProvidesRequiresOrderPreference、启动/停止消息等。您可以运行 SystemStarter -n -D 以根用户身份让程序打印调试和依赖信息(实际上没有运行任何东西)。
  • CoreGraphics启动项启动Apple Type Services守护进程(ATSServer ) 以及窗口服务器(WindowServer)。

然后你的Mac就启动了!

您可以使用详细模式自己看到一些此活动(您可以在每次启动时进入详细模式,或者如果您希望始终看到,您甚至可以将 Mac 设置为始终以详细模式启动unix风格的引导),但这是一个非常详尽的解释。

Apple 还提供了一些有关 Mac 启动过程的文档,可在此处的开发人员文档库中找到。

注意提供上述信息的原始URL 不再有效,因此该帖子已包含在上方以供后代通过缓存使用。原始来源是 KernelThread 上的一个线程,网址如下:http://www.kernelthread.com/mac/osx/arch_startup.html 目前处于离线状态,不会重定向到新位置。

如果您有任何花絮或其他补充要添加到Mac OS X 启动顺序,请在评论中分享!

Mac OS X 启动过程中发生了什么?