如何在iOS上运行时确定ARMv8function?

我试图确定在运行时iOS上可用的可选ARMv8 cpufunction。 在OS X桌面上,如i686,x86_64,PPC和PPC64,我们可以使用sysctl 。 例如,请参阅Mac 310上的PR 3108,无SIGILL处理器function检测 。

“SIGILL-free处理器function”部分非常重要,因为基于SIGILL的function可以探测Apple平台上的内存损坏情况。 我遵循的至少三个项目都遇到了问题,包括Crypto ++和OpenSSL。 另一部分问题是像Apple Clang在Xcode 10下缺少ARMv8 / Aarch64的CRC32这样的问题吗? ,应该存在的核心ARMv8function似乎缺失或不受支持。

我已经找到了相当于OS X台式机的iOS,但我找不到它们(见下文)。

我们真的更喜欢避免像CommonCrypto这样的Apple框架。 我们努力保持与平台无关。 我们不使用CommonCrypto,但是我会考虑使用下面的Apple函数,如果没有任何不可知的(我正在编写它们):

 BOOL CCHasAes(); BOOL CCHasSHA1(); BOOL CCHasSHA2(); 

Apple是否发布了一种在运行时确定cpufunction的方法?

我们如何在iOS上确定运行时的cpufunction?


这些可能是相关的,但我不确定这是否是我们拥有的最好的,或者这是我们唯一拥有的,或者是否有其他方法可以解决它。

  • 在iOS9中使用“hw.machine”标志调用“sysctlbyname(…)” 。
  • 如何在iOS上获取设备制作和型号?

下面我正在寻找CRC-32,CRC-32C,AES,PMULL,SHA1和SHA2function。 我没有看到任何类似于我正在寻找的点击。 Apple自Xcode 7起支持ARMv8,因此8.2支持CPU。

 $ grep -IR CTL_ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk | \ sed 's|/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk/usr/include|...|g' .../c++/4.2.1/bits/c++config.h:#define _GLIBCXX_HAVE_SYS_IOCTL_H 1 .../netinet/in.h:#define IPCTL_FORWARDING 1 /* act as router */ .../netinet/in.h:#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ .../netinet/in.h:#define IPCTL_DEFTTL 3 /* default TTL */ .../netinet/in.h:#define IPCTL_DEFMTU 4 /* default MTU */ .../netinet/in.h:#define IPCTL_RTEXPIRE 5 /* cloned route expiration time */ .../netinet/in.h:#define IPCTL_RTMINEXPIRE 6 /* min value for expiration time */ .../netinet/in.h:#define IPCTL_RTMAXCACHE 7 /* trigger level for dynamic expire */ .../netinet/in.h:#define IPCTL_SOURCEROUTE 8 /* may perform source routes */ .../netinet/in.h:#define IPCTL_DIRECTEDBROADCAST 9 /* may re-broadcast received packets */ .../netinet/in.h:#define IPCTL_INTRQMAXLEN 10 /* max length of netisr queue */ .../netinet/in.h:#define IPCTL_INTRQDROPS 11 /* number of netisr q drops */ .../netinet/in.h:#define IPCTL_STATS 12 /* ipstat structure */ .../netinet/in.h:#define IPCTL_ACCEPTSOURCEROUTE 13 /* may accept source routed packets */ .../netinet/in.h:#define IPCTL_FASTFORWARDING 14 /* use fast IP forwarding code */ .../netinet/in.h:#define IPCTL_KEEPFAITH 15 /* deprecated */ .../netinet/in.h:#define IPCTL_GIF_TTL 16 /* default TTL for gif encap packet */ .../netinet/in.h:#define IPCTL_MAXID 17 .../netinet6/in6.h:#define IPV6CTL_FORWARDING 1 /* act as router */ .../netinet6/in6.h:#define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ .../netinet6/in6.h:#define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */ .../netinet6/in6.h:#define IPV6CTL_DEFMTU 4 /* default MTU */ .../netinet6/in6.h:#define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */ .../netinet6/in6.h:#define IPV6CTL_STATS 6 /* stats */ .../netinet6/in6.h:#define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */ .../netinet6/in6.h:#define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */ .../netinet6/in6.h:#define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */ .../netinet6/in6.h:#define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */ .../netinet6/in6.h:#define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */ .../netinet6/in6.h:#define IPV6CTL_ACCEPT_RTADV 12 .../netinet6/in6.h:#define IPV6CTL_KEEPFAITH 13 /* deprecated */ .../netinet6/in6.h:#define IPV6CTL_LOG_INTERVAL 14 .../netinet6/in6.h:#define IPV6CTL_HDRNESTLIMIT 15 .../netinet6/in6.h:#define IPV6CTL_DAD_COUNT 16 .../netinet6/in6.h:#define IPV6CTL_AUTO_FLOWLABEL 17 .../netinet6/in6.h:#define IPV6CTL_DEFMCASTHLIM 18 .../netinet6/in6.h:#define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */ .../netinet6/in6.h:#define IPV6CTL_KAME_VERSION 20 .../netinet6/in6.h:#define IPV6CTL_USE_DEPRECATED 21 /* use deprec addr (RFC2462 5.5.4) */ .../netinet6/in6.h:#define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */ .../netinet6/in6.h:#define IPV6CTL_MAPPED_ADDR 23 .../netinet6/in6.h:#define IPV6CTL_V6ONLY 24 .../netinet6/in6.h:#define IPV6CTL_RTEXPIRE 25 /* cloned route expiration time */ .../netinet6/in6.h:#define IPV6CTL_RTMINEXPIRE 26 /* min value for expiration time */ .../netinet6/in6.h:#define IPV6CTL_RTMAXCACHE 27 /* trigger level for dynamic expire */ .../netinet6/in6.h:#define IPV6CTL_USETEMPADDR 32 /* use temporary addresses [RFC 4941] */ .../netinet6/in6.h:#define IPV6CTL_TEMPPLTIME 33 /* preferred lifetime for tmpaddrs */ .../netinet6/in6.h:#define IPV6CTL_TEMPVLTIME 34 /* valid lifetime for tmpaddrs */ .../netinet6/in6.h:#define IPV6CTL_AUTO_LINKLOCAL 35 /* automatic link-local addr assign */ .../netinet6/in6.h:#define IPV6CTL_RIP6STATS 36 /* raw_ip6 stats */ .../netinet6/in6.h:#define IPV6CTL_PREFER_TEMPADDR 37 /* prefer temporary addr as src */ .../netinet6/in6.h:#define IPV6CTL_ADDRCTLPOLICY 38 /* get/set address selection policy */ .../netinet6/in6.h:#define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */ .../netinet6/in6.h:#define IPV6CTL_MAXFRAGS 41 /* max fragments */ .../netinet6/in6.h:#define IPV6CTL_MCAST_PMTU 44 /* enable pMTU discovery for mcast? */ .../netinet6/in6.h:#define IPV6CTL_NEIGHBORGCTHRESH 46 .../netinet6/in6.h:#define IPV6CTL_MAXIFPREFIXES 47 .../netinet6/in6.h:#define IPV6CTL_MAXIFDEFROUTERS 48 .../netinet6/in6.h:#define IPV6CTL_MAXDYNROUTES 49 .../netinet6/in6.h:#define ICMPV6CTL_ND6_ONLINKNSRFC4861 50 .../netinet6/in6.h:/* New entries should be added here from current IPV6CTL_MAXID value. */ .../netinet6/in6.h:#define IPV6CTL_MAXID 51 .../sys/ioctl.h:#ifndef _SYS_IOCTL_H_ .../sys/ioctl.h:#define _SYS_IOCTL_H_ .../sys/ioctl.h:#endif /* !_SYS_IOCTL_H_ */ .../sys/ioctl.h: * Keep outside _SYS_IOCTL_H_ .../sys/ioctl.h:#endif /* !_SYS_IOCTL_H_ */ .../sys/mount.h: * Sysctl CTL_VFS definitions. .../sys/mount.h: int vc_vers; /* should be VFSIDCTL_VERS1 (below) */ .../sys/mount.h:#define VFS_CTL_VERS1 0x01 .../sys/mount.h:#define VFS_CTL_STATFS 0x00010001 /* statfs */ .../sys/mount.h:#define VFS_CTL_UMOUNT 0x00010002 /* unmount */ .../sys/mount.h:#define VFS_CTL_QUERY 0x00010003 /* anything wrong? (vfsquery) */ .../sys/mount.h:#define VFS_CTL_NEWADDR 0x00010004 /* reconnect to new address */ .../sys/mount.h:#define VFS_CTL_TIMEO 0x00010005 /* set timeout for vfs notification */ .../sys/mount.h:#define VFS_CTL_NOLOCKS 0x00010006 /* disable file locking */ .../sys/mount.h:#define VFS_CTL_SADDR 0x00010007 /* get server address */ .../sys/mount.h:#define VFS_CTL_DISC 0x00010008 /* server disconnected */ .../sys/mount.h:#define VFS_CTL_SERVERINFO 0x00010009 /* information about fs server */ .../sys/mount.h:#define VFS_CTL_NSTATUS 0x0001000A /* netfs mount status */ .../sys/mount.h: * NetFS mount status - returned by VFS_CTL_NSTATUS .../sys/socket.h: * Definitions for network related sysctl, CTL_NET. .../sys/sysctl.h:#ifndef _SYS_SYSCTL_H_ .../sys/sysctl.h:#define _SYS_SYSCTL_H_ .../sys/sysctl.h:#define CTL_MAXNAME 12 /* largest number of components supported */ .../sys/sysctl.h: * SYSCTL_OUT(rey, local buffer, length) .../sys/sysctl.h: * eg SYSCTL_INT(_parent, OID_AUTO, name, CTLFLAG_RW, &variable, 0, ""); .../sys/sysctl.h:#define SYSCTL_DEF_ENABLED .../sys/sysctl.h:#ifdef SYSCTL_DEF_ENABLED .../sys/sysctl.h:#define CTL_UNSPEC 0 /* unused */ .../sys/sysctl.h:#define CTL_KERN 1 /* "high kernel": proc, limits */ .../sys/sysctl.h:#define CTL_VM 2 /* virtual memory */ .../sys/sysctl.h:#define CTL_VFS 3 /* file system, mount type is next */ .../sys/sysctl.h:#define CTL_NET 4 /* network, see socket.h */ .../sys/sysctl.h:#define CTL_DEBUG 5 /* debugging parameters */ .../sys/sysctl.h:#define CTL_HW 6 /* generic cpu/io */ .../sys/sysctl.h:#define CTL_MACHDEP 7 /* machine dependent */ .../sys/sysctl.h:#define CTL_USER 8 /* user-level */ .../sys/sysctl.h:#define CTL_MAXID 9 /* number of valid top-level ids */ .../sys/sysctl.h:#define CTL_NAMES { \ .../sys/sysctl.h: * CTL_KERN identifiers .../sys/sysctl.h: * Don't add any more sysctls like this. Instead, use the SYSCTL_*() macros .../sys/sysctl.h:#define CTL_KERN_NAMES { \ .../sys/sysctl.h: * CTL_VFS identifiers .../sys/sysctl.h:#define CTL_VFS_NAMES { \ .../sys/sysctl.h: * CTL_VM identifiers .../sys/sysctl.h:#define CTL_VM_NAMES { \ .../sys/sysctl.h: * CTL_HW identifiers .../sys/sysctl.h:#define CTL_HW_NAMES { \ .../sys/sysctl.h: * CTL_USER definitions .../sys/sysctl.h:#define CTL_USER_NAMES { \ .../sys/sysctl.h: * CTL_DEBUG definitions .../sys/sysctl.h:#define CTL_DEBUG_NAME 0 /* string: variable name */ .../sys/sysctl.h:#define CTL_DEBUG_VALUE 1 /* int: variable value */ .../sys/sysctl.h:#define CTL_DEBUG_MAXID 20 .../sys/sysctl.h:#if (CTL_MAXID != 9) || (KERN_MAXID != 72) || (VM_MAXID != 6) || (HW_MAXID != 26) || (USER_MAXID != 21) || (CTL_DEBUG_MAXID != 20) .../sys/sysctl.h:#error Use the SYSCTL_*() macros and OID_AUTO instead! .../sys/sysctl.h:#endif /* SYSCTL_DEF_ENABLED */ .../sys/sysctl.h:#endif /* !_SYS_SYSCTL_H_ */ .../sys/termios.h:#if !defined(_SYS_IOCTL_COMPAT_H_) || __DARWIN_UNIX03 .../sys/termios.h:#endif /* !_SYS_IOCTL_COMPAT_H_ */ 

据我所知,Apple今年将取消对32位芯片的支持。 由于苹果A7处理器Apple使用ArmV8-A内核作为其SoC …所以也许你不能用新的API选择它们因为你没有什么可选择的……苹果通常对这类东西很神秘并且使用自动切换移动平台上的function。 然而, 基本上每个iOS 11 SoC都具有相同的基本硬件function,除了核心数和能量管理(SoC> = A10 Fusion不同)。 我在一个月前搜索同样的东西,但显然在iOS上你必须掌握在操作系统中。