Mac OS X 启动过程中发生了什么?
有没有想过在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
portmap
和netinfo已启动。
- 如果
/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 脚本,其名称与文件夹名称相匹配。该文件夹包含一个包含键值对的属性列表文件,例如Description
、Provides
、Requires
、OrderPreference
、启动/停止消息等。您可以运行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 启动顺序,请在评论中分享!