Introduction (for noobs)This tutorial is divided into three parts: Introduction, GFX, and SFX...
What's that?I'm quite sure that EFI Emulation (PC EFI) has changed the whole OSx86 scene. It took the whole scene into a whole new level, now, we can have a PC running Mac OS X with stock kernel and kexts. And yet, the diverse combinations of components and configurations that happen to be the case in the PC world has lead to the creation of numerous fixes and howtos for graphics, audio, usb, ethernet, and many others.
How do these fixes work?Almost all of them are kernel extensions (.kext) that are put in /System/Library/Extensions/.
Mac OS is using something called "Device Tree". This is a map used to guide the kernel load the right driver for each device. These kexts "plug" necessary data into the Device Tree during boot.
NVinject, Titan, and Nitat merely detect your graphics card model and plugs the right data into that map.
ALCinject does the same thing for audio.
This class of kexts are commonly called
injectors.
PS: Injectors merely add "guiding data" into the device tree; Mac OS still has to have the appropriate kernel extensions (drivers) for every device. That means for any device X, even with the right data in the device tree, if no drivers are present, the device won't work.
PC EFI "Pluggable Strings"Currently, PC EFI v8.0 supports what is called "pluggable strings". This can be used to add or plug data (properties) into the device tree during boot using an arbitrary "string" provided by the user.
The "string" is a very long number inserted into the file "
/Library/Preferences/SystemConfiguration/com.apple.Boot.plist"
Example string:a20300000100000001000000960300001400000002010c00d041030a010000000101060000010101060000007fff040014000000400032002c006e0061006d00650000001100000073656e736f722d706172656e7436000000400032002c00680077006300740072006c002d0070006100720061006d0073002d00760065007200730069006f006e00000008000000000000021c0000006400650076006900630065005f0074007900700065000000100000004e5644412c4765466f7263650e0000006e0061006d00650000000f0000004e5644412c506172656e7422000000400030002c006400650076006900630065005f00740079007000650000000b000000646973706c6179100000006d006f00640065006c0000001a0000004e5649444941204765466f726365203736303020475322000000400031002c006400650076006900630065005f00740079007000650000000b000000646973706c617912000000400032002c007200650067000000080000000000000222000000400032002c006400650076006900630065005f0074007900700065000000120000004e5644412c6770752d64696f646520000000400032002c0063006f006d00700061007400690062006c0065000000160000004e5644412c73656e736f722d706172656e7422000000400032002c002300730069007a0065002d00630065006c006c0073000000080000000000000020000000400031002c0063006f006d00700061007400690062006c00650000000e0000004e5644412c4e564d616314000000400030002c006e0061006d0065000000120000004e5644412c446973706c61792d413a000000400032002c0068007700730065006e0073006f0072002d0070006100720061006d0073002d00760065007200730069006f006e000000080000000000000226000000400032002c0023006100640072006500730073002d00630065006c006c0073000000080000000000000114000000400031002c006e0061006d0065000000120000004e5644412c446973706c61792d4220000000400030002c0063006f006d00700061007400690062006c00650000000e0000004e5644412c4e564d61631e00000072006f006d002d007200650076006900730069006f006e0000000800000033303232100000004e00560043004100500000001800000004000000000003000c00000000000007000000000e0000004e00560050004d0000002000000001000000000000000000000000000000000000000000000000000000
Initially, that file looks something like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Kernel</key>
<string>mach_kernel</string>
<key>Kernel Flags</key>
<string></string>
</dict>
</plist>
You add the "string" by adding a new key called "device-properties" as shown in the following example:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Kernel</key>
<string>mach_kernel</string>
<key>Kernel Flags</key>
<string></string>
<key>device-properties</key>
<string>c50400000100000002000000230100000700000002010c00d0...</string>
</dict>
</plist>
NOTE: You can't edit the file (com.apple.Boot.plist) while its in the path "/Library/Preferences/SystemConfiguration/". You will have to copy it to your desktop, modify it, then move it back replacing the old one.
But why use "pluggable strings" anyway? (more critique needed)Current graphics injectors don't support all cards. For instance, nVidia's 8'th generation cards aren't supported by all injectors. This is so because initially, mac os didn't have drivers for these cards. But now, the 10.5.2 update has the drivers for these cards. Still, not all injectors support them.
Now, there are two options:
1- Wait for new versions of these injectors (bad idea).
2- Do what these injectors do ourselves using "pluggable strings"
The second approach has some advantages:
1- No need to wait.
2- Get rid of additional 3rd part kexts.
3- Get a more real-mac-like PC!
Ok, graphics done, what about audio?As i said, ALCinject is used to modify the device tree for supporting ALCxxx audio cards (AZALIA). Using the same concept as above, we simply get rid of that kext and add the appropriate data to the device tree ourselves.
I read somewhere that the Ethernet is just another candidateWhy not? Maybe!
NOTE: The "String" we are talking about is also called HEX string, and may be downloaded as a hex file (*.hex)
SEE NEXT...