Как определить функции ARMv8 во время выполнения на iOS?
Я пытаюсь определить, когда дополнительные возможности ARMv8 cpu доступны в iOS во время выполнения. На настольных компьютерах OS X, таких как i686, x86_64, PPC и PPC64, мы можем использовать sysctl
. См., Например, PR 3108, обнаружение возможностей процессора без SIGILL в MacOS X.
"Возможности процессоров без использования SIGILL" важны, поскольку функции, основанные на SIGILL
, повреждают память на платформах Apple. По крайней мере три проекта, которые я выполнял, имели проблемы с ним, включая Crypto ++ и OpenSSL. Другая проблема заключается в следующем: Отсутствует ли Apple Clang CRC32 для ARMv8/Aarch64 в Xcode 10?, где присутствуют основные функции ARMv8, которые должны присутствовать, кажется, отсутствуют или не поддерживаются.
Я искал эквивалент iOS для настольных компьютеров OS X, но я не могу их найти (см. ниже).
Мы действительно предпочитаем избегать Apple, таких как CommonCrypto. Мы стараемся оставаться агностиком на платформе. Мы не используем CommonCrypto, но я бы подумал о том, чтобы использовать функции Apple, как показано ниже, если нет доступных агностиков (я их создаю):
BOOL CCHasAes();
BOOL CCHasSHA1();
BOOL CCHasSHA2();
Является ли Apple публиковать метод определения функций процессора во время выполнения?
Как определить функции cpu во время выполнения на iOS?
Они могут быть связаны, но я не уверен, что это лучшее, что у нас есть, или если это единственное, что у нас есть, или если есть другие способы приблизиться к нему.
Ниже я ищу функции CRC-32, CRC-32C, AES, PMULL, SHA1 и SHA2. Я не вижу никаких хитов, похожих на то, что я ищу. Apple поддерживает ARMv8 с Xcode 7, поэтому 8.2 поддерживает процессор.
$ 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_ */
Ответы
Ответ 1
Насколько я знаю, Apple собирается удалить поддержку 32-разрядных чипов в этом году. Поскольку Apple A7-процессоры Apple используют ядра ArmV8-A для своих SoCs... поэтому, возможно, вы не можете выбирать их с помощью новых API-интерфейсов, потому что вам нечего выбирать... Apple обычно загадочна в отношении таких вещи и использует автоматическое переключение для определенных функций на мобильных платформах. Однако в принципе каждый iOS 11 SoC будет иметь те же основные аппаратные функции, за исключением количества ядер и управления энергией (что отличается для SoC >= A10 Fusion). Я искал то же самое месяц назад, но, видимо, на iOS вы должны находиться в руках ОС.