Kernel

The kernel of iOS is the XNU kernel. To learn about what "kernel" means in general, see the Wikipedia article.

Pre-2.0, it was vulnerable to the Ramdisk Hack and may still be, but iBoot doesn't allow boot-args to be passed anymore. It is mapped to memory at 0x80000000, forcing a 2/2GB address separation, similar to Windows 32-bit model. On older iOS versions the separation was 3/1 (mapping the kernel at 0xC0000000), closer to the Linux model.

Note, that this is NOT like 32-bit OS X, wherein the kernel resides in its own address space, but more like OS X 64-bit, wherein CR3 is shared (albeit an address space larger by several orders of magnitude). See the appropriate section.

ASLR
As of iOS 6, the kernel is subject to ASLR, much akin to Mountain Lion (OS X 10.8). This make exploitation harder as the location of kernel code cannot be known.

On production and development devices, the kernel is always stored as a statically linked cache stored at /System/Library/Caches/com.apple.kernelcaches/kernelcache that is decompressed and run on startup.

Stack
The kernel maintains thread specific stacks by calling kernel_memory_allocate, this allocates stacks in the specified kalloc zone. The bootstrap thread has its own specific static kernel stack, which is specified by _intstack. IRQ and FIQ handlers will also have their own execution stack which is specified by _irqstack.

Boot-Args
Like its OS X counterpart, iOS's XNU accepts command line arguments (though the actual passing of arguments is done by iBoot, which as of late refuses to do so). Arguments may be directed at the kernel proper, or any one of the many KExts (discussed below). The arguments of the kernel are largely the same as those of OS X.

Kexts use boot-args as well, as can be seen when disassembly by calls to PE_parse_boot_argn (usually exported, _PE_parse_boot_argn 8027A8EC on the iOS 6.1.3 kernel, discovered by Haifisch). Finding references (using IDA) reveals hundreds places in the code wherein arguments are parsed in modules, pertaining to Flash, HDMI, and AMFI.

The list of boot-args can be extracted from any kernel dump once the address of _PE_parse_boot_argn is determined (which is usually automatically). A list from iOS 8.4 is shown below:

-b -disable_atm -factory_debug -l -multiq-deep-drain -no-zp -no64exec -novfscache -oldmezname -panic_on_exception_triage -progress -qos-policy-allow -s -vm16k -vnode_cache_defeat -x -zc -zinfop -zp aks_default_class assert bg_preempt boot-uuid colors cpumon_ustackshots_trigger_pct darkwake dart dcc debug diag disable_exc_resource fill hwm_user_cores ifa_debug ifnet_debug imp_interactive_receiver inaddr_nhash initmcl interrupt_accounting io io_throttle_period_tier1 io_throttle_period_tier2 io_throttle_period_tier3 io_throttle_window_tier1 io_throttle_window_tier2 io_throttle_window_tier3 iosched iotrace jcon jtag keepsyms kernel_stack_pages kextlog kmapoff lcks lo_txstart longterm max_cpumon_interval max_cpumon_percentage max_task_pmem maxmem maxoffset mbuf_debug mbuf_pool mcache_flags mleak_sample_factor mseg msgbuf mtxspin multiq_drain_band_limit multiq_drain_depth_limit multiq_drain_urgent_first nbuf ncl net.inet.ip.scopedroute net.inet6.ip6.scopedroute net_affinity net_rtref net_rxpoll network-type panic_on_cs_killed preempt qos_override_mode rd rootdev rte_debug sched sched_decay_penalty sched_decay_usage_age_factor sched_pri_decay_limit sched_use_combined_fgbg_decay serial serverperfmode slto_us socket_debug task_policy_suppression_disable task_wakeups_monitor_interval task_wakeups_monitor_rate task_wakeups_monitor_ustackshots_trigger_pct tbi trace trace_panic trace_typefilter trace_wake unrestrict_coalition_syscalls vm_compression_limit vm_compressor vm_compressor_immediate vm_compressor_threads wfi wqsize zalloc_debug zlog zp-factor zp-scale zrecs zsize
 * 1) perform a full disassembly, isolate decompiled lines (^;) with PE_parse.. and isolate string between quotes, sorted uniquely:
 * 2) morpheus@Zephyr (~)$ jtool -d __TEXT.__text kernel.8.4.dump | grep PE_parse |grep '^; '| cut -d\" -f2 | cut -d\" -f1 | sort -u

Versions
In the beginning iOS had consistently maintained a fairly higher kernel version than the corresponding version of OS X, but over time iOS and OS X "moved nearer" together. Now at the time of writing, OS X Yosemite's XNU is 2782, whereas iOS 8.4 is 2784. This is not surprising, considering that iOS introduced novel features (such as Kernel ASLR, the default freezer, and various security hardening features) which are first incorporated in it, and later made it to OS X. It seems that Apple is planning to gradually unite iOS and OS X kernels over time and with iOS 8 and OS X Yosemite the at least the version numbers are nearer to each other then ever before. The following demonstrates the OS versions at present (via terminal uname -a command):

OS X Yosemite 10.10.4: Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 iOS 8.4:

Darwin Kernel Version 14.0.0: Wed Jun 24 00:50:15 PDT 2015; root:xnu-2784.30.7~30/RELEASE_ARM64_S5L8960X

Note: The RELEASE_ARM_xxxxxxxx file obviously differs on device / CPU and the time varies by a few minutes per device.

Version List
The compilation date for each version will vary slightly between processors. This is due to the fact that compilations are sequential.

Source Code
As XNU is based off of the BSD kernel, it is open source. The source is under a 3-clause BSD License for the original BSD portions with the portions added by Apple under the Apple Public Source License. The versions contained in iOS are not available, instead only versions used in OS X are available. This does not appear to be legal as per &#x00A7;2.3 in the APSL: 2.3    Distribution of Executable Versions. In addition, if You Externally Deploy Covered Code (Original Code and/or Modifications) in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. with Source Code defined in &#x00A7;1.8: 1.8    "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code).

It is worth noting that Apple does not list XNU as being an open source component of iOS. This can be seen by viewing opensource.apple.com and selecting any iOS version. As far as can be told, none of the versions of XNU are available in source version.

There are many other open souce components that iOS uses that are not listed, such as: It does not appear that Apple assumes what you see in the OS X pages are also on iOS as JavaScriptCore, WebCore, among others are listed on both OS X (10.8) and iOS (6.0), albeit different versions.
 * CF (CoreFoundation - Cocoa)
 * SQLite (SQLite - database utility)
 * TimeZoneData (tz database - /usr/share/zoneinfo)
 * curl(?) (libcurl - various HTTP operations)
 * hfs (hfs - HFS driver)
 * launchd (launchd - launch daemon)
 * libxml2(?) (libxml2 - parser for XML plists)
 * xnu (XNU - Kernel)
 * zip (zip - extraction of various files)

It is also worth noting that gdb (GCC debugger) and ld64 are listed as components in iOS 6.0. Why there are present is a mystery as they are not present on unaltered devices, but only through Cydia or Xcode's.

Kernel Extensions
iOS, sadly, does not have kexts floating around the /|file system, but they are indeed present. The kernelcache can be unpacked to show the kernel proper, along with the kexts (all packed in the __PRELINK_TEXT section) and their plists (in the __PRELINK_INFO section).

The Cydia supplied kextstat does not work on iOS. Sadly, the reason is that kextstat relies on, which is a deprecated (and recently removed) API in recent iOS and OS X versions. With that said, the kexts do exist. The alternative, jkextstat, does work on recent iOS versions. jkextstat can cause some confusion as it uses the executable name, similar to how calling   just launches   but with parameters to treat all   files as C++ files.

The following is the output from jkextstat on an iPod touch 4G running iOS 6(?):

Podicum:~ root# ./kextstat 0 __kernel__ 1 kpi.bsd 2 kpi.dsep 3 kpi.iokit 4 kpi.libkern 5 kpi.mach 6 kpi.private 7 kpi.unsupported 8 driver.AppleARMPlatform 9 iokit.IOStorageFamily 10 driver.DiskImages 11 driver.FairPlayIOKit 12 driver.IOSlaveProcessor 13 driver.IOP_s5l8930x_firmware 14 iokit.AppleProfileFamily 15 iokit.IOCryptoAcceleratorFamily 16 driver.AppleMobileFileIntegrity 17 iokit.IONetworkingFamily 18 iokit.IOUserEthernet 19 platform.AppleKernelStorage 20 iokit.IOSurface 21 iokit.IOStreamFamily 22 iokit.IOAudio2Family 23 driver.AppleAC3Passthrough 24 iokit.EncryptedBlockStorage 25 iokit.IOFlashStorage 26 driver.AppleEffaceableStorage 27 driver.AppleKeyStore 28 kext.AppleMatch 29 security.sandbox 30 driver.AppleS5L8930X 31 iokit.IOHIDFamily 32 driver.AppleM68Buttons 33 iokit.IOUSBDeviceFamily 34 iokit.IOSerialFamily 35 driver.AppleOnboardSerial 36 iokit.IOAccessoryManager 37 driver.AppleProfileTimestampAction 38 driver.AppleProfileThreadInfoAction 39 driver.AppleProfileKEventAction 40 driver.AppleProfileRegisterStateAction 41 driver.AppleProfileCallstackAction 42 driver.AppleProfileReadCounterAction 43 driver.AppleARMPL192VIC 44 driver.AppleCDMA 45 driver.IODARTFamily 46 driver.AppleS5L8930XDART 47 iokit.IOSDIOFamily 48 driver.AppleIOPSDIO 49 driver.AppleIOPFMI 50 driver.AppleSamsungSPI 51 driver.AppleSamsungSerial 52 driver.AppleSamsungPKE 53 driver.AppleS5L8920X 54 driver.AppleSamsungI2S 55 driver.AppleEmbeddedUSB 56 driver.AppleS5L8930XUSBPhy 57 iokit.IOUSBFamily 58 driver.AppleUSBEHCI 59 driver.AppleUSBComposite 60 driver.AppleEmbeddedUSBHost 61 driver.AppleUSBOHCI 62 driver.AppleUSBOHCIARM 63 driver.AppleUSBHub 64 driver.AppleUSBEHCIARM <3 4 5 8 55 57 58 60 63> 65 driver.AppleS5L8930XUSB <1 3 4 5 7 8 55 57 58 60 61 62 64> 66 driver.AppleARM7M 67 driver.EmbeddedIOP 68 driver.AppleVXD375 69 driver.AppleD1815PMU 70 iokit.AppleARMIISAudio 71 driver.AppleEmbeddedAudio 72 driver.AppleCS42L59Audio 73 driver.AppleEmbeddedAccelerometer 74 driver.AppleEmbeddedGyro 75 driver.AppleEmbeddedLightSensor 76 iokit.IOAcceleratorFamily 77 IMGSGX535 78 driver.H2H264VideoEncoderDriver 79 driver.AppleJPEGDriver 80 driver.AppleH3CameraInterface 81 driver.AppleM2ScalerCSCDriver 82 iokit.IOMobileGraphicsFamily 83 driver.AppleDisplayPipe 84 driver.AppleCLCD 85 driver.AppleSamsungMIPIDSI 86 driver.ApplePinotLCD 87 driver.AppleSamsungSWI 88 iokit.IODisplayPortFamily 89 driver.AppleRGBOUT 90 driver.AppleTVOut 91 driver.AppleAMC_r2 92 driver.AppleSamsungDPTX 93 driver.AppleSynopsysOTGDevice 94 driver.AppleNANDFTL 95 driver.AppleNANDLegacyFTL 96 AppleFSCompression.AppleFSCompressionTypeZlib 97 IOTextEncryptionFamily 98 driver.AppleBSDKextStarter 99 nke.ppp 100 nke.l2tp 101 nke.pptp 102 iokit.IO80211Family 103 driver.AppleBCMWLANCore 104 driver.AppleBCMWLANBusInterfaceSDIO 105 driver.AppleDiagnosticDataAccessReadOnly 106 driver.LightweightVolumeManager 107 driver.IOFlashNVRAM 108 driver.AppleNANDFirmware 109 driver.AppleImage3NORAccess 110 driver.AppleBluetooth 111 driver.AppleMultitouchSPI 112 driver.AppleUSBMike 113 driver.AppleUSBDeviceMux 114 driver.AppleUSBEthernetDevice

For a specific extension, e.g. SandBox, the full information (including the handy load address) is also accessible:

com.apple.security.sandbox CFBundleVersion 154.7         OSBundleCPUSubtype 9         OSBundleCPUType 12         OSBundleDependencies 6                 7                  5                  3                  28                  1                  4                  16                  2          OSBundleExecutablePath /System/Library/Extensions/Sandbox.kext/Sandbox OSBundleIsInterface OSBundleLoadAddress 2153734144         OSBundleLoadSize 36864         OSBundleLoadTag 29         OSBundleMachOHeaders OSBundlePath /System/Library/Extensions/Sandbox.kext OSBundlePrelinked OSBundleRetainCount 0         OSBundleStarted OSBundleUUID OSBundleWiredSize 36864         OSKernelResource

It's also worth mentioning that, in the above listing, the OSBundleMachOHeaders (base-64 encoded binary headers) leak kernel addresses in iOS 6.0, defeating Kernel ASLR. This has been quickly fixed in iOS 6.0.1, effectively locking down iOS for the foreseeable future, thanks to security researcher mdowd.

Winocm's custom kernel
Winocm uses a custom kernel which the version can be found below. Darwin Kernel Version 13.0.0: Fri Nov 22 18:19:54 CST 2013; root:xnu-2050.48.13~7/DEVELOPMENT_ARM_S5L8930X