17

我正在尝试确定 iOS 运行时何时可以使用可选的 ARMv8 cpu 功能。在 OS X 桌面上,例如 i686、x86_64、PPC 和 PPC64,我们可以使用sysctl. 例如,请参阅PR 3108,MacOS X 上的无 SIGILL 处理器功能检测

无 SIGILL 处理器功能”部分很重要,因为SIGILL基于 SIGILL 的功能会探测 Apple 平台上的损坏内存。我关注的至少三个项目都遇到了问题,包括 Crypto++ 和 OpenSSL。问题的另一部分是诸如Apple Clang 在 Xcode 10 下是否缺少 ARMv8/Aarch64 的 CRC32 之类的问题?,其中应该存在的核心 ARMv8 功能似乎缺失或不受支持。

我一直在寻找与 OS X 桌面等效的 iOS,但我找不到它们(见下文)。

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

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

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

我们如何在 iOS 运行时确定 cpu 特性?


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


下面我正在寻找 CRC-32、CRC-32C、AES、PMULL、SHA1 和 SHA2 功能。我没有看到任何类似于我正在寻找的命中。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: * e.g. 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_ */
4

1 回答 1

3

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

于 2017-08-21T16:29:06.800 回答