BIOS(Basic Input/Output System,基本输入输出系统)在整个系统中的地位是非常重要的,它实现了底层硬件和上层操作系统的桥梁。比如你现在从光盘拷贝一个文件到硬盘,您只需知道“复制、粘贴”的指令就行了,您不必知道它具体是如何从光盘读取,然后如何写入硬盘。对于操作系统来说也只需要向BIOS发出指令即可,而不必知道光盘是如何读,硬盘是如何写的。BIOS构建了操作系统和底层硬件的桥梁。

EC(Embed Controller,嵌入式控制器)是一个16位单片机,它内部本身也有一定容量的Flash来存储EC的代码。EC在系统中的地位绝不次于南北桥,在系统开启的过程中,EC控制着绝大多数重要信号的时序。在笔记本中,EC是一直开着的,无论你是在开机或者是关机状态,除非你把电池和Adapter完全卸除。

在关机状态下,EC一直保持运行,并在等待用户的开机信息。而在开机后,EC更作为键盘控制器,充电指示灯以及风扇等设备的控制,它甚至控制着系统的待机、休眠等状态。

现在的EC有两种架构,即BIOS的FLASH通过X-BUS接到EC,然后EC通过LPC接到南桥,一般这种情况下EC的代码也是放在FLASH中的,也就是和BIOS共用一个FLASH。比较新的架构,EC和FLASH共同接到LPC总线上,一般它只使用EC内部的ROM。至于LPC总线,它是INTEL当初为了取代低速落后的X-BUS而推出的总线标准。

EC上一般都含有键盘控制器,所以也称KBC(Keyboard Controller)。

在系统关机的时候,只有RTC部分和EC部分在运行。RTC部分维持着计算机的时钟和CMOS设置信息,而EC则在等待用户按开机键。在检测到用户按开机键后,EC会通知整个系统把电源打开(这部分在最后详细介绍)。CPU被RESET后,会去读BIOS内一个特定地址内的指令(其实是一个跳转指令,这个地址是由CPU硬件设定的)。

这里开始分两种情况,对于第一种的结构:CPU发出的这个地址通过FSB到北桥,然后通过HUB-LINK到南桥,通过LPC到EC,再通过X-BUS一直到达BIOS。在CPU读到所发出的地址内的指令后,执行它被RESET后的第一个指令。在这个系统中,EC起到了桥接BIOS和南桥(或者说整个系统)的作用。 对于第二种结构:在这地址南桥后,会直接通过LPC到BIOS,不需要EC的桥接。

这里需要说明的是,对于台式机而言,一般是不需要EC的。这里原因有很多:比如台式机本身的ATX电源就具有一定的智能功能,他已经能受操作系统控制来实现待机、休眠的状态;其次由于笔记本的键盘不能直接接到PS/2接口,而必须接到EC之上;还有就是笔记本有更多的小功能,比如充电指示灯、WIFI指示灯、Fn等很多特殊的功能,而且笔记本必须支持电池的冲放电等功能,而智能冲放电则需要EC的支持;另外,笔记本TFT屏幕的开关时序也必须由EC控制。这些原因导致了笔记本使用EC来做内部管理的必要性。

总体来说,EC和BIOS都处于机器的最底层。EC是一个单独的处理器,在开机前和开机过程中对整个系统起着全局的管理。而BIOS是在等EC把内部的物理环境初始化后才开始运行的。

在南桥上还有一个功能块就是电源管理单元(PM,Power Management)。

一般来说,他和EC来共同配合完成。这里包括从开机(power button)键按下后,启动,待机,休眠,关机的全部功能。还包括对背光亮度,声音等的控制等等。

至于现在Intel的Speed Step技术,也有部分功能是透过南桥来实现的(南桥发送SLP、STPCLK(sleep,Stop Clock)来实现睡眠、深睡眠等)。

在台式机上,我们常听到关于集成网卡这个说法。而对于笔记本来说,网卡一般都是集成在主板上的,进入PIII时代以后,就显有无内建网卡的机器了。对于笔记本网卡来说(不考虑PCMCIA的网卡哦),一般有两种接法。

首先我们把网卡分成两个部分。现在的LAN都属于802.3的协议。而这个协议的物理实现却并非那么简单,需要分成两个部分。一部分是MAC控制层(Media Access Controller 媒体接入控制器),作用是根据802.3协议来做运算(采用CSMA/CD算法),另一部分是物理连接层(PHY)作用是根据MAC的算法得出的处理结果,接收和发送数据。

首先我们谈第一种,走PCI总线的网卡。如果这样接的话跟台式机的网卡唯一的区别就是把台式机的PCI网卡直接做到主板上。这颗走PCI的网卡芯片内部整合了MAC和PHY功能。实际使用中,高档一些的笔记本会采用INTEL的网卡,低档一些的就会用REALTLK或者VIA的芯片。当然,INTEL网卡的传输效率确实也比较高。

第二种则是“真正集成”的网卡,MAC层部分被做到了南桥里面,然后需要用一个外围电路(PHY)来配合南桥里的MAC来实现网卡的功能。 南桥内部的网卡MAC输出一组信号线(称为MII总线),连接PHY(上图中的Intel 82562ET),然后引出RX+-和TX+-两对差分线,透过Transformer来控制EMI,然后输出到RJ45接口即刻。这里的Transformer的结构跟USB的共模电感相似,作用也相似。上面的REALTLK8100C的那张图中,红色框内就是Transformer。经过Transformer的信号线必须以最短的距离接到RJ45接口上以减少干扰,所以它离和RJ45的距离是必须被严格控制的。

那么MAC地址是什么呢?MAC地址是区别网络设备的唯一物理标志,理论上,世界上任何一个网络设备的MAC应该都是不同的。 对于走PCI总线的网卡,一般会在网卡上挂一个小小的的E2PROM来存储,里面烧有MAC地址以及一些厂商信息。而对于用PHY来连接的网卡,会把MAC地址信息放在挂在南桥上的E2PROM(因为网卡的MAC控制器在南桥)。而1394和网卡的构建形式差不多,也是由MAC控制器和PHY来构成。其原理和布线准则也和网卡类似。

PCI设备:PCMCIA, Mini PCI

1989年由200多家公司确立了PCMCIA(Personal Computer Memory Card International Association)标准,最初只是用来扩展内存,91年后随着I/O设备扩展需求,多种设备都被做成了PCMCIA接口,PCMCIA成为了笔记本最重要的扩展插槽。PCMCIA的成长史几乎是整个笔记本电脑产业的成长史。那PCMCIA到底是如何实现的呢?

实际上,PCMCIA的实现方法并不复杂,把南桥的PCI总线拉到PCMCIA控制器,然后从PCMCIA控制器就能输出Cardbus,接上标准的PCMCIA接口就可以了。

实际上在设计的时候,CardBus Controller的设计厂商都已经对其开发作好了一整套的外围电路,OEM厂商只需要简单的按标准电路做简单的修改即可(比如一些降低成本的动作)。一般来说,CardBus Controller有TI,RICHO,ENE等几家可以选择。

至于mini PCI则更加简单了,只需把南桥的PCI总线点到点的接到miniPCI的接口上即可。顺便说一句,mini PCI和台式机上的PCI的物理定义是一致的,不同的仅仅是插槽不一致而已。

待续……

Clover中Ivy/Sandy/Haswell机型电源管理检查列表

  • SSDT.aml at EFI/Clover/ACPI/patched
  • config.plist/KernelAndKextPatches/AsusAICPUPM=true (Haswell以前型号)
  • config.plist/KernelAndKextPatches/KernelPm=true (Haswell及以后型号)
  • config.plist/KernelAndKextPatches/KernelLapic=true (用于有Local APIC panic问题的机器)
  • 根据你的CPU找到合适的系统定义,即:SMBIOS (config.plist/SMBIOS)
  • 没有使用老版本AppleACPIPlatform.kext
  • 没有使用NullCPUPowerManagement.kext
  • 处理器对象在DSDT中的Scope (_SB) or Scope (_PR)中定义in DSDT (一般很少在OEM DSDT找不到定义)
  • 校验生成的SSDT注入到DSDT相同的Scope(通常为_PR)

关于Drop OEM

  • SSDT可以借助Clover的Generate PStates与Generate CStates等选项生成,但是DSDT不可以生成,尽管BIOS提供一个
  • 被放置在/EFI/CLOVER/ACPI/patched目录下的SSDTs将被添加到OEM/BIOS提供的SSDTs
  • 被放置在/EFI/CLOVER/ACPI/patched目录下的DSDT将替换OEM/BIOS提供的DSDT

由于SSDTs是追加模式,因此,可能存在冲突。解决方法有两个:

  • 完全忽略OEM/BIOS提供的SSDTs,即:M打开Clover的Acpi/SSDT/Drop OEM
  • 删除部分OEM/BIOS提供的SSDT表,即:打开Clover的Acpi/Drop Tables中的项目,例如:删除DMAR,避免在BIOS中关闭VT-D功能

何时需要使用Drop OEM?

对于一些老机型,例如:Sandy Bridge或更老的机型,通常需要使用Drop OEM,并且使用Generate PStates与Generate CStates来生成可变频SSDT。 但是对于现在的主流机型,如:Broadwell/Haswell/Ivy,通常无需Drop OEM就可以正常工作。

电源管理测试

10.11以后,很多过去可以用的软件不再能用,例如:DCPIManager.app。现在通常使用AppleIntelInfo.kext来测试电源管理是否生效。

下载并编译(至少是Xcode 7.0 Beta)AppleIntelInfo.kext

设置权限与所有者AppleIntelInfo.kext

sudo chown -R root:wheel AppleIntelInfo.kext
sudo chmod -R 744 AppleIntelInfo.kext

加载AppleIntelInfo.kext

sudo kextload/kextutil AppleIntelInfo.kext

卸载AppleIntelInfo.kext

sudo kextunload AppleIntelInfo.kext

查看测试结果

sudo cat /tmp/AppleIntelInfo.dat

config.plist:

<key>KextsToPatch</key>
<array>
<dict>
    <key>Comment</key>
    <string>Boot graphics glitch, (credit lisai9093, cecekpawon)</string>
    <key>Disabled</key>
    <true/>
    <key>Find</key>
    <data>AQAAdRc=</data>
    <key>Name</key>
    <string>IOGraphicsFamily</string>
    <key>Replace</key>
    <data>AQAA6xc=</data>
</dict>
</array>

注:开启CSM或legacy boot (continue to boot UEFI)效果更佳

注:本文只记录安装过程中的重点信息,并非Step by Step风格的安装向导。

BIOS设置

  • “VT-d” 关闭,如果不能关闭则在config.plist设置dart=0
  • “DEP” (data execution prevention) 打开
  • “secure boot “ 关闭
  • “legacy boot” 选UEFI Only或Both
  • “fast boot” 关闭
  • “CSM” 可选
  • “boot from USB” or “boot from external” 打开

USB安装盘准备

格式化U盘

我使用的是GPT,格式化U盘命令(磁盘号通过”diskutil list”查看):

diskutil partitionDisk /dev/disk3 1 GPT HFS+J "install_osx" R

安装Clover

  • 选择 “仅安装UEFI开机版本”,”安装Clover到EFI系统区”将自动被选择
  • 选择 “Bluemac” 开机主题(我喜欢这个)
  • 在Drivers64UEFI中选择”OsxAptioFixDrv-64”

下载HFSPlus.efi,将其放入此U盘的/EFI/CLOVER/drivers64UEFI目录中,删除此目录中的VboxHfs-64.efi

下载config.plist,替换U盘/EFI/CLOVER/目录下的config.plist

安装必要的Kexts

复制以上kexts到U盘/EFI/CLOVER/kexts/10.11目录中

制作安装盘

sudo "/Applications/Install OS X El Capitan.app/Contents/Resources/createinstallmedia" --volume  /Volumes/install_osx --applicationpath "/Applications/Install OS X El Capitan.app" --nointeraction

安装EI Capitan

安装过程和白苹果一样,此处略!安装完成后安装Clover,过程与选项同上,复制U盘中的config.plist及kexts到电脑硬盘的相应位置

安装后系统修复

DSDT/SSDT修复

对于x220机型,有用的是DSDT、SSDT、SSDT-1三个文件。

SSDT借助ssdtPRGen.sh获取,具体细节略。

以下DSDT补丁来源:https://github.com/RehabMan/Laptop-DSDT-Patch

  • DSDT相关补丁

graphics_Rename-PCI0_VID,graphics_HD3K_low,battery_Lenovo-x220,usb_6-series,graphics_PNLF_ivy_sandy,system_ADP1,system_Mutex,system_IRQ,system_SMBUS, system_HPET,system_MCHC,system_IMEI,system_PNOT,system_OSYS_win8,audio_HDEF-layout3

  • SSDT-1相关补丁

graphics_Rename-PCI0_VID

修复WIFI

下载ProBookAtheros.kext,将放入硬盘的/EFI/CLOVER/kexts/10.11目录中。

注:由于x220原装WIFI卡不被黑苹果支持,所以我将其换成了AR9285卡,如果不想换笔记本内置卡,可以买个兼容的外接USB WIFI无线网卡。

修复蓝牙

编辑: IOBluetoothFamiliy.kext/Contents/Plugins/BroadcomBluetoothHostControllerUSBTransport.kext/Contents/Info.plist

查找:

<key>idProduct</key>
    <integer>33292</integer>
<key>idVendor</key>
    <integer>1452</integer> 

替换为:

<key>idProduct</key>
    <integer>8575</integer>
<key>idVendor</key>
    <integer>2652</integer>

修复权限与缓存

修复声卡

删除/S/L/E目录下的AppleHDA,替换为AppleHDA

修复权限与缓存

修复背光

安装IntelBacklight.kext

放在/Library/Extensions或/EFI/CLOVER/kexts/10.11

修复电源管理

安装ACPIBatteryManager.kext

放在/Library/Extensions或/EFI/CLOVER/kexts/10.11

其它

关闭休眠模式

sudo pmset -a hibernatemode 0
if [ -e /private/var/vm/sleepimage ]; then sudo rm /private/var/vm/sleepimage;fi

忽略固件升级

sudo softwareupdate --ignore MacBookProEFIUpdate2.7

注:本文将持续更新

什么是Apple SIP

Apple SIP(System Integrity Protection)机制是OSX 10.11开始启用的一套关键的安全保护技术体系。 SIP技术的整个体系主要分为:

  • 文件系统保护(Filesystem protection)

对于系统文件通过沙盒限制root权限,比如:就算你有root根限,也无法往/usr/bin目录写入。

  • 运行时保护(Runtime protection)

受保护的关键系统进程在运行状态下无法被代码注入,挂调试器调试,以及限制内核调试等

  • 内核扩展签名(Kext signing)

10.10中强制要求签名,要想绕过这个限制,就必需加入启动参数“kext-dev-mode=1”(10.11 DB5开始,”rootless=0”的启动参数也被废除了),这个启动参数在10.11中被废除。另外,10.11官方要求第三方kext必须被安装至/Library/Extensions。

Apple官方如何对SIP保护技术进行配置

  • 进入10.11的安装程序或Recovery HD

使用其中所带的终端进行相关操作。在此环境下,由于特殊启动标志位的存在,整个SIP保护技术处在完全关闭状态。可正常修改受保护文件的权限以及所有者。

  • Apple已经提供了csrutil程序来配置SIP

此程序在正常系统环境下只支持检查当前SIP开关状态,若需要开关或调整SIP状态必须前往Recovery或安装程序中执行。 注意:该工具修改SIP配置的功能仅在部分原生支持NVRAM写入的机子上有效。

csrutil命令行工具使用方法:

  • 完全启用SIP(csr-active-config=0x10)
csrutil enable
  • 也可以添加更多参数实现按需开关各项保护技术
csrutil enable [--without kext|fs|debug|dtrace|nvram] [--no-internal]
  • 禁用SIP(csr-active-config=0x77)
csrutil disable

等效命令:

csrutil enable --without kext --without fs --without debug --without dtrace --without nvram
  • 清除SIP标志位(将csr-active-config项从NVRAM中移除,等同于SIP完全开启):
csrutil clear
  • 检查并报告当前SIP开关详细状态
csrutil status

其它可以控制SIP方法

  • 借助Clover(版本>=3250)实现SIP控制
<key>RtVariables</key>
        <dict>
                <key>CsrActiveConfig</key>
                <string>0x13</string>
                <key>BooterConfig</key>
                <string>0x49</string>
        </dict>
  • 借助第三方应用(例如:SIPUtility.app) 这类应用一般需要在Recovery环境下使用,并且要求原生支持NVRAM写入,尽量避免使用。

  • 直接写入NVRAM

例如:

sudo nvram 7C436110-AB2A-4BBB-A880-FE41995C9F82:csr-active-config=%13%00%00%00

SIP自定义配置及各标志位的含义

举例:csr-active-config=0x13,0x13 = 0b00010011

____ ___1 (bit 0): [kext] 允许加载不受信任的kext(与已被废除的kext-dev-mode=1等效)
____ __1_ (bit 1): [fs] 解锁文件系统限制
____ _1__ (bit 2): [debug] 允许task_for_pid()调用
____ 1___ (bit 3): [n/a] 允许内核调试 (官方的csrutil工具无法设置此位)
___1 ____ (bit 4): [internal] Apple内部保留位(csrutil默认会设置此位,实际不会起作用。设置与否均可)
__1_ ____ (bit 5): [dtrace] 解锁dtrace限制
_1__ ____ (bit 6): [nvram] 解锁NVRAM限制
1___ ____ (bit 7): [n/a] 允许设备配置,用于Recovery/安装环境

更多示例及建议值:

  • Clover(需要修改原版kext但未使用kextpatch),建议仅解锁kext加载和文件系统限制:

csr-active-config=0x13或0x3(csrutil enable –without kext –without fs [–no-internal])

  • Clover(已正确配置kextpatch对原版kext进行修改),建议仅解锁kext加载限制以加载第三方未签名kext: csr-active-config=0x11或0x1 (csrutil enable –without kext [–no-internal])

  • Clover(愿意依赖Kext注入功能+已正确配置kextpatch对原版kext进行修改),可完全开启SIP:

csr-active-config=0x10或0x0 (csrutil enable [–no-internal] 或 curutil clear)

注:部分kext无法通过Clover的kext注入来正常工作,例如AppleHDA Injector,CodecCommander.kext等。

  • 关闭SIP中的所有防护,不推荐:

csr-active-config=0xff 在非必要的情况下,不要把提供的这些保护全部关闭,也尽量避免使用Clover默认注入的0x67参数。

至于系统启动标志位,即Clover的config.plist中BooterConfig的含义:

举例:BooterConfig=0x49, 0x0049 = 0b001001001

_ ____ ___1 (bit 0): RebootOnPanic,遇到内核崩溃自动重启
_ ____ __1_ (bit 1): HiDPI,在启动过程中使用HiDPI模式显示
_ ____ _1__ (bit 2): Black,在启动过程中不显示进度条
_ ____ 1___ (bit 3): CSRActiveConfig,将读取当前生效的SIP控制标志位
_ ___1 ____ (bit 4): CSRConfigMode,仅用于Recovery/安装环境,将允许对SIP进行配置
_ __1_ ____ (bit 5): CSRBoot,仅用于Recovery/安装环境,SIP将完全禁用
_ _1__ ____ (bit 6): BlackBg,在启动过程中使用黑色背景
_ 1___ ____ (bit 7): LoginUI,在启动过程中使用登陆界面作为背景
1 ____ ____ (bit 8): InstallUI

把需要的打开的启动标志位设置为1即可。BooterConfig设置为Clover自有设置,可能需要机器支持原生NVRAM读写方可生效。如无特殊需要建议可以不在config.plist中添加此项,等待Clover的后续更新。

SIP对于kext修改及安装的影响

这方面的影响主要体现在强制kext签名以及文件系统保护2个方面:

  • kext签名保护:由于10.10中可用的kext-dev-mode=1启动参数在10.11中已经废除,请参照上面配置SIP以关闭此项保护。 Clover的kext注入功能可绕过kext签名保护从而强制加载第三方kext,但部分kext使用注入功能可能无法正常工作,例如AppleHDA Injector,CodecCommander.kext等。

  • 文件系统保护:如不考虑安全性需求,也请参照上面配置SIP以关闭此项保护,关闭之后即可对任意系统文件进行修改,包括直接修改”/System/Library/Extensions”下的原版kext。 如希望此项技术保持开启,则”/System/Library/Extensions”目录中的kext受到保护,无法直接进行修改。Apple要求第三方kext必须安装至”/Library/Extensions”,此目录并不在保护列表中,因此可在root权限下自由操作。若有需要对SLE下原版kext进行修改也可通过充分利用Clover Kextpatch/kext Injector等技术实现。