Mac OS X技术内幕/清华计算机图书译丛

Mac OS X技术内幕/清华计算机图书译丛
作者: (美)阿米特·辛格|译者:陈宗斌
出版社: 清华大学
原售价: 268.00
折扣价: 190.30
折扣购买: Mac OS X技术内幕/清华计算机图书译丛
ISBN: 9787302509097

作者简介

内容简介

第5章 内核和用户级启动   在第4章中已经介绍过,Open Firmware把控制交给Mac OS X引导加载程序BootX,它将在Mac OS X内核可以开始执行之前就执行多种操作。本章将从此处开始继续讨论,其中内核将接替BootX的工作。本章将讨论在内核启动期间所发生的重要事件,访问多个内核子系统,查看它们是怎样初始化的,查看内核如何启动第一个用户空间的程序,以及探讨用户级启动的细节——直到此时,系统将为用户做好准备。在这个过程中,将遇到迄今为止在本书中尚未介绍的众多概念和术语。在这层意义上,本章就构成了许多隐含或明确的向前参考。   要理解系统启动,最有成效的方法也许是参考Darwin源代码——尤其是xnu包——以及本章内容。认识到Mac OS X内核是一个不断演进的实体很重要:它的内部细节跨修订版本在不断改变,有时甚至会极大地改变。   在本章中,将把内核函数的名称与实现它们的文件的路径名关联起来。例如,_start()[osfmk/ppc/start.s]意味着函数_start()是在内核源文件树中的osfmk/ppc/start.s文件中实现的。除非另外指出,否则所有的路径名都相对于内核源文件树的根目录,它通常被命名为xnu-x.y.z,其中x、y和z是内核的版本号的组成部分。引用函数及其实现文件的重要目的是允许轻松地查找更多的信息。而且,可以查看调用者和被调用者属于内核的哪些部分。路径前缀的示例有:osfmk(Mach)、bsd(BSD)、iokit(I/O Kit)、libkern(I/O Kit内核库)、libsa(独立库)和pexpert(Platform Expert)。 5.1 安排内核执行   Mac OS X内核是一个Mach-O可执行文件,默认作为/mach_kernel驻留在引导卷上。回忆第4章可知,我们使用otool程序检查内核可执行文件,以确定内核的入口点。在编译内核时,最终的链接阶段将安排可执行文件的多个方面,具体如下。 * 将可执行文件的入口点设置为_start()[osfmk/ppc/start.s]。Mach-O头部中的LC_UNIXTHREAD加载命令在线程状态的SRR0寄存器中包含入口点的值。 * 将__VECTORS段的地址设置为0x0。 * 将__HIB段的地址设置为0x7000,这个段用于实现休眠。 * 将__TEXT段的地址设置为0xe000。 * __TEXT段中的__text区域将其对齐方式设置为0x1000(4096字节)。 * __DATA段中的__common区域将其对齐方式设置为0x1000(4096字节)。 * __DATA段中的__bss区域将其对齐方式设置为0x1000(4096字节)。 * 在__PRELINK段中创建__text区域(利用/dev/null的内容——即没有内容)。类似地,在__PRELINK段中通过/dev/null创建__symtab和__info区域。 5.1.1 异常和异常矢量   __VECTORS段包含内核的异常矢量。如第4章中所述,在调用内核前,BootX将把它们复制到指定的位置——从地址0x0开始。这些矢量是在osfmk/ppc/lowmem_ vectors.s中实现的。表5-1概述了PowerPC异常,其中大多数都受一种或多种条件支配。例如,仅当启用地址转换时,由失败的实际地址-虚拟地址转换导致的异常才会发生。而且,大多数异常仅当没有更高优先级的异常存在时才会发生。 表5-1 PowerPC异常 矢量偏移量 异 常 xnu中断(“rupt”)代码 原因/注释 0x0100 系统复位 T_RESET 硬或软处理器复位。这种异常不可屏蔽并且是异步的 0x0200 机器检查 T_MACHINE_CHECK 多种原因:L1缓存、TLB或SLB中的奇偶校验错误检测;L2缓存中无法校正的ECC错误检测;等等。也许可恢复,也许不能 0x0300 数据访问 T_DATA_ACCESS 页错误或者错误的数据内存访问,比如具有无效内存权限的操作 0x0380 数据段 T_DATA_SEGMENT 存储位置的实际地址无法转换成虚拟地址 0x0400 指令访问 T_INSTRUCTION_ACCESS 类似于数据访问异常,但是用于指令 0x0480 指令段 T_INSTRUCTION_SEGMENT 要执行的下一条指令的实际地址无法转换成虚拟地址 0x0500 内部中断 T_INTERRUPT 通过外部中断输入信号断言 0x0600 对齐 T_ALIGNMENT 多种与对齐相关的原因:例如,某些加载/存储指令遇到错误对齐的操作数 0x0700 程序 T_PROGRAM 多种原因:例如,浮点异常,或者由于执行非法或特权指令而导致的异常 0x0800 浮点不可用 T_FP_UNAVAILABLE 浮点单元不可用或者被禁用 0x0900 减量器 T_DECREMENTER 减量器为负 0x0a00 I/O控制器接口错误 T_IO_ERROR 在Mac OS X上未使用 0x0b00 保留 T_RESERVED — 0x0c00 系统调用 T_SYSTEM_CALL 执行系统调用(sc)指令 0x0d00 跟踪 T_TRACE 启用单步跟踪或分支跟踪,并且成功完成指令 0x0e00 浮点辅助 T_FP_ASSIST 浮点计算需要软件辅助 ??????????????????????????????????????? ? 续表?? 矢量偏移量 异 常 xnu中断(“rupt”)代码 原因/注释 0x0f00 性能监视器 T_PERF_MON 多种性能监视异常状况 0x0f20 矢量处理单元不可用 T_VMX VMX不可用或者被禁用 0x1000 指令转换失效 T_INVALID_EXCP0 在Mac OS X上未使用 0x1100 数据加载转换失效 T_INVALID_EXCP1 在Mac OS X上未使用 0x1200 数据存储转换失效 T_INVALID_EXCP2 在Mac OS X上未使用 0x1300 指令地址断点 T_INSTRUCTION_BKPT 970FX只通过支持处理器的接口来支持这种特性 0x1400 系统管理 T_SYSTEM_MANAGEMENT 依赖于实现 0x1500 软补丁 T_SOFT_PATCH 根据实现的软补丁工具发出特殊的异常成因内部操作。用于处理有缺陷的指令以及用于调试 0x1600 AltiVec Java模式辅助/维护 T_ALTIVEC_ASSIST 依赖于实现的维护异常 0x1700 AltiVec Java模式辅助/热量 T_THERMAL 当在AltiVec Java模式下操作时反规范化输入操作数或者操作的结果 0x1800 热(64位) T_ARCHDEP0 通过热中断输入信号发出通知 0x2000 仪器 T_INSTRUMENTATION 在Mac OS X上未使用 0x2100 VMM超快路径 — 为Mac OS X内核中的虚拟机监视器(VMM)a工具过滤超快路径系统调用。在Mac OS X 10.4中未使用   a. 在6.9节中将讨论VMM工具。   Mac OS X内核中的大多数硬件异常都是通过一个公共异常处理例程(exception_entry() [osfmk/ppc/lowmem_vectors.s])引导的。指定的异常处理程序保存GPR13和GPR11,在GPR11中设置“rupt”代码,并且跳转到exception_entry。例如,下面显示了T_INSTRUCTION_ACCESS的异常处理程序。 . = 0x400 .L_handler400: mtsprg 2,r13 ; Save R13 mtsprg 3,r11 ; Save R11 li r11,T_INSTRUCTION_ACCESS ; Set rupt code b .L_exception_entry ; Join common   注意:表5-1中的多个异常可能“什么也不做”,这取决于使用的硬件、是否在调试内核以及其他因素。    5.1.2 内核符号   另外两个相关的文件通常存在于根卷上:/mach.sym和/mach。/mach.sym文件包含来自当前运行的内核中的符号,它打算由需要访问内核数据结构的程序使用。在一些情况下,磁盘上的内核可执行文件可能并不对应于正在运行的内核——例如,在网络引导的情况下。事实上,根文件系统上甚至可能不存在内核可执行文件。为了解决这个问题,内核可能生成它自己的符号的转储,并把它写到指定的文件。可以使用KERN_SYMFILE sysctl获取这个文件的路径名,它提供了对kern.symfile sysctl变量的读访问。 $ sysctl kern.symfile kern.symfile = \mach.sym   KERN_SYMFILE sysctl的内核实现将通过查看一个全局布尔变量检查/mach.sym是否打开。如果它没有打开,内核将把内核符号输出到/mach.sym,并把它标记为打开的。如果通过网络访问根设备,如果/mach.sym是作为一个非常规文件存在的,或者如果它具有大于1的链接计数,那么内核将不会把符号转储到/mach.sym。这个符号文件创建过程是在用户级系统启动期间从/etc/rc中触发的,它使用sysctl命令获取kern.symfile变量的值。 # /etc/rc ... # Create mach symbol file sysctl -n kern.symfile if [ -f /mach.sym ]; then        ln -sf /mach.sym /mach else        ln -sf /mach_kernel /mach fi   可以看到,如果/mach.sym存在,就会创建/mach,作为指向它的符号链接,否则,/mach就是指向/mach_kernel的符号链接。而且,由于仅当/mach对应于运行的内核时它才是有用的,因此在每次引导期间都会删除并重新创建它。 $ ls -l /mach* lrwxr-xr-x 1 root admin 9 Mar 10 16:07 /mach -> /mach.sym -r--r--r-- 1 root admin 598865 Mar 10 16:07 /mach.sym -rw-r--r-- 1 root wheel 4330320 Feb 3 20:51 /mach_kernel "1. 详尽剖析Mac OS X内部工作原理的具体细节。 2. 揭示Mac OS X及其组件的核心体系结构和实现。 3. 以一种面向实现的方法介绍Mac OS X系统。 4. 透彻解释Mac OS X的众多用户级和内核级IPC机制的工作原理,并且提供足够的知识和示例,可以满足各个层次的读者的不同需求。 5. 提供了详细的插图、函数调用图、加注释的代码段和编程示例,并且在书中点缀了各种花絮。"